我正在运行一个PHP脚本,并继续收到如下错误:
注意:未定义变量:第10行C:\wamp\www\mypath\index.php中的my\u variable\u name
注意:未定义索引:第11行的my_index C:\wamp\www\mypath\index.php
第10行和第11行如下所示:
echo";我的变量值是:"$我的变量名;
“回声”;我的索引值是:“引用”$我的U数组[“我的U索引”];
这些错误消息的含义是什么
为什么它们突然出现?我使用这个脚本多年了,从来没有遇到过任何问题
我怎样修理它们
这是一个一般性的参考问题,供人们重复链接,而不必反复解释问题。我觉得这是必要的,因为在这个问题上,大多数现实世界的答案都非常具体
相关元讨论:
- 如何处理重复性问题?
- 参考问题有意义吗?
注意:未定义的变量
从PHP手册中获得的巨大智慧:
在将一个文件包含到另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的。当register_globals打开时,这也是一个重大的安全风险。使用未初始化的变量时会发出E_通知级别错误,但在将元素附加到未初始化的数组时不会发出。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'];
数组_walk($var,函数($v){
echo(!isset($v)| |$v==false)?“true”:“false”;
回显“”(空($v)‘真’:‘假’);
回音“\n”;
});
在3v4l.org在线PHP编辑器中测试上述代码段
尽管PHP不需要变量声明,但它还是建议使用它,以避免出现一些安全漏洞或bug,在这些漏洞或bug中,人们会忘记为稍后在脚本中使用的变量赋值。PHP在未声明变量的情况下所做的是发出一个非常低级的错误,E_NOTICE,一个默认情况下甚至没有报告的错误,但手册建议在开发过程中允许
处理这一问题的方法:
-
建议:声明变量,例如,当您尝试将字符串附加到未定义的变量时。或者使用
isset()/!empty()在引用它们之前检查它们是否已声明,如中所示://初始化变量 $value=“”//初始化值;例子 //“”当您以后要追加内容时 //如果以后要添加数字,则为0 //isset() $value=isset($\u POST['value'])$_POST['value']:''; //空的() $value=!空($\u POST['value'])$_POST['value']:'';这在PHP 7.0中变得更加清晰,现在您可以使用null coalesce操作符:
//空合并运算符-无需显式初始化变量。 $value=$_POST['value']??''; -
为E_通知设置自定义错误处理程序,并将消息重定向到标准输出之外(可能是日志文件):
设置错误处理程序('MyHandlerForminoErrors',E|u NOTICE | E|u STRICT) -
从报告中禁用E_通知。排除E_通知的快速方法是:
错误报告(错误报告()&;~E\u通知) -
使用@运算符抑制错误
注意:强烈建议只实施第1点
注意:未定义索引/未定义偏移
当您(或PHP)尝试访问数组的未定义索引时,会出现此通知
处理这一问题的方法:
-
在访问该索引之前,请检查该索引是否存在。为此,您可以使用
isset()或array\u key\u exists()://isset() $value=isset($array['my_index'])$数组['my_index']:''; //数组\密钥\存在() $value=array\u key\u存在('my\u index',$array)$数组['my_index']:''; -
当语言结构
list()试图访问不存在的数组索引时,可能会生成以下内容:列表($a,$b)=数组(0=>;'a'); //或 列表($1,$2)=分解(',','teststring');
两个变量用于访问两个数组元素,但是只有一个数组元素index0,因此这将生成:
注意:未定义的偏移量:1
$\u POST/$\u GET/$\u SESSION变量
使用$\u POST、$\u GET或$\u SESSION时,经常会出现上述注意事项。对于$\u POST和$\u GET,您只需在使用它们之前检查索引是否存在。对于$\u会话,您必须确保会话以SESSION\u start()启动,并且索引也存在
还请注意,所有3个变量都是超全局变量,都是大写
相关的:
- 注意:未定义的变量
- 注意:未定义索引