使用 PHP 的“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”

2023-11-21

我正在运行 PHP 脚本并继续收到如下错误:

注意:未定义变量:第 10 行 C:\wamp\www\mypath\index.php 中的 my_variable_name

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

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

第 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 for people to link to as duplicate, instead of having to explain the issue over and over again. I feel this is necessary because most real-world answers on this issue are very specific.

Related Meta discussion:

  • What can be done about repetitive questions?
  • Do “reference questions” make sense?

此错误消息的目的是helpPHP 程序员在访问不存在的变量(或数组元素)时发现拼写错误或错误。所以一个好的程序员:

  1. 确保每个变量或数组键在使用时都已定义。如果需要在函数内部使用变量,则必须将其作为参数传递给该函数。
  2. 请注意此错误并继续修复它,就像处理任何其他错误一样。它可能表示拼写错误或某些过程未返回应有的数据。
  3. 只有在极少数情况下,当事情不受程序员控制时,才可以添加代码来避免此错误。但这绝不应该是一种盲目的习惯。

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

尽管 PHP 不需要变量声明,但它确实建议这样做,以避免一些安全漏洞或错误,即人们会忘记为稍后在脚本中使用的变量赋值。 PHP 在未声明变量的情况下会发出以下错误E_WARNING level.

此警告可帮助程序员发现拼写错误的变量名称或类似的错误(例如在评估为 false 的条件内为变量分配了一个值)。此外,未初始化的变量还可能存在其他问题。就像它一样stated在 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 ?? '';
    

    对于古老的 PHP 版本(

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

    Be aware尽管如此,它本质上仍然是一种错误抑制,尽管只是针对一个特定的错误。因此,它可能会阻止 PHP 通过标记统一变量来帮助您。

  2. 使用以下命令抑制错误@ 操作员。由于历史原因而离开这里,但认真地说,这是不应该发生的。

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

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

当您(或 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 or 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;
    
  • 可选的 QUERY STRING 元素或 cookie 应以相同的方式处理

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

但分配应该在脚本的一开始就完成。验证所有输入,将其分配给局部变量,并在代码中一直使用它们。因此,您要访问的每个变量都会故意存在。

Related:

  • 注意:未定义的变量
  • 注意:未定义索引
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PHP 的“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量” 的相关文章

  • 搜索数组中的最高键/索引

    我怎样才能得到highest key index在一个数组中php questions tagged php 我知道如何为价值观做这件事 例如 我想从这个数组中得到10 as an integer value arr array 1 gt
  • Yii2 从 MySQL 中的表登录的分步指南

    我开始在 Yii2 中迈出第一步 到目前为止 我已经能够编写一个应用程序并将数据库中的表连接到它 就像我在 Yii1 中学到的那样 该表是contacts我的创建视图中的表单将数据发送到数据库 没有任何问题 问题是我只能在 Yii2 内置的
  • 升级到 Yosemite 后 Apache 配置损坏

    昨天我升级到 Yosemite 现在我的 Web 开发本地配置不再起作用 我设法在下面设置了一个 userdir Users user public html我可以通过以下方式访问所有网站localhost user websitename
  • 如何使用 PHP 在邮件正文中发送 Base64 图像?

    我正在尝试使用下面的代码使用 PHP 发送一封正文上包含 base64 图像的电子邮件 但该图像永远不会出现 如果我更改为 URL 它可以工作 但它不能与 base64 一起使用 我只在新页面上测试了base64 img src base6
  • 如何在 WordPress 中添加 PHP 页面链接到我的页脚

    我创建了一个自定义 PHP 页面名称 privacy policy 名称为privacy php 我如何链接页脚中的页面 以便当有人点击隐私链接时页面打开 我已在此页面中调用页眉和页脚 这个怎么做 谢谢 In the wp content
  • 在 Twig 中使用 PHP 函数

    我有一个 PHP 代码 用于在我的通用控制器中为我的 Twig 模板添加一个新类 opencart htdocs catalog controller common cart php 该代码应检查设备是否是移动设备 function onS
  • 如何使用 Libsodium-PHP 加密/解密 AES

    我需要用 PHP 加密 解密数据 我对此完全陌生 但是我读到 Libsodium PHP 是 AES 加密的最佳工具 就像我研究过的其他 PHP 加密库一样 Libsoduim PHP 似乎几乎没有提供如何使用该库的文档 我能够找到 任何有
  • 将 C++ 数组传递给 Ada95

    我正在尝试将无符号整数数组从 C 传递到 Ada Ada Lovelace 教程指出 Ada 数组对应于 C 中指向数组第一个元素的指针 这就是我正在尝试做的事情 C unsigned int buffer bufferSize unsig
  • htmlspecialchars() 期望参数 1 为字符串,Laravel 中给出的数组

    我的程序中出现了这个错误Laravel刀片模板 htmlspecialchars 期望参数 1 为字符串 给定数组 我尝试将数组转换为刀片模板中的字符串 这是代码 Where silderImageDataArray是这里存储的变量和值 这
  • PHP 编译器 openssl 错误

    在提问之前 我必须说我已经tried堆栈和其他地方的每个类似问题都失败了 我无法使用composer因为这个错误 requires ext openssl gt the requested PHP extension openssl is
  • 在 Symfony 中重定向之前访问调试(分析器)信息

    提交表单后 我通常将用户重定向到另一个页面 表单本身除外 因此我丢失了配置文件 调试信息 如日志 我的意思是 单击 调试工具栏 后 我会获得有关重定向后请求的信息 但我确实知道 Symfony 保留有关上一页的信息 我的意思是它不会忘记它
  • PHP - 为什么使用 Guzzle 而不是 cURL?

    在我的应用程序中 我最初开始使用 cURL 从各种 API 检索数据 今天 我尝试使用 Guzzle 来完成同样的任务 到目前为止 cURL 和 Guzzle 似乎都工作得同样好 判断依据Github https github com gu
  • 如何从 foreach(PHP) 中只获取一个结果

    该代码循环一个数组并显示用户的所有视图 现在情况发生了变化 我只需要显示 foreach 循环的一个结果 我怎么做 table class report edits table thead tr class dates row td div
  • Yii2 - 如何自动加载自定义类?

    我创建了以下自定义类 我想在我的 Yii2 应用程序中使用它 common components helper CustomDateTime php namespace common components helper class Cust
  • 来自发布数据的 CodeIgniter 未通过

    我试图在 CodeIgniter 中上传文件 但是当我添加 enctype multipart form data 时 不会有任何发布数据通过 甚至其他领域也根本没有 但是 当我不添加它时 我可以获得其他帖子数据 但当然没有文件上传 这里出
  • 如何使用 PHP 代码从服务器下载文件

    如何从任何服务器下载 PHP 代码文件 您可以使用 Curl 使用 php 从网络下载文件 function curl get file contents URL c curl init curl setopt c CURLOPT RETU
  • PHP:switch 与 if [重复]

    这个问题在这里已经有答案了 哪种形式更有效率 这个 switch var case 1 break case 2 break 或者这个 if var 1 elseif var 2 在性能方面 性能方面完全无关 As PHPBench htt
  • bash.sh 运行 cron 的权限被拒绝

    如何在这里使用 bash 脚本运行 cron 我做了如下操作 这里有错误 我想知道如何在 ubuntu 中做到这一点 我现在对它感到震惊 bash sh 文件 bin bash cd var www Controller usr bin p
  • 获取 Blob 图像并将该图像转换为 Bitmap 图像

    我正在从数据库中获取 blob 格式的图像 我想将其转换为位图图像 我用来将位图转换为 Blob 的代码放在下面 但是请告诉我如何反转它 ByteArrayOutputStream boas new ByteArrayOutputStrea
  • 如何找到数组中的最小数字并返回该数组的主索引?

    我有一个如下所示的数组 我想找到 diff 索引中数字最小的数组 所以在这种情况下 我想取回数组 7 我需要的只是数组编号 即 7 而不是任何其他信息 我知道我可以使用 array column 轻松找到最小的数字 但如何返回整个数组索引

随机推荐