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

注意:不确定的变量:c:\ wamp \ www \ mypath \ mypath \ index.php在第10行上

注意:未定义的索引:my_index c:\ wamp \ www \ mypath \ index.php在第11行

警告:c:\ wamp \ www \ mypath \ mypath \ index.php在第11行11中的未定义阵列键" my_index"

第10行和第11行看起来像这样:

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

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

为什么它们突然出现?我曾经使用这个脚本多年了,我从来没有任何问题。

我该如何修复它们?


~This is a General Reference question让人们链接为重复,而不必一遍又一遍地解释这个问题。我觉得这是必要的,因为这个问题上的大多数现实世界答案都是非常具体的。~

~相关的元讨论:~

答案

通知 /警告:未定义的变量

从广阔的智慧中PHP手册

在将一个文件包含到使用相同变量名的另一个文件中的情况下,依赖未初始化变量的默认值是有问题的。安全风险register_globals打开。e_notice在使用非初始化变量的情况下,会发出级别错误,但是在将元素附加到非初始化数组的情况下。isset()语言构造可用于检测是否已经初始化了变量。另外,更理想的是解决方案空的()因为如果没有初始化该变量,则不会生成警告或错误消息。

PHP文档

如果不存在该变量,则不会生成警告。这意味着empty() 本质上是简洁的**!isset($var) || $var == false**。

这意味着您只能使用empty()为了确定是否设置了变量,此外,它还检查了以下变量,0,,,,0.0,,,,"",,,,"0",,,,null,,,,false或者[]

例子:

$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 "\n";
});

测试上面的代码片段3v4l.org在线PHP编辑器

尽管PHP不需要可变声明,但它确实建议它,以避免某些安全漏洞或错误,在这些漏洞或错误中,人们会忘记给脚本以后将在脚本中使用的变量赋予值。在未申报变量的情况下,PHP的作用是非常低的级别错误,E_NOTICE,默认情况下甚至没有报道的一个,而是手册建议允许在开发过程中。

处理该问题的方法:

  1. Recommended: 声明您的变量,例如,当您尝试将字符串附加到未定义的变量时。或使用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'] : '';
    

截至7.0,这已经变得更加干净,现在您可以使用Null Coalesce运营商

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
  1. 设置自定义错误处理程序对于e_notice,并将消息从标准输出(也许转移到日志文件):

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

    error_reporting( error_reporting() & ~E_NOTICE )
    
  3. @ 操作员

**Note:**强烈建议仅实现第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');
    

两个变量用于访问两个数组元素,但是只有一个数组元素,索引0,这将产生:

注意:未定义偏移:1

#$_POST/$_GET/$_SESSION多变的

上面的通知经常出现$_POST,,,,$_GET或者$_SESSION。为了$_POST$_GET您只需要在使用索引之前检查索引是否存在。为了$_SESSION您必须确保您的会议开始session_start()并且该指数也存在。

另请注意,所有3个变量均为超级全球并且是大写。

有关的:

来自: stackoverflow.com