我正在运行PHP脚本,并继续收到如下错误:
注意:未定义的变量:第10行的C:\ wamp \ www \ mypath \ index.php中的my_variable_name
注意:未定义的索引:第11行的my_index C:\ wamp \ www \ mypath \ index.php
第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_globals。在使用未初始化的变量的情况下会发出E_NOTICE级错误,但是在将元素附加到未初始化的数组的情况下不会发生。 isset()语言构造可用于检测变量是否已初始化。另外,更理想的是empty()的解决方案,因为如果未初始化变量,它不会生成警告或错误消息。
从PHP documentation:
如果变量不存在,则不会生成警告。那意味着
empty()本质上等同于!isset($ var)|| $ var
==错误。
这意味着您只能使用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 online PHP editor中测试以上代码段
尽管PHP不需要变量声明,但它确实推荐这样做,以避免某些安全漏洞或bug,因为这些漏洞或bug可能会忘记为变量提供值,该变量将在脚本的后面使用。在未声明变量的情况下,PHP会发出一个非常低级的错误[]
,默认情况下甚至不会报告该错误,而是在开发过程中会报告《手册》。
解决问题的方法:
推荐:声明变量,例如,当您尝试将字符串附加到未定义的变量时。或使用advises to allow / E_NOTICE
在引用它们之前检查它们是否已声明,如:
//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起,它变得更加干净,现在您可以使用isset()
了:
// Null coalesce operator - No need to explicitly initialize the variable.
$value = $_POST['value'] ?? '';
为E_NOTICE设置null coalesce operator并将消息重定向到标准输出之外(也许到日志文件):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
禁用E_NOTICE的报告功能。仅排除!empty()
的一种快速方法是:
error_reporting( error_reporting() & ~E_NOTICE )
用custom error handler抑制错误。
注意:强烈建议仅实施第1点。
注意:未定义索引/未定义偏移
当您(或PHP)尝试访问数组的未定义索引时,将显示此通知。
解决问题的方法:
访问索引之前,请检查该索引是否存在。为此,您可以使用@ operator或E_NOTICE
:
//isset()
$value = isset($array['my_index']) ? $array['my_index'] : '';
//array_key_exists()
$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
语言构造isset()
在尝试访问不存在的数组索引时可能会生成以下代码:
list($a, $b) = array(0 => 'a');
//or
list($one, $two) = explode(',', 'test string');
两个变量用于访问两个数组元素,但是只有一个数组元素,索引为array_key_exists()
,因此将生成:
注意:未定义的偏移量:1
list()
/ 0
/ $_POST
变量
当使用$_GET
,$_SESSION
或$_POST
时,上面的提示经常出现。对于$_GET
和$_SESSION
,您只需要在使用索引之前检查索引是否存在。对于$_POST
,您必须确保会话以$_GET
开始,并且索引也存在。
另请注意,所有3个变量均为$_SESSION
且均为大写。
有关:
superglobals
Notice: Undefined variable
假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…
php-casperjs获取内部文本 - php我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…
php getdate()-小时不正确 - php我在iframe中将php用于计数器。我正在使用getdate();功能。我的当地时间不是下午12:16,如果我使用getdate();从php获取现在的本地时间,小时显示为13。我从php getdate()回答的值应该不是12吗?$d1=getdate(); $hournew=$d1['hours']; echo $hournew .…
php:是否有充分的理由引用所有数组键/索引? - php我正在遍历别人的代码,他们总是避免转义其数组键。例如:$ row_rsCatalogsItems [名称]代替$ row_rsCatalogsItems ['名称']因此,我不断地对自己接触的所有事物进行微小的更改,以应对这些惰性。但是现在我想知道这样做是否有很多好处。我得到它会在默认为字符串之前检查常量(我在处理常量时会讨厌php中的行为,因为即使未定义,…
PayPal PHP IPN示例引用了哪些POST序列化问题? - phpPayPal用于PHP IPN侦听器的示例代码在顶部具有以下注释/代码:// reading posted data from directly from $_POST causes serialization // issues with array data in POST // reading raw POST data from input stre…