我正在运行一个php脚本,并继续收到如下错误:
注意:未定义的变量:第10行C:\ wamp\www\mypath\index.php中的my_variable_name
注意:未定义的索引:my_index c:\ wamp\www\mypath\index.php第11行
第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的巨大智慧中:
在将一个文件包含到另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的。它也是开启security risk的主register_globalsE_NOTICE在处理未初始化的变量时会发出级别错误,但在将元素附加到未初始化的数组时不会发出级别错误。isset()语言构造可用于检测变量是否已初始化。另外,更理想的解决方案是empty(),因为如果变量未初始化,它不会生成警告或错误消息。
PHP documentation
如果变量不存在,则不会生成警告。那意味着
empty()本质上是与!ISSET($var)$var
==错误。
这意味着您只能使用empty()来确定是否设置了变量,此外,它还会对照以下各项检查变量:00.0"""0"nullfalse[]E_NOTICEisset()
例子:

$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 online PHP editor中测试上述片段
尽管php不需要变量声明,但它确实建议您这样做,以避免某些安全漏洞或错误,在这些漏洞或错误中,您会忘记为稍后将在脚本中使用的变量提供值。在未声明变量的情况下,php所做的是发出一个非常低级别的错误!empty(),默认情况下甚至不会报告这个错误,而是在开发过程中使用手册advises to allow
处理问题的方法:
建议:声明变量,例如,当您试图将字符串附加到未定义的变量时。或者使用E_NOTICE/isset()检查在引用它们之前是否声明了它们,如:
//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'] ?? '';

为e_notice设置custom error handler并将消息重定向到标准输出之外(可能是日志文件):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)

禁止e_notice进行报告。一个快速排除array_key_exists()的方法是:
error_reporting( error_reporting() & ~E_NOTICE )

使用@ operator抑制错误。
注意:强烈建议仅实现第1点。
注意:未定义的索引/未定义的偏移量
当您(或php)尝试访问数组的未定义索引时,会出现此通知。
处理问题的方法:
在访问索引之前,请检查该索引是否存在。为此,您可以使用list()0
//isset()
$value = isset($array['my_index']) ? $array['my_index'] : '';
//array_key_exists()
$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';

当语言构造$_POST试图访问不存在的数组索引时,可能会生成以下内容:
list($a, $b) = array(0 => 'a');
//or
list($one, $two) = explode(',', 'test string');

两个变量用于访问两个数组元素,但是只有一个数组元素index$_GET,因此这将生成:
注意:未定义的偏移量:1
变量
当使用$_SESSION$_POST$_GET时,通常会出现上述注意事项。对于$_SESSION$_POST您只需在使用它们之前检查索引是否存在。对于$_GET您必须确保会话以$_SESSION开始并且索引也存在。
还要注意,所有3个变量均superglobals且为大写。
相关:
Notice: Undefined variable
Notice: Undefined Index

关于php - 使用PHP的“注意: undefined variable ”,“注意: undefined index ”和“注意: undefined offset ”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32538497/

10-10 19:34