搜索

首页  >  问答  >  正文

报错:“注意:未定义的变量”,“注意:未定义的索引”,“警告:未定义的数组键”,还有“注意:未定义的偏移量”使用 PHP

我正在运行一个PHP脚本,但不断收到如下错误:

Notice: Undefined variable: my_variable_name in C:wampwwwmypathindex.php on line 10

Notice: Undefined index: my_index C:wampwwwmypathindex.php on line 11

Warning: Undefined array key "my_index" in C:wampwwwmypathindex.php on line 11

第10行和第11行看起来是这样的:

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

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

为什么它们突然出现?我用这个脚本已经用了好几年了,以前从来没有出过任何问题。

如何修复这些错误?


P粉046878197P粉046878197495 天前876

全部回复(2)我来回复

  • P粉116631591

    P粉1166315912023-07-21 10:56:23

    试一下这个

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

    回复
    0
  • P粉722521204

    P粉7225212042023-07-21 09:48:50

    这个错误信息旨在帮助PHP程序员在访问不存在的变量(或数组元素)时发现拼写错误或错误。因此,一个优秀的程序员应该:

    1. 确保在使用变量或数组键之前,每个变量或数组键都已经定义。如果需要在函数内部使用变量,则必须将其作为参数传递给该函数。
    2. 关注此错误并进行修复,就像处理其他错误一样。它可能指示拼写错误或某个过程未返回应有的数据。
    3. 只有在程序员无法控制的罕见情况下,才可以添加代码来规避此错误。但绝不能成为一种盲目的习惯。

    注意/警告:未定义的变量

    尽管PHP不要求变量声明,但建议进行声明,以避免一些安全漏洞或错误,其中一个人可能会忘记给一个变量赋值,而这个变量稍后会在脚本中使用。在未声明变量的情况下,PHP会发出一个E_WARNING级别的错误。

    此警告帮助程序员发现拼写错误的变量名或类似的错误(例如,在条件求值为false时将变量赋值)。此外,未初始化变量可能存在其他可能的问题。正如PHP手册中所述,

    这意味着变量可能从包含的文件中获取一个值,并且这个值将被用来替代访问未初始化变量时所期望的null值,这可能导致不可预测的结果。为了避免这种情况,最好在使用之前对PHP文件中的所有变量进行初始化。

    处理这个问题的方法有以下几种:

    1. 推荐的方法是在使用之前声明每个变量。这样,只有在实际犯错尝试使用不存在的变量时,才会看到这个错误,这也是出现这个错误信息的原因。

      //Initializing a variable
       $value = ""; //Initialization value; 0 for int, [] for array, etc.
       echo $value; // no error
       echo $vaule; // an error pinpoints a misspelled variable name
    • 一个特殊情况是当一个变量被定义但在函数中不可见。在PHP中,函数有自己的变量作用域,如果你需要在函数中使用外部的变量,它的值必须作为函数的参数传递进来:

      function test($param) {
          return $param + 1; 
      }
      $var = 0;
      echo test($var); // now $var's value is accessible inside through $param
    1. 使用空值合并运算符来抑制错误。但请记住,这样PHP将无法通知您使用了错误的变量名。

      // Null coalescing operator
       echo $value ?? '';

      For the ancient PHP versions (< 7.0) isset() with ternary can be used

      echo isset($value) ? $value : '';

      请注意,尽管这本质上是一种错误抑制,但仅适用于特定的错误。因此,它可能会阻止PHP通过标记未初始化的变量来帮助您。

    2. 使用@运算符来抑制错误。这里为了历史原因而保留,但严肃地说,这种情况本不应发生。

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

    注意:未定义的索引/未定义的偏移量/警告:未定义的数组键

    当您(或PHP)尝试访问数组的未定义索引时,会出现此提示/警告。

    内部数组

    在处理内部数组时,即在您的代码中定义的数组,应采取完全相同的态度:在使用之前初始化所有键。这样,这个错误就能够完成其预期的工作:通知程序员代码中的错误。因此,处理方法是相同的:

    建议:声明数组元素:

    //Initializing a variable
        $array['value'] = ""; //Initialization value; 0 for int, [] for array, etc.
        echo $array['value']; // no error
        echo $array['vaule']; // an error indicates a misspelled key

    特殊情况是当某个函数返回数组或其他值(如null或false)时。在尝试访问数组元素之前,必须进行测试,例如:

    $row = $stmt->fetch();
    if ($row) { // the record was found and can be worked with
        echo $row['name']; 
    }

    外部数组

    对于外部数组(如$_POST / $_GET / $_SESSION或JSON输入),情况有所不同,因为程序员无法控制这些数组的内容。因此,检查某个键是否存在,甚至为缺失的键分配默认值是合理的。

    • 当一个PHP脚本包含一个HTML表单时,很自然地,在第一次加载时没有表单内容。因此,这样的脚本应该检查是否提交了表单。

      // for POST forms check the request method
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            // process the form
        }
        // for GET forms / links check the important field
        if (isset($_GET['search'])) {
            // process the form
        }
    • 一些HTML表单元素,比如复选框,如果未被选中,则不会发送到服务器。在这种情况下,使用空合并运算符分配默认值是合理的。

      $agreed = $_POST['terms'] ?? false;
    • 可选的查询字符串元素或cookie应该以相同的方式处理。

      $limit = $_GET['limit'] ?? 20;
        $theme = $_COOKIE['theme'] ?? 'light';

    但是赋值应该在脚本的最开始进行。验证所有的输入,将其赋值给本地变量,并在代码中一直使用它们。这样,你要访问的每个变量都会有意地存在。

    回复
    1
  • 取消回复