与$ _ POST未定义指数[复制]与$ _ POST未定义指数[复制](Undefined ind

2019-05-16 17:16发布

这个问题已经在这里有一个答案:

  • “通知:未定义变量”,“注意:未定义指数”和“通知:未定义偏移”使用PHP 28的答案

我想重新学习一些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

没有用户名供应

正如你所看到的代码注册,没有变量被提供,但它给了,而且我认为错误意味着未找到一个变量是一个预期或者类似的东西。 是否有人可以澄清这对我?

Answer 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试图获得价值$_POST["username"]以作为参数传递给函数isset() 。 然而, isset()是不是一个真正的功能可言,但评价阶段之前公认的特殊语法,所以对于价值的存在实际上不试图检索它的PHP解释器检查。

另外值得一提的是,由于运行时错误去,丢失的数组元素被看作是小(分配E_NOTICE级)。 如果更改error_reporting级别,以便通知被忽略,因为写的,与已尝试数组访问返回原来的代码将实际工作null 。 但是,这被认为是不好的做法,特别是对生产代码。

附注:PHP确实串插,所以echo文中陈述if块可以组合成一个:

echo "$user is your username";


Answer 2:

使用:

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

但是,你也许应该使用一些更适当的验证。 尝试一个简单的正则表达式或Zend框架或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
}

消毒和验证。



Answer 3:

您的代码假设的东西存在:

$user = $_POST["username"];

PHP是让你知道,有是在没有“用户名” $_POST阵列。 在这种情况下,你会更安全检查,看是否值isset()试图访问它之前:

if ( isset( $_POST["username"] ) ) {
    /* ... proceed ... */
}

或者,你可以HI-插孔|| 运营商分配默认:

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

只要用户名不是falsy值,你可以考虑这个方法很可靠。 到默认分配一个更安全的途径是使用三元运算符:

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


Answer 4:

取而代之的isset()可以使用更短的东西越来越静音的错误,这是@$_POST['field'] 然后,如果现场没有设置,你会得到不打印页面上的错误。



Answer 5:

在此之前PHP 5.2.0及以上,你应该使用filter_input()这是特别创建的,要得到一个特定的外部用户输入,如获得通过名哨或Cookie变量和可选过滤器,以避免任何XSS /注入攻击你现场。 例如:

$user = filter_input(INPUT_POST, 'username');

您可以使用INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,或INPUT_ENV之一。

通过使用可选的第三个参数,则可以通过各种扩展它的过滤器 (用于验证 , 消毒 , 过滤或其他 ),例如FILTER_SANITIZE_SPECIAL_CHARSFILTER_SANITIZE_ENCODED

例如:

<?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>";
?>

语法是:

混合filter_input (INT $型,字符串$变量名[摘要$滤波器= FILTER_DEFAULT [,混合$选项]])

(PHP 5> = 5.2.0,PHP 7)

另请参阅: 为什么是更好地使用filter_input()?



Answer 6:

当你说:

$user = $_POST["username"];

你问PHP解释器来分配$user的价值$_POST具有的键(或指数)阵列username 。 如果它不存在,PHP会抛出一个合适的。

使用isset($_POST['user'])来检查该变量的存在:

if (isset($_POST['user'])) {
  $user = $_POST["username"];
  ...


Answer 7:

试试这个:

我用这个无处不在那里有一个$ _ POST请求。

$username=isset($_POST['username']) ? $_POST['username'] : "";

这只是一个短暂的手布尔值,如果isset将其设置为$ _POST [“用户名”],如果没有,那么它会为它设置为空字符串。

用法示例:

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


Answer 8:

我知道这是旧的文章,但有人能帮助:

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字符串,你可以定义一些默认的值,如果POST未激活或内容不存在。

echo "<h1>".POST("title", "Stack Overflow")."</h1>";

用它玩。



Answer 9:

尝试

if(isset($_POST['username']))
    echo $_POST['username']." is your username";
else
    echo "no username supplied";


Answer 10:

相关的问题: 什么是访问未知的数组元素,而不会产生PHP通知的最佳方式?

从上面的使用问题的答案,你可以放心地得到$ _POST的值,如果没有该键不存在产生PHP通知。

echo _arr($_POST, 'username', 'no username supplied');  
// will print $_POST['username'] or 'no username supplied'


文章来源: Undefined index with $_POST [duplicate]