我正在运行一个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
,默认情况下甚至没有报道的一个,而是手册建议允许在开发过程中。
处理该问题的方法:
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'] ?? '';
设置自定义错误处理程序对于e_notice,并将消息从标准输出(也许转移到日志文件):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
禁用E_NOTICE报告。仅排除的快速方法
E_NOTICE
是:error_reporting( error_reporting() & ~E_NOTICE )
用@ 操作员。
**Note:**强烈建议仅实现第1点。
注意:未定义的索引 /未定义偏移 /警告:未定义的数组键
当您(或PHP)尝试访问数组的未定义索引时,会出现此通知/警告。
处理该问题的方法:
在访问该索引之前,请检查该索引是否存在。为此,您可以使用
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'] : '';
语言构造
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个变量均为超级全球并且是大写。
有关的: