【问题标题】:if(isset($_POST['submit'])) doesn't workif(isset($_POST['submit'])) 不起作用
【发布时间】:2016-04-14 03:49:47
【问题描述】:

我知道这里有很多具有相同标题和问题的问题,但我检查了我的所有语法,我真的不知道为什么这不再起作用(前一段时间,它确实起作用了)。

<?php
include_once("../../database/db_connect.php");
include '../../chromephp-master/ChromePhp.php';
date_default_timezone_set('Europe/Amsterdam');

session_start();

ChromePhp::log('Start...');

if(!isset($_SESSION['username']) && !isset($_SESSION['password'])) {

    ChromePhp::log('Nothing in the SESSION.');

    if(isset($_POST['submit'])){
        ChromePhp::log('Lets have a look at the data...');
        (...)
        ChromePhp::log('Login successful!');

        header('Location: news.php');
    } else {
        ChromePhp::log('Empty form.');
    }

} else {
    header('Location: news.php');
}
?>

我的表格如下:

<form method="post" action="site/users/login" >
    <input type="text" name="username" value="Gebruikersnaam" /><br /><br />
    <input type="password" name="pwrd" value="Wachtwoord" /><br /><br />
    <input type="submit" name="submit" value="&nbsp;Log in&nbsp;" />
</form>

表单与 PHP 代码在同一页面上;我将操作指向“站点/用户/登录”,因为在 HTML 页面的头部,我设置了&lt;base href="../../"&gt;

当我提交表单时,页面重新加载并且日志显示“开始...”,然后显示“会话中没有任何内容”。最后是“空表单”。

我做错了什么?感谢所有帮助!

编辑:这是我的 htaccess 文件的内容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

【问题讨论】:

  • 尝试在提交按钮的值中不包含&amp;nbsp;。您不应该将 html 实体放在 value 属性中。如果需要,请用纯空格替换它们。
  • 从你所说的'日志说“开始......”,然后“会话中没有任何内容。”'看来你的代码甚至没有到达“isset($_POST [' submit'])" 语句,您确定您没有登录或密码数据的会话吗?您可以使用 var_dump($_SESSION); 进行验证
  • @ezzarghili 确实如此,因为它说“空表单”,这是if 语句的else 部分(输出“空表单”)。它只是失败了,仅此而已(为什么我不知道)。
  • @RayoVerweij 在输入任何if 语句之前先执行var_dump($_POST);,它包含什么?
  • 你试过不同的浏览器吗?

标签: php html forms session post


【解决方案1】:

我认为它对您有用,因为您已登录($_SESSION['username']$_SESSION['password'] 已填写)。

所以,使用来自$_POST 的数据来登录用户($_POST['username']$_POST['pwrd'])。

【讨论】:

  • 但是为什么没有设置$_POST["submit"]?这就是问题所在。
  • @trincot,哦,是的。所以它可能由 3 个原因发生: 1. 路线错误。有些东西通过 POST 得到了这个请求,然后重定向到这里; 2. 某些东西窃取了 POST 数据(可能是以前的脚本或框架); 3. 使用服务器设置限制 POST 数据。
【解决方案2】:

发布的数据未到达您的 PHP 页面的可能原因有多种。

可能是 .htaccess 文件具有负责此效果的规则。但是问题的内容发表后,就发现不是这样的。

另一个可能是脚本将重定向发送到(最终)同一页面,从而丢失了发布的数据。一旦您在 cmets 中提到您注意到浏览器在提交后立即重新加载页面,很明显这是要寻找的候选原因。

重定向通常使用这种代码完成:

header("location: some-URL");

...当然,当参数包含自引用时,如下所示:

header('Location: '.$_SERVER['PHP_SELF']);

您发布的代码没有包含这样的声明,至少没有解释行为,但有一些包含的脚本:

  • ../../database/db_connect.php
  • ../../chromephp-master/ChromePhp.php

还有一些点...,我们不知道会发生什么(包括也可能在那里)。

如果其中任何部分执行此类重定向,则可能是问题的原因。我们可以忽略 ChromePhp,它是一个公开可用的库,不会做这些事情。

因此,至少应扫描 db_connect.php 以及所有其他包含的文件(直接或通过其他包含的文件),以查找重定向代码。

如果您发现此类重定向,请检查保留该代码是否合理——因为并非所有重定向都是错误的。但当然应该分析自我重定向:知道任何发布的数据都会因此被忽略,它们真的有必要吗?

所以用更合适的代码替换引起header()的语句,你的问题应该得到解决。

附带说明:最好不要将 HTML 实体放在 HTML 元素的 value 属性中,就像您在此处所做的那样:

 <input type="submit" name="submit" value="&nbsp;Log in&nbsp;" />

如果需要间距,输入纯空格即可:

 <input type="submit" name="submit" value=" Log in " />

【讨论】:

    【解决方案3】:

    您在“站点/用户/登录”之后忘记了“.php”。

    我已经在更简单的版本中尝试过您的代码并且成功了。代码如下:

    <?php
        if( isset($_POST['submit']) ){
            echo $_POST['submit'];
        }
    ?>
    
    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <base href="../../">
    </head>
    <body>
        <form method="post" action="algorithm/debug_login.php" >
            <input type="text" name="username" value="Gebruikersnaam" /><br /><br />
            <input type="password" name="pwrd" value="Wachtwoord" /><br /><br />
            <input type="submit" name="submit" value="&nbsp;Log in&nbsp;" />
        </form>
    </body>
    </html>
    

    【讨论】:

    • 他是说脚本运行,所以我猜不是这样。
    • 它也可以指向一个文件夹,其中 index-file 是一个 .php 文件。或者它可以用 htaccess 改变。
    • 确实是用 .htaccess 文件改变的。使用action="&lt;?php echo $_SERVER['PHP_SELF'];?&gt;" 也不会改变任何东西。
    猜你喜欢
    • 2014-07-04
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多