开发者社区 问答 正文

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

我正在运行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"];

这些错误消息是什么意思?

为什么它们突然出现?我曾经使用此脚本多年,但从未遇到任何问题。

我该如何解决?

展开
收起
保持可爱mmm 2020-01-13 10:04:14 911 分享 版权
1 条回答
写回答
取消 提交回答
  • 如果变量不存在,则不会生成警告。这意味着 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在线PHP编辑器中测试以上代码段

    尽管PHP不需要变量声明,但它确实推荐这样做,以避免某些安全漏洞或bug,因为这些漏洞或bug可能会忘记为变量提供值,该变量将在脚本的后面使用。在未声明变量的情况下,PHP会发出一个非常低级的错误,E_NOTICE默认情况下甚至不会报告该错误,但《手册》建议在开发过程中允许这样做。

    解决问题的方法:

    推荐:声明变量,例如,当您尝试将字符串附加到未定义的变量时。或使用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'] : '';
    
    自PHP 7.0起,它变得更加干净,现在您可以使用null合并运算符:
    
    // 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 )
    
    使用@运算符抑制错误。
    

    注意:强烈建议仅实施第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');
    

    两个变量用于访问两个数组元素,但是只有一个数组元素index 0,因此将生成:

    注意:未定义的偏移量:1
    

    $_POST/ $_GET/ $_SESSION可变

    使用或时$_POST,以上提示经常出现。对于,您只需要在使用索引之前检查索引是否存在。因为您必须确保您以会话开始,并且索引也存在。$_GET$_SESSION$_POST$_GET$_SESSIONsession_start()

    另请注意,所有3个变量都是超全局变量,并且均为大写。

    问题来源于stack overflow

    2020-01-13 11:56:59
    赞同 展开评论
问答分类:
问答地址: