我正在运行一个PHP脚本,并继续收到以下错误:

注意:未定义变量:C:\wamp\www\mypath\index中的my_variable_名称.php在线10

注意:未定义索引:my_index C:\wamp\www\mypath\index.php第11行

警告:C:\wamp\www\mypath\index中未定义的数组键"my_index".php第11行

第10行和第11行如下所示:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

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

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

我怎么把它们修好呢?


This is a General Reference question供人们链接为副本,而不必反复解释问题.我觉得这是必要的,因为关于这个问题的大多数现实世界的答案都是非常具体的.

相关元讨论:

推荐答案

Notice / Warning: Undefined variable

来自PHP Manual人的巨大智慧:

在将一个文件包含到另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的.这也是一个主要的security riskregister_globals打开.在使用未初始化的变量时会发出E_NOTICE级错误,但在向未初始化的数组追加元素时不会发出E_NOTICE级错误.isset()语言构造可用于检测变量是否已初始化.此外,更理想的解决方案是empty(),因为如果变量未初始化,它不会生成警告或错误消息.

PHP documentation开始:

如果变量不存在,则不会生成警告.这意味着

这意味着您只能使用empty()来确定是否设置了变量,此外,它还会根据00.0"""0"nullfalse[]判断变量.

例子:

$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,人们可能会忘记为稍后将在脚本中使用的变量赋值.PHP在未声明变量的情况下所做的是发出一个非常低级别的错误E_NOTICE,默认情况下甚至没有报告这个错误,但是在开发过程中会出现手册advises to allow.

处理这个问题的方法:

  1. Recommended:声明变量,例如,当您try 将字符串附加到未定义的变量时.或者在引用它们之前,使用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 coalesce operator:

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
  1. 将E_NOTICE设置为custom error handler,并将消息从标准输出重定向(可能指向日志(log)文件):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  2. 禁用报告中的Electron 通知(_O).只排除E_NOTICE个的快捷方法是:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  3. 使用@ operator suppress 错误.

Note:强烈建议只实施第1点.

Notice: Undefined index / Undefined offset / Warning: Undefined array key

当您(或PHP)try 访问数组的未定义索引时,会出现此通知/警告.

处理这个问题的方法:

  1. 在访问之前,请判断索引是否存在.为此,您可以使用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'] : '';
    
  2. 当语言构造list()试图访问不存在的数组索引时,它可能会生成:

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

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

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

#$_POST/$_GET/$_SESSION变量

在使用$_POST$_GET$_SESSION时,上面的注意事项经常出现.对于$_POST$_GET,在使用它们之前,只需判断索引是否存在.对于$_SESSION,您必须确保会话以session_start()开头,并且索引也存在.

还要注意的是,这三个变量都是superglobals,都是大写的.

相关:

Php相关问答推荐

shell_exec()在后台执行nohup时不会立即返回

Symfony序列化程序未序列化所有类字段

我如何知道BaseController中当前运行的是哪个控制器?

通过注册在Laravel中分配角色

在AJAX请求后,Laravel重定向.(不允许使用方法)

在WooCommerce中禁用客户用户角色的纳税计算

基于自定义域的每个购物车项目的WooCommerce定制数量输入步骤

PHP -将字符串拆分为两个相等的部分,但第二个字符串中的单词更多

根据WooCommerce中的自定义用户元数据值更改用户角色

如果所有请求都通过index.php路由,如何使用htaccess文件强制使用HTTPS?

在 WooCommerce 更新结帐事件上动态更新自定义内容

启用 WooCommerce 我的帐户付款方式,允许客户添加付款方式

用于更新 WooCommerce 管理产品列表中库存数量的自定义输入字段

AWS S3:当对象名称包含 % 时复制对象失败并出现错误 - 无效的复制源编码

Google Drive API 服务->文件->get('root') 失败并显示找不到文件. (范围问题?)

在 WordPress 中将自定义帖子类型永久链接设置为 root

Windows 身份验证在 IIS 中验证什么?我可以在我的情况下禁用匿名身份验证吗?

symfony/notifier + twig/inky-extra 在 dunglas/symfony-docker 中缺少 ext-xsl.

如何使用 WhatsApp Cloud API 向 WhatsApp 发送消息,而无需在发送消息之前注册收件人号码?

php preg_match 验证 Tiktok 用户名