$_POST不起作用。“注意:未定义的索引:用户名...”[复制]

$_POST not working. "Notice: Undefined index: username..." [duplicate]

提问人:blacblu 提问时间:1/2/2013 最后编辑:Communityblacblu 更新时间:5/15/2014 访问量:110719

问:

这个问题在这里已经有答案了:
10年前关闭。

可能的重复项:
PHP:“注意:未
定义的变量”和“注意:未定义的索引”

所以,我目前正在学习 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>

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

php http-post 未定义索引

评论

4赞 Michael Berkowski 1/2/2013
似乎您更有可能收到未定义的索引通知,因为此表单是作为 POST 发送的。$_GET['password']
2赞 Michael Berkowski 1/2/2013
在继续此项目之前,请先阅读有关 SQL 注入和预准备语句的使用的信息。旧函数将在下一个主要的 PHP 版本中被弃用,建议您切换到更新的 API,如 PDO 或 MySQLi。mysql_*()
1赞 Josh Brody 1/2/2013
pssstt:在逻辑 (index.php) 文件的顶部,将以下内容放入其中:var_dump($_POST);这将允许您查看您从一页传递到另一页的内容。
0赞 1/2/2013
对 () 执行var_dump。请发布结果 xD$_POSTvar_dump($_POST)
1赞 1/2/2013
另外,我希望这只是一个错别字。您真的不应该通过 URL 查询传递密码。$_GET['password']

答:

3赞 silent_coder14 1/2/2013 #1

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

$username = "";

if(isset($_POST['username'])){
    $username = $_POST['username'];
}

"SELECT password FROM users WHERE username='".$username."'"
3赞 ahmetunal 1/2/2013 #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 注入

8赞 Josh Brody 1/2/2013 #3

未定义的索引意味着在 $_POST 数组中的某个位置,没有键用户名的索引(键)。

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

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

$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

评论

1赞 blacblu 1/2/2013
我在var_dump上得到“NULL”,我知道页面之间没有传递任何内容。问题是我无法弄清楚为什么会这样,因为这是我一直在做的事情,并且到目前为止一直都在工作。