【问题标题】:$_POST not working. "Notice: Undefined index: username..." [duplicate]$_POST 不工作。 “注意:未定义的索引:用户名......” [重复]
【发布时间】:2012-12-16 10:58:38
【问题描述】:

可能重复:
PHP: “Notice: Undefined variable” and “Notice: Undefined index”

所以,我目前正在学习 PHP,并且正在阅读一本关于密码的 md5 函数的书,所以我决定试一试,看看效果如何。我还决定使用 POST 方法而不是 GET,因为我看到人们说它更安全,并且不会让变量出现在 URL 上。

对于我的测试项目,我制作了一个非常简单的表格,如下所示:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <form action="dologin" method="POST">
            <table border="0">
                <tbody>
                    <tr>
                        <td>Username:</td>
                        <td><input type="text" name="username"></td>
                    </tr>
                    <tr>
                        <td>Password:</td>
                        <td><input type="password" name="password"></td>
                    </tr>
                </tbody>
            </table>
            <input type="submit" value="Login">
        </form>
    </body>
</html>

问题是,当我在两个字段中输入值并单击“登录”时,我在另一个 PHP 文件中得到以下输出。

Notice: Undefined index: username in C:\xampp\htdocs\md5\home\dologin\index.php on line 11
Username non existent

下面是“/dologin/index.php”文件的代码

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
            mysql_connect("localhost", "root") or die(mysql_error());
            mysql_select_db("test") or die(mysql_error());
            $query = "SELECT password FROM users WHERE username='".$_POST['username']."'";
            $result = mysql_query($query);
            $row = mysql_num_rows($result);
            if(isset($row)){
                $password = (mysql_result($result,$row - 1));
                $enteredpassword = md5("w@#$@#".$_GET['password']."^#3f%#^");
                if($password == $enteredpassword){
                    if(!isset($_COOKIE['PHPSESSID'])){
                        session_start();
                    }
                    $_SERVER['LOGIN_STATUS'] = true;
                } else {
                    die("Access denied");
                }    
            } else {
                die("Username non existent");
            }

        ?>
    </body>
</html>

非常感谢您对我的问题的任何帮助,感谢您的阅读。

【问题讨论】:

  • 您似乎更有可能在$_GET['password'] 上收到未定义的索引通知,因为此表单是作为 POST 发送的。
  • 在继续这个项目之前,start reading about SQL injection 并使用准备好的语句。旧的 mysql_*() 函数将在下一个主要 PHP 版本中弃用,建议您切换到更新的 API,如 PDO 或 MySQLi。
  • pssstt:在您的逻辑 (index.php) 文件的顶部,将其放入:var_dump($_POST);这将允许您查看您在页面之间传递的内容。
  • $_POST (var_dump($_POST)) 上做一个 var_dump。请发布结果xD
  • 另外,我希望$_GET['password'] 只是一个错字。你真的不应该通过 URL 查询来传递密码。

标签: php http-post undefined-index


【解决方案1】:

未定义的索引 意味着在 $_POST 数组的某处,没有键 username 的索引(键)。

您应该将发布的值设置为变量以获得更简洁的解决方案,这是一个养成的好习惯。

如果我遇到类似的错误,我会这样做:

$username = $_POST['username']; // you should really do some more logic to see if it's set first
echo $username;

如果用户名没有出现,那就意味着我在某个地方搞砸了。你也可以,

var_dump($_POST);

查看您发布的内容。就调试而言,var_dump 非常有用。看看吧:var_dump

【讨论】:

  • 我在 var_dump 上得到“NULL”,我知道页面之间没有传递任何内容。问题是我不知道为什么会这样,因为这是我一直在做的事情,而且到目前为止一直都是这样。
【解决方案2】:

首先,

确保有帖子

if(isset($_POST['username'])) { 
    // check if the username has been set
}

其次,也是最重要的,清理数据,这意味着

$query = "SELECT password FROM users WHERE username='".$_POST['username']."'";

非常危险,改为使用

$query = "SELECT password FROM users WHERE username='".mysql_real_escape_string($_POST['username'])."'";

请研究主题sql injection

【讨论】:

    【解决方案3】:

    您应该检查POST['username'] 是否已定义。在上面使用这个:

    $username = "";
    
    if(isset($_POST['username'])){
        $username = $_POST['username'];
    }
    
    "SELECT password FROM users WHERE username='".$username."'"
    

    【讨论】:

      猜你喜欢
      • 2018-03-17
      • 2020-09-28
      • 2016-02-25
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2016-04-28
      相关资源
      最近更新 更多