Php 未定义的带有$\u POST的索引

Php 未定义的带有$\u POST的索引,php,login,undefined-index,Php,Login,Undefined Index,我正在尝试重新学习一些PHP基础知识,以创建一个简单的登录脚本,但是我遇到了一个以前从未遇到过的错误(我在一年多前创建了相同的脚本,但从未出现过此错误。我尽可能简化代码,以测试哪个方面存在问题,问题如下: <?php $user = $_POST["username"]; if($user != null) { echo $user; echo " is your username"; } else { echo "no username supplied"; }

我正在尝试重新学习一些PHP基础知识,以创建一个简单的登录脚本,但是我遇到了一个以前从未遇到过的错误(我在一年多前创建了相同的脚本,但从未出现过此错误。我尽可能简化代码,以测试哪个方面存在问题,问题如下:

<?php
$user = $_POST["username"];
if($user != null)
{
    echo $user;
    echo " is your username";
}
else
{
    echo "no username supplied";
}
?>
没有提供用户名

正如您所看到的,代码寄存器没有提供任何变量,但它给出了一个错误,我认为这意味着没有找到一个变量,或者应该找到一个或类似的变量。有人能帮我澄清一下吗?

使用:

if (isset($_POST['user'])) {
   //do something
}
但您可能应该使用一些更合适的验证,尝试一个简单的正则表达式或Zend Framework或Symfony的坚如磐石的实现

甚至内置过滤器扩展:

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

改进了很多的代码:

$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
}

清理和验证。

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

这就是您遇到的问题:数组
$\u POST
在键
的“username”
处没有任何元素,因此解释器在到达空性测试之前中止您的程序

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

if (isset($_POST["username"]))
{
  $user = $_POST["username"];
  echo $user;
  echo " is your username";
} 
else 
{
  $user = null;
  echo "no username supplied";
}
当PHP试图将
$\u POST[“username”]
的值作为参数传递给函数
isset()
时,它看起来会以与代码完全相同的方式爆炸实际上根本不是一个函数,而是在求值阶段之前识别的特殊语法,因此PHP解释器检查值是否存在,而不实际尝试检索它

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

旁注:PHP执行字符串插值,因此
if
块中的
echo
语句可以组合成一个:

echo "$user is your username";
当你说:

$user = $_POST["username"];
您要求PHP解释器为
$user
分配
$\u POST
数组的值,该数组的键(或索引)为
username
。如果它不存在,PHP会抛出一个匹配

使用
isset($\u POST['user'])
检查该变量是否存在:

if (isset($_POST['user'])) {
  $user = $_POST["username"];
  ...
您的代码假定存在以下内容:

$user = $_POST["username"];
PHP让您知道
$\u POST
数组中没有“用户名”。在这种情况下,在尝试访问该值之前,您可以更安全地检查值
isset()

if ( isset( $_POST["username"] ) ) {
    /* ... proceed ... */
}
或者,您也可以将
|
操作符高插以指定默认值:

$user = $_POST["username"] || "visitor" ;

只要用户的名字不是冒牌值,你可以认为这个方法非常可靠。默认赋值的一个更安全的途径是使用三元运算符:

$user = isset( $_POST["username"] ) ? $_POST["username"] : "visitor" ;
试一试


相关问题:

使用上述问题的答案,如果密钥不存在,您可以安全地从$\u POST获得一个值,而无需生成PHP通知

echo _arr($_POST, 'username', 'no username supplied');  
// will print $_POST['username'] or 'no username supplied'
echo "<h1>".POST("title", "Stack Overflow")."</h1>";
您可以使用较短的设置来静音错误,而不是
isset()
。它是
@$\u POST['field']
。然后,如果未设置字段,您将不会在页面上打印错误。

尝试以下操作:

我在任何有$u POST请求的地方都使用它

$username=isset($_POST['username']) ? $_POST['username'] : "";
这只是一个简单的布尔值,如果设置为$_POST['username'],则将其设置为空字符串

用法示例:

if($username===""){ echo "Field is blank" } else { echo "Success" };

在PHP 5.2.0及更高版本之前,您应该使用它来获取特定的外部用户输入,例如按名称获取get、post或cookie变量,并选择性地对其进行过滤,以避免对您的站点进行任何XSS/注入攻击。例如:

$user = filter_input(INPUT_POST, 'username');
<?php
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "You have searched for $search_html.\n";
echo "<a href='?search=$search_url'>Search again.</a>";
?>
您可以使用INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER或INPUT_ENV中的一种

通过使用可选的第3个参数,您可以通过各种(for,or)对其进行扩展,例如
FILTER\u SANITIZE\u SPECIAL\u CHARS
FILTER\u SANITIZE\u ENCODED
,等等

例如:

$user = filter_input(INPUT_POST, 'username');
<?php
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "You have searched for $search_html.\n";
echo "<a href='?search=$search_url'>Search again.</a>";
?>

语法是:

混合
过滤器\输入
(int$类型,字符串$变量\名称[,int$过滤器=过滤器\默认值[,混合$选项])

(PHP5>=5.2.0,PHP7)


另请参见:

我知道这是一篇老文章,但有人可以提供帮助:

function POST($index, $default=NULL){
        if(isset($_POST[$index]))
        {
            if(!empty(trim($_POST[$index])))    
                return $_POST[$index];
        }
        return $default;
    }
上面的代码是我在任何地方使用的基本POST函数。在这里你可以放置过滤器、正则表达式等。它更快更干净。我的高级POST函数更复杂,难以接受和检查数组、字符串类型、默认值等。让我们来想象一下

您可以通过以下方式轻松检查用户名:

$username = POST("username");
if($username!==null){
    echo "{$username} is in the house.";
}
此外,我还添加了
$default
字符串,如果帖子未激活或内容不存在,您可以定义一些默认值

echo _arr($_POST, 'username', 'no username supplied');  
// will print $_POST['username'] or 'no username supplied'
echo "<h1>".POST("title", "Stack Overflow")."</h1>";
echo.POST(“标题”、“堆栈溢出”);

玩它。

为表单发布代码。它看起来像_post[username]这不是挫折,因为如果你做的都是正确的,你只是在HTML页面方法中命名为“get”,并且你用“$\u POST”捕捉参数。你需要将其重命名为$\u get。仅此而已。这在很多级别上都是错误的……DownVorters&@vinnylinux:为什么它是错误的?可能是因为它不会产生OP想要的输出
[username]是您的用户名(如果这很重要的话,我不是投反对票的人,所以原因可能不同)@