当前位置: 首页 > 知识库问答 >
问题:

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

端木弘方
2023-03-14

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

这些错误信息的含义是什么?

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

我怎么修理它们?

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

相关元讨论:

  • 对于重复问题可以做什么?
  • “参考问题”有意义吗?

共有2个答案

邢璞
2023-03-14

试试这些

Q1:这个通知意味着$varname没有在脚本的当前范围中定义。

Q2:在使用任何可疑变量之前使用isset()、empty()条件效果很好。

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';

// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
     $user_name = $_SESSION['user_name'];
}

或者,作为一个快速和肮脏的解决方案:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

关于会话的说明:

>

  • 使用会话时,需要将session_start();放置在所有使用会话的文件中。

    http://php.net/manual/en/features.sessions.php

  • 轩辕经赋
    2023-03-14

    来自PHP手册的大量智慧:

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

    来自PHP文档:

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

    这意味着您只能使用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联机PHP编辑器中测试上述片段

    尽管PHP不需要变量声明,但它还是建议使用变量声明,以避免一些安全漏洞或错误,在这些漏洞或错误中,人们会忘记给稍后将在脚本中使用的变量赋值。PHP在未声明变量的情况下所做的是发出一个非常低级别的错误e_notece,这个错误在默认情况下甚至不报告,但手册建议在开发过程中允许。

    处理问题的方法:

    >

  • 建议:声明变量,例如,当您尝试向未定义的变量追加字符串时。或者使用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'] : '';
    

    这在PHP7.0之后变得更加清晰,现在您可以使用null coalesce操作符:

    // 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_notece的一个快速方法是:

    error_reporting( error_reporting() & ~E_NOTICE )
    

    使用@运算符取消显示错误。

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

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

    处理问题的方法:

    >

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

    //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');
    

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

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

    使用$_post$_get$_session时,经常会出现上述通知。对于$_post$_get,您只需在使用它们之前检查索引是否存在。对于$_session,必须确保会话是用session_start()启动的,并且索引也存在。

    还要注意,所有3个变量都是超全局的,并且是大写的。

    相关:

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

  •  类似资料:
    • 问题内容: 我正在运行PHP脚本,并继续收到如下错误: 注意:第10行上C:\ wamp \ www \ mypath \ index.php中的未定义变量:my_variable_name 注意:未定义的索引:第11行的my_index C:\ wamp \ www \ mypath \ index.php 第10和11行看起来像这样: 这些错误消息是什么意思? 为什么它们突然出现?我曾经使用此

    • 问题内容: 我正在运行一个 PHP 脚本并继续收到如下错误: 注意:未定义变量:第 10 行 C:\wamp\www\mypath\index.php 中的 my_variable_name 注意:未定义索引:第 11 行的 my_index C:\wamp\www\mypath\index.php 第 10 行和第 11 行如下所示: 这些错误消息的含义是什么? 为什么它们会突然出现?我曾经使用

    • 代码: 错误: 我该怎么解决这个问题?

    • 我安装了Ngnix服务器,并将其配置为: } 我收到以下错误(从我的error.log复制): 2015/12/16 00:27:37[错误]952#0:*9 FastCGI发送到stderr:“PHP消息:PHP通知:未定义索引:第245行/usr/share/nginx/html/admin interface/login.PHP中的用户名PHP消息:PHP通知:未定义索引:第249行/usr

    • 奇怪的是,自定义图标在三星Mini(jelly bean)和Nexus 4(API 27)模拟器上显示正确,但在三星A6(Oreo)和华为Honory Lite 9(Oreo)设备上却显示不正确,在这些设备上,我看到了默认的绿色背景白色droid图标。 通知始终显示,但在某些设备上不使用自定义图标。 我尝试在AssetStudio中实现它,并且使用和不使用Notification Builder实

    • 问题内容: 我在PHP中收到以下错误 注意未定义的偏移量1:在C:\ wamp \ www \ includes \ imdbgrabber.php第36行中 这是导致它的PHP代码: 错误是什么意思? 问题答案: 如果找不到匹配项,则为空数组。因此,您应该在访问之前检查是否找到了匹配项,例如: