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

注意:未定义变量my_variable_name在C:\wamp\www\mypath\index.php第10行 注意:第11行未定义索引:my_index C:\wamp\www\mypath\index.php 警告:在C:\wamp\www\mypath\index.php第11行未定义数组键“my_index”

第10和11行是这样的:

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

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

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

我该如何修复它们?


这是一个一般参考问题,供人们链接作为副本,而不是需要一遍又一遍地解释这个问题。我觉得这很有必要,因为现实世界中关于这个问题的答案都非常具体。 相关元讨论: 如何应对重复的问题? “参考问题”有意义吗?


当前回答

如果使用类,你需要确保你引用成员变量使用$this:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}

其他回答

未定义的索引意味着在您请求的数组中,数组索引不可用。例如,

<?php
    $newArray[] = {1, 2, 3, 4, 5};
    print_r($newArray[5]);
?>

一个未定义的变量意味着你完全没有使用一个现有的变量,或者这个变量没有定义或初始化。例如,

<?php print_r($myvar); ?>

未定义的偏移量意味着在数组中请求一个不存在的键。解决这个问题的方法是在使用前检查:

php> echo array_key_exists(1, $myarray);

在回答“为什么他们突然出现?”我使用这个脚本很多年了,从来没有遇到过任何问题。”

对于大多数网站来说,在“默认”错误报告下操作是很常见的,“显示所有错误,但不显示‘通知’和‘已弃用’”。这将在php.ini中设置,并应用于服务器上的所有站点。这意味着示例中使用的那些“通知”将被抑制(隐藏),而其他被认为更严重的错误将被显示/记录。

另一个关键设置是可以隐藏错误(即display_errors设置为“off”或“syslog”)。

在这种情况下发生的情况是,error_reporting被更改为也显示通知(如示例所示)和/或设置被更改为屏幕上的display_errors(而不是抑制它们/记录它们)。

他们为什么改变了?

最明显/最简单的答案是有人在PHP .ini中调整了这些设置之一,或者PHP的升级版本现在使用与以前不同的PHP .ini。这是首先要看的地方。

但是,也可以覆盖这些设置

.htconf (webserver配置,包括vhosts和子配置 . htaccess 在PHP代码中

这些都可以被改变。

还有一个额外的复杂性,web服务器配置可以启用/禁用。htaccess指令,所以如果你的。htaccess指令突然启动/停止工作,那么你需要检查它。

(.Htconf / .htaccess假设你以apache运行。如果运行命令行,这将不适用;如果运行IIS或其他web服务器,则需要相应地检查这些配置)

总结

检查php.ini中的error_reporting和display_errors php指令是否更改,或者您使用的php.ini与以前不同。 检查error_reporting和display_errors php指令在.htconf(或vhosts等)没有改变 检查error_reporting和display_errors php指令在.htaccess中没有改变 如果你在.htaccess中有指令,检查它们在.htconf文件中是否仍然被允许 最后检查你的代码;可能是一个不相关的库;查看error_reporting和display_errors PHP指令是否已经设置在那里。

抛出未定义索引通知的另一个原因是数据库查询中遗漏了一列。

例如:

$query = "SELECT col1 FROM table WHERE col_x = ?";

然后尝试访问循环中的更多列/行。

例如:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

或者在while循环中:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

另外需要注意的是,在*NIX操作系统和Mac OS X上,事情是区分大小写的。

参考Stack上的以下问答:

MySQL中的表名是否区分大小写? Mysql查询中区分大小写的表名 MySql -表在不同服务器中的大小写敏感问题

可能你使用的是旧的PHP版本,现在升级了PHP,这就是为什么它多年来一直没有任何错误。

在php4之前,如果你使用变量而没有定义它,就不会出现错误,但从php5开始,它会抛出类似上述问题的代码错误。

如果使用类,你需要确保你引用成员变量使用$this:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}