php - 使用PHP的“注意: undefined variable ”,“注意: undefined index ”和“注意: undefined offset ”

标签 php arrays variables warnings undefined-index

我正在运行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()来确定是否设置了变量,此外,它还会根据以下变量检查变量:00.0"""0"null,< cc>或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 / isset()在引用它们之前检查它们是否已声明,如:

//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 coalesce operator了:

// Null coalesce operator - No need to explicitly initialize the variable.
$value = $_POST['value'] ?? '';

为E_NOTICE设置custom error handler并将消息重定向到标准输出之外(也许到日志文件):

set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)

禁用E_NOTICE的报告功能。仅排除!empty()的快速方法是:

error_reporting( error_reporting() & ~E_NOTICE )

@ operator抑制错误。


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

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

当您(或PHP)尝试访问数组的未定义索引时,将显示此通知。

解决问题的方法:


在访问索引之前,请检查该索引是否存在。为此,您可以使用E_NOTICEisset()

//isset()
$value = isset($array['my_index']) ? $array['my_index'] : '';
//array_key_exists()
$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';

语言构造array_key_exists()在尝试访问不存在的数组索引时可能会生成以下代码:

list($a, $b) = array(0 => 'a');
//or
list($one, $two) = explode(',', 'test string');



两个变量用于访问两个数组元素,但是只有一个数组元素,索引list(),因此将生成:


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


0 / $_POST / $_GET变量

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

另请注意,所有3个变量均为superglobals且均为大写。

有关:


Notice: Undefined variable
Notice: Undefined Index

关于php - 使用PHP的“注意: undefined variable ”,“注意: undefined index ”和“注意: undefined offset ”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49617055/

相关文章:

python - 如何使用Python根据ascii顺序移动字符

c# - 一段时间后是否重置静态变量

r - R 中长表达式的简写名称

javascript - Zip 文件 - 下载 - 然后解压缩

php - 在 ResultSet Zend Framework 2 的查询中执行?

php - 2 个并发 AJAX 上的 CodeIgniter $this->session->set_userdata()

arrays - 为什么合并排序空间复杂度 O(log(n)) 与链表?

java - 处理未定义大小的数组

php - 数据未从 PHP 发布到 MySQL 表中。请告诉我我在这里做错了什么

在 WHERE 子句中使用变量时 PHP MySQL 更新不起作用