报错:'注意:未定义的变量”,'注意:未定义的索引”,'警告:未定义的数组键”,还有'注意:未定义的偏移量”使用 PHP
P粉046878197
P粉046878197 2023-07-20 11:17:02
0
2
822

我正在运行一个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粉046878197
P粉046878197

全部回复(2)
P粉116631591

试一下这个

// 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);
P粉722521204

这个错误信息旨在帮助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';

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!