注意:未定义变量&q;,&q;注意:未定义索引&q;,&q;警告:未定义数组键&q;,以及&q;注意:使用PHP的未定义偏移量

我正在运行一个PHP脚本,但继续收到如下错误:

注意:第10行C:wampwwwmypathindex.php中的未定义变量:my_ariable_name

注意:第11行上的未定义索引:my_index C:wampwwwmypathindex.php

警告:第11行上C:wampwwwmypathindex.php中的未定义数组键&my_index";

第10行和第11行如下所示:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

这些错误消息的含义是什么?

为什么它们突然出现了?我使用此脚本已有多年,从未遇到过任何问题。

如何修复它们?


这是一个常规参考问题,人们可以重复链接到该问题,而不必反复解释该问题。我觉得这是必要的,因为关于这个问题的大多数现实世界的答案都非常具体。

相关元讨论:

  • What can be done about repetitive questions?
  • Do "reference questions" make sense?

解决方案

注意/警告:未定义变量

来自PHP Manual的浩瀚智慧:

在将一个文件包含到使用相同变量名称的另一个文件中的情况下,依赖未初始化变量的默认值是有问题的。它也是打开了register_globals的主要security risk。E_NOTICE如果使用未初始化的变量,则会发出级别错误,但在将元素追加到未初始化的数组的情况下不会发出级别错误。isset()语言结构可用于检测变量是否已初始化。此外,更理想的是empty()的解决方案,因为如果变量未初始化,它不会生成警告或错误消息。

发件人PHP documentation:

如果变量不存在,则不会生成警告。这意味着 Empty()本质上相当于!isset($var)||$var ==FALSE。

这意味着您只能使用empty()来确定是否设置了变量,此外,它还会根据以下各项检查变量:00.0"""0"nullfalse[]

示例:

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "
";
});

在3v4l.org online PHP editor

中测试上述代码段

虽然PHP不需要变量声明,但它确实建议这样做,以避免某些安全漏洞或错误,因为您会忘记为稍后将在脚本中使用的变量赋值。对于未声明的变量,PHP所做的是发出一个非常低级别的错误E_NOTICE,默认情况下甚至不会报告这个错误,但在开发过程中会根据手册advises to allow进行报告。

处理方法:

  1. 建议:声明变量,例如,当您尝试将字符串追加到未定义的变量时。或者使用isset()/!empty()检查是否在引用它们之前声明了它们,如:

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';
    

从PHP 7.0开始,这一点变得更加清晰,现在您可以使用null coalesce operator:

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
  1. 为E_Notify设置custom error handler,并将消息从标准输出(可能是日志文件)重定向:

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  2. 禁用E_Notify报告。仅排除E_NOTICE的快捷方法是:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  3. 使用@ operator取消错误。

注意:强烈建议仅实现第1点。

注意:索引未定义/偏移量未定义/警告:数组键未定义

当您(或PHP)尝试访问数组的未定义索引时,会出现此通知/警告。

处理方法:

  1. 在访问之前检查索引是否存在。为此,您可以使用isset()array_key_exists()

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
  2. 语言构造list()在尝试访问不存在的数组索引时可能会生成以下内容:

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    

使用两个变量访问两个数组元素,但只有一个数组元素index0,因此将生成:

注意:未定义偏移量:1

#$_POST/$_GET/$_SESSION变量

在使用$_POST$_GET$_SESSION时,经常会出现上述通知。对于$_POST$_GET,您只需在使用它们之前检查索引是否存在。对于$_SESSION,您必须确保会话以session_start()开始,并且索引也存在。

还请注意,所有3个变量均为superglobals且为大写。

相关:

  • Notice: Undefined variable
  • Notice: Undefined Index

相关文章