使用PHP的“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”

我正在运行一个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"我的变量值是:&quot$我的变量名;
“回声”;我的索引值是:“引用”$我的U数组[“我的U索引”];

这些错误消息的含义是什么

为什么它们突然出现?我使用这个脚本多年了,从来没有遇到过任何问题

我怎样修理它们


这是一个一般性的参考问题,供人们重复链接,而不必反复解释问题。我觉得这是必要的,因为在这个问题上,大多数现实世界的答案都非常具体

相关元讨论:

  • 如何处理重复性问题?
  • 参考问题有意义吗?

注意:未定义的变量

从PHP手册中获得的巨大智慧:

在将一个文件包含到另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的。当register_globals打开时,这也是一个重大的安全风险。使用未初始化的变量时会发出E_通知级别错误,但在将元素附加到未初始化的数组时不会发出。isset()语言构造可用于检测变量是否已初始化。此外,更理想的解决方案是empty(),因为如果变量未初始化,它不会生成警告或错误消息

来自PHP文档:

如果变量不存在,则不会生成警告。这意味着
empty()本质上是的简明等价物!isset($var)| |$var
==false

这意味着您只能使用empty()来确定变量是否已设置,此外,它还会根据以下内容检查变量:00.0“0”nullfalse[]

例如:

$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,一个默认情况下甚至没有报告的错误,但手册建议在开发过程中允许

处理这一问题的方法:

  1. 建议:声明变量,例如,当您尝试将字符串附加到未定义的变量时。或者使用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']??'';
    
  2. 为E_通知设置自定义错误处理程序,并将消息重定向到标准输出之外(可能是日志文件):

    设置错误处理程序('MyHandlerForminoErrors',E|u NOTICE | E|u STRICT)
    
  3. 从报告中禁用E_通知。排除E_通知的快速方法是:

    错误报告(错误报告()&~E\u通知)
    
  4. 使用@运算符抑制错误

注意:强烈建议只实施第1点

注意:未定义索引/未定义偏移

当您(或PHP)尝试访问数组的未定义索引时,会出现此通知

处理这一问题的方法:

  1. 在访问该索引之前,请检查该索引是否存在。为此,您可以使用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']:'';
    
  2. 当语言结构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个变量都是超全局变量,都是大写

相关的:

  • 注意:未定义的变量
  • 注意:未定义索引

发表评论