我正在运行一个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"];

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

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

我该如何修复它们?


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


当前回答

注意/警告:未定义变量

尽管PHP不需要变量声明,但它还是推荐这样做,以避免一些安全漏洞或错误,例如忘记为稍后将在脚本中使用的变量赋值。PHP在未声明变量的情况下所做的是发出一个E_WARNING级别的错误。

这个警告可以帮助程序员发现拼写错误的变量名。此外,未初始化的变量还有其他可能的问题。正如PHP手册中所述,

在将一个文件包含到另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的。

表示在主文件中未初始化,此变量可能被包含文件中的变量重写,这可能导致不可预知的结果。为了避免这种情况,最好对php文件中的所有变量进行初始化

处理这个问题的方法:

建议:声明你的变量,例如当你试图将一个字符串附加到一个未定义的变量。或者使用isset()在引用它们之前检查它们是否被声明,如下所示: //初始化变量 $value = "";/ /初始化值;0表示int,[]表示数组,等等。 echo $价值;//没有错误 用空合并运算符抑制错误。 //空合并运算符 Echo $value ??”; 对于古老的PHP版本(< 7.0),可以使用带三元的isset() 返回isset($value) ?$value: "; 但是要注意,它本质上仍然是一个错误抑制,尽管只是针对一个特定的错误。因此,它可能会阻止PHP通过标记一个统一变量来帮助您。 使用@操作符抑制错误。因为历史原因留在这里,但说真的,这不应该发生。

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

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

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

处理这个问题的方法都差不多:

建议:声明你的数组元素: //初始化变量 $array['value'] = "";/ /初始化值;0表示int,[]表示数组,等等。 echo $数组(“价值”);//没有错误 用空合并运算符"抑制错误: echo $_POST['value'] ?”; 对于数组,这个操作符更合理,因为它可以用于您无法控制的外部变量。因此,可以考虑将它仅用于外部变量,例如$_POST / $_GET / $_SESSION或JSON输入。而所有内部数组最好先进行预定义/初始化。 更好的是,验证所有输入,将其分配给局部变量,并在代码中自始至终使用它们。所以你要访问的每个变量都是故意存在的。

相关:

注意:未定义变量 注意:未定义索引

其他回答

注意/警告:未定义变量

尽管PHP不需要变量声明,但它还是推荐这样做,以避免一些安全漏洞或错误,例如忘记为稍后将在脚本中使用的变量赋值。PHP在未声明变量的情况下所做的是发出一个E_WARNING级别的错误。

这个警告可以帮助程序员发现拼写错误的变量名。此外,未初始化的变量还有其他可能的问题。正如PHP手册中所述,

在将一个文件包含到另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的。

表示在主文件中未初始化,此变量可能被包含文件中的变量重写,这可能导致不可预知的结果。为了避免这种情况,最好对php文件中的所有变量进行初始化

处理这个问题的方法:

建议:声明你的变量,例如当你试图将一个字符串附加到一个未定义的变量。或者使用isset()在引用它们之前检查它们是否被声明,如下所示: //初始化变量 $value = "";/ /初始化值;0表示int,[]表示数组,等等。 echo $价值;//没有错误 用空合并运算符抑制错误。 //空合并运算符 Echo $value ??”; 对于古老的PHP版本(< 7.0),可以使用带三元的isset() 返回isset($value) ?$value: "; 但是要注意,它本质上仍然是一个错误抑制,尽管只是针对一个特定的错误。因此,它可能会阻止PHP通过标记一个统一变量来帮助您。 使用@操作符抑制错误。因为历史原因留在这里,但说真的,这不应该发生。

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

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

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

处理这个问题的方法都差不多:

建议:声明你的数组元素: //初始化变量 $array['value'] = "";/ /初始化值;0表示int,[]表示数组,等等。 echo $数组(“价值”);//没有错误 用空合并运算符"抑制错误: echo $_POST['value'] ?”; 对于数组,这个操作符更合理,因为它可以用于您无法控制的外部变量。因此,可以考虑将它仅用于外部变量,例如$_POST / $_GET / $_SESSION或JSON输入。而所有内部数组最好先进行预定义/初始化。 更好的是,验证所有输入,将其分配给局部变量,并在代码中自始至终使用它们。所以你要访问的每个变量都是故意存在的。

相关:

注意:未定义变量 注意:未定义索引

HTML表单提交后变量不存在的一个常见原因是表单元素没有包含在<form>标记中:

示例:<表单>中不包含的元素

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

示例:元素现在包含在<表单>中

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

如果你要向API发送数据,只需使用isset():

if(isset($_POST['param'])){
    $param = $_POST['param'];
} else {
    # Do something else
}

如果是由于会话导致的错误,请确保已正确启动会话。

这意味着您正在测试、求值或打印一个尚未赋值的变量。这意味着你要么有一个拼写错误,要么你需要检查变量是否被初始化为其他东西。检查您的逻辑路径,它可能设置在一个路径,但不是在另一个路径。

当我们使用一个未设置的变量时,就会发生这些错误。

处理这些问题的最佳方法是在开发时设置错误报告。

设置错误报告:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

在生产服务器上,错误报告是关闭的,因此,我们不会得到这些错误。

但是,在开发服务器上,我们可以设置错误报告。

为了消除这个错误,我们看到下面的例子:

if ($my == 9) {
 $test = 'yes';  // Will produce an error as $my is not 9.
}
echo $test;

在赋值或使用变量之前,可以将变量初始化为NULL。

因此,我们可以将代码修改为:

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce an error as $my is not 9.
}
echo $test;

这不会干扰任何程序逻辑,即使$test没有值,也不会产生Notice。

因此,基本上,在开发时将错误报告设置为ON总是更好的。

并修复所有的错误。

在生产中,错误报告应该设置为关闭。