未定义的索引,包含 $_POST

2022-08-30 10:43:48

我正在尝试重新学习一些PHP基础知识来制作简单的登录脚本,但是我得到了一个我以前没有收到的错误(我在一年多前制作了相同的脚本,从来没有这个错误。我尽可能地简化了代码以进行测试,以查看哪个区域有问题,这就是问题所在:

<?php
$user = $_POST["username"];
if($user != null)
{
    echo $user;
    echo " is your username";
}
else
{
    echo "no username supplied";
}
?>

现在,当我向脚本发送变量时,此代码工作正常,但是当没有提供变量时,它会吐出错误。从理论上讲,这很好,因为如果没有提供用户名/通行证,那么预计会出现错误。在将代码发送到脚本之前,我将检查以确保这一点,但是我担心空白字符串可能会以某种方式泄漏并吐出一些未知的错误。这是我得到的错误:

( ! ) Notice: Undefined index: username in C:\wamp\www\verify_login.php on line 2

Call Stack

    Time    Memory  Function    Location
1   0.0003  668576  {main}( )   ..\verify_login.php:0

未提供用户名

正如你所看到的,代码寄存器没有提供变量,但它给出了错误,我假设这意味着没有找到一个变量,如果一个是预期的或类似的东西。有人可以帮我澄清一下吗?


答案 1

在 PHP 中,从未设置过的变量或数组元素与值为 ;尝试访问此类未设置值是运行时错误。null

这就是你遇到的:数组在键上没有任何元素,所以解释器在到达空性测试之前中止你的程序。$_POST"username"

幸运的是,您可以测试变量或数组元素的存在,而无需实际尝试访问它;这就是特殊运算符的作用:isset

if (isset($_POST["username"]))
{
  $user = $_POST["username"];
  echo $user;
  echo " is your username";
} 
else 
{
  $user = null;
  echo "no username supplied";
}

这看起来会以与您的代码完全相同的方式爆炸,当PHP尝试获取值以作为参数传递给函数时。但是,它根本不是一个真正的函数,而是在评估阶段之前识别的特殊语法,因此PHP解释器检查值是否存在,而无需实际尝试检索它。$_POST["username"]isset()isset()

还值得一提的是,随着运行时错误的发生,缺少的数组元素被视为次要元素(分配级别)。如果更改级别以便忽略通知,则原始代码将实际按所写方式工作,尝试的数组访问将返回 。但这被认为是不好的做法,特别是对于生产代码。E_NOTICEerror_reportingnull

附注:PHP做字符串插值,所以块中的语句可以合并为一个:echoif

echo "$user is your username";

答案 2

用:

if (isset($_POST['user'])) {
   //do something
}

但您可能应该使用一些更合适的验证。尝试一个简单的正则表达式或来自Zend Framework或Symfony的坚如磐石的实现。

http://framework.zend.com/manual/en/zend.validate.introduction.html

http://symfony.com/doc/current/book/validation.html

甚至是内置的过滤器扩展:

http://php.net/manual/en/function.filter-var.php

永远不要相信用户输入,要聪明。不要相信任何东西。始终确保您收到的确实是您所期望的。如果它应该是一个数字,请确保它是一个数字。

大大改进的代码:

$user = filter_var($_POST['user'], FILTER_SANITIZE_STRING);
$isValid = filter_var($user, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => "/^[a-zA-Z0-9]+$/")));

if ($isValid) {
    // do something
}

清理和验证。


推荐