我正在运行一个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"];
这些错误信息的含义是什么?
为什么他们突然出现?我曾经使用这个脚本多年,我从来没有遇到过任何问题。
我怎么修理它们?
这是一个一般的参考问题,供人们作为重复链接,而不必一遍又一遍地解释问题。我觉得这是必要的,因为关于这个问题的大多数现实世界的答案都是非常具体的。
相关元讨论:
试试这些
Q1:这个通知意味着$varname没有在脚本的当前范围中定义。
Q2:在使用任何可疑变量之前使用isset()、empty()条件效果很好。
// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';
// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
$user_name = $_SESSION['user_name'];
}
或者,作为一个快速和肮脏的解决方案:
// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);
关于会话的说明:
>
使用会话时,需要将session_start();
放置在所有使用会话的文件中。
http://php.net/manual/en/features.sessions.php
来自PHP手册的大量智慧:
在将一个文件包含到使用相同变量名的另一个文件中的情况下,依赖未初始化变量的默认值是有问题的。在启用register_globals的情况下,这也是一个主要的安全风险。在使用未初始化变量的情况下会发出E_NOTICE级别错误,但是在将元素附加到未初始化数组的情况下不会发出E_NOTICE级别错误。isset()语言构造可用于检测变量是否已初始化。另外,更理想的是empty()的解决方案,因为如果变量未初始化,它不会生成警告或错误消息。
来自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_notece
,这个错误在默认情况下甚至不报告,但手册建议在开发过程中允许。
处理问题的方法:
>
建议:声明变量,例如,当您尝试向未定义的变量追加字符串时。或者使用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'] : '';
这在PHP7.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_notece
的一个快速方法是:
error_reporting( error_reporting() & ~E_NOTICE )
使用@运算符取消显示错误。
注意:强烈建议只实现第1点。
当您(或PHP)尝试访问数组的未定义索引时,会出现此通知。
处理问题的方法:
>
在访问索引之前,请检查该索引是否存在。为此,您可以使用isset()
或array_key_exist()
:
//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');
使用两个变量访问两个数组元素,但是只有一个数组元素,index0
,因此这将生成:
注意:未定义的偏移量:1
使用$_post
、$_get
或$_session
时,经常会出现上述通知。对于$_post
和$_get
,您只需在使用它们之前检查索引是否存在。对于$_session
,必须确保会话是用session_start()
启动的,并且索引也存在。
还要注意,所有3个变量都是超全局的,并且是大写的。
相关:
问题内容: 我正在运行PHP脚本,并继续收到如下错误: 注意:第10行上C:\ wamp \ www \ mypath \ index.php中的未定义变量:my_variable_name 注意:未定义的索引:第11行的my_index C:\ wamp \ www \ mypath \ index.php 第10和11行看起来像这样: 这些错误消息是什么意思? 为什么它们突然出现?我曾经使用此
问题内容: 我正在运行一个 PHP 脚本并继续收到如下错误: 注意:未定义变量:第 10 行 C:\wamp\www\mypath\index.php 中的 my_variable_name 注意:未定义索引:第 11 行的 my_index C:\wamp\www\mypath\index.php 第 10 行和第 11 行如下所示: 这些错误消息的含义是什么? 为什么它们会突然出现?我曾经使用
代码: 错误: 我该怎么解决这个问题?
我安装了Ngnix服务器,并将其配置为: } 我收到以下错误(从我的error.log复制): 2015/12/16 00:27:37[错误]952#0:*9 FastCGI发送到stderr:“PHP消息:PHP通知:未定义索引:第245行/usr/share/nginx/html/admin interface/login.PHP中的用户名PHP消息:PHP通知:未定义索引:第249行/usr
奇怪的是,自定义图标在三星Mini(jelly bean)和Nexus 4(API 27)模拟器上显示正确,但在三星A6(Oreo)和华为Honory Lite 9(Oreo)设备上却显示不正确,在这些设备上,我看到了默认的绿色背景白色droid图标。 通知始终显示,但在某些设备上不使用自定义图标。 我尝试在AssetStudio中实现它,并且使用和不使用Notification Builder实
问题内容: 我在PHP中收到以下错误 注意未定义的偏移量1:在C:\ wamp \ www \ includes \ imdbgrabber.php第36行中 这是导致它的PHP代码: 错误是什么意思? 问题答案: 如果找不到匹配项,则为空数组。因此,您应该在访问之前检查是否找到了匹配项,例如: