8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

消息:尝试访问 null 类型值的数组偏移量

flavalv 2月前

119 0

我在使用一个脚本(invoiceplane)时多次遇到此错误,该脚本已经使用了几年,但不幸的是它的创建者尚未对其进行维护:消息:尝试访问

我在使用一个脚本(invoiceplane)时多次遇到此错误,该脚本已经使用了几年,但不幸的是它的创建者尚未对其进行维护:

Message: Trying to access array offset on value of type null

我的服务器已升级到 PHP 7.4,我正在寻找一种方法来解决问题并自己维护脚本,因为我对此非常满意。

出现错误的行内容如下:

$len = $cOTLdata['char_data'] === null ? 0 : count($cOTLdata['char_data']);

$cOTLdata 传递给函数:

public function trimOTLdata(&$cOTLdata, $Left = true, $Right = true)
{
    $len = $cOTLdata['char_data'] === null ? 0 : count($cOTLdata['char_data']);
    $nLeft = 0;
    $nRight = 0;
    //etc

它包含在 mpdf ,但简单地覆盖 github 存储库中的文件并不能修复错误。

帖子版权声明 1、本帖标题:消息:尝试访问 null 类型值的数组偏移量
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由flavalv在本站《codeigniter》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 发生这种情况是因为 $cOTLdata 为空。以前版本的 PHP 可能对此类错误不太严格,会默默地忽略错误/通知,而 7.4 不再这样做。

    要检查是否 $cOTLdata 为空,请使用 is_null() :

    is_null($cOTLdata)
    

    这意味着该行看起来应该是这样的:

    $len = is_null($cOTLdata) ? 0 : count($cOTLdata['char_data']);
    

    然而,如果 $cOTLdata $cOTLdata['char_data'] 都不存在,你可以 isset() 同时使用两者:

    $len = !isset($cOTLdata['char_data']) ? 0 : count($cOTLdata['char_data']);
    
  • foo 2月前 0 只看Ta
    引用 3

    似乎合乎逻辑,我打了自己一巴掌,想着自己也能想到这一点。怪昨晚太晚了 :) 改变所有这些情况将是一项艰巨的工作,但比转移到另一个系统要好。我会先用一个情况测试一下。谢谢。

  • @kipruto 如果您对答案不满意,您可以随时提出新问题。但请注意,即使这个问题被标记为重复,因为这是一个相当常见的问题,因此阅读其他答案可能是个不错的第一步。

  • 此错误意味着您尝试使用 null 数组。您的代码在此处尝试执行的操作类似于 null['char_data'] ,这显然毫无意义。

    出现此错误可能有两个原因:

    1. 有些函数可能会返回一个有意义的数组或 null .
    2. 您的代码中有一个错误。

    当需要空值时

    在某些情况下,null 是合法值。例如,函数可能返回一个有意义的数组或 null ,就像 PHP mysqli API 中的情况一样。在这种情况下,必须先测试此返回值,如下所示:

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

    另一种情况是当你处理外部变量或任何其他不受你控制的情况时。 在这种情况下,你必须首先验证输入数据 .

    例如,如果你期望从表单获取一个数组,并且该数组是 必需的 ,请验证它并返回错误,例如

    if (!isset($_POST['options']) || !is_array($_POST['options'])) {
       // inform the user and stop execution
    } else {
        $options = $_POST['options'];
    }
    // now you can safely use count() on $options
    

    如果数组是可选的,您可以将其初始化为空数组:

    if (!isset($_POST['options'])) {
        $options = [];
    } elseif (!is_array($_POST['options'])
       // inform the user ad stop execution
    } else {
        $options = $_POST['options'];
    }
    // now you can safely use count() on $options
    

    如果你的代码中有 bug

    你必须修复它。

    您必须明白使用 isset() 不会解决问题。它只会将其扫到地毯下,有效地充当 错误抑制 运算符,因此当您的某些函数开始返回不正确的值时,您将永远不会收到有用的错误消息,该消息可以解释为什么您的程序突然停止工作。

  • 有 \'null\' 不一定是错误。您可以使用布尔思维将 0 与 1 等视为标志。因此不是逻辑错误。这是大多数其他语言中的常用方法。只是一种想法。

  • @DebbieKurth 我不确定我是否明白。0、1 或布尔值与数组有什么关系?

  • 似乎正在发生的事情是,PHP 计算在嵌入数组和使用输出方面存在问题。这是一个嵌套计算问题,在其他语言中很正常。\'这是代码的逻辑错误\' 的评论并不属实。这是 PHP 软件在嵌套引用方面存在问题。因此,解决方案 $key = isset($value['offset']) ? $value['offset']: 0; 可以解决这个问题。

  • @DebbieKurth 不,“PHP 软件”在处理“嵌套引用”时没有任何问题(并且此错误与“嵌套引用”完全无关)。如果访问 $value['offset'] 导致此错误,则意味着您的代码有问题,而不是 PHP。此错误意味着 $value 为 NULL,但由于某些未知原因,您的代码试图将此 null 视为数组,这对任何语言来说都是没有意义的。因此,您不是修复此错误,而是将其消除。此外,要消除此错误,您必须执行 isset($value),而不是像您的示例中那样执行 isset($value['offset'])。

  • 嗯,除非您将其从嵌套中拉出,否则它会失败,并给出错误“警告 - 尝试访问类型为 null 的值上的数组偏移量”。所以我能说什么呢。我不得不检查我的所有插件软件并进行更正,这样错误就消除了。将嵌套计算拉出。您所做的就是将语句拉出并放入另一个变量中。引用原始行中的变量,使用回显技术时通常是嵌套的 HTML 值。然后它就起作用了。

  • 给出的警告:

    Warning - Trying to access array offset on value of type null - PHP 7.4.0 #7776
    

    结果来自此代码片段 $key = $key[1]; ,可以使用以下方法解决:

    $key = isset($key[1]) ? $key[1] : null;
    
  • 对于那些不寻求深入细节的人来说,这是一个快速修复,我很感激。我使用的是过时的 XenForo 安装说明

    if ($_POST['t'] == 0) {
        /* get by id */
        $finder = \XF::finder('XF:User');
        $user = $finder->where('user_id', $_POST['v'])->fetchOne();
    } else {
        /* get by name */
        $finder = \XF::finder('XF:User');
        $user = $finder->where('username', $_POST['v'])->fetchOne();
    }
    $columns = array("user_id", "username", "last_username");
    for ($i = 0; $i < sizeof($columns); $i++) {
        $column = $columns[$i];
        $columns[$i] = array($column, $user[$column]);
    }
    

    所以只需添加 php !isset || !is_array

    if (!isset($_POST['t']) || !is_array($_POST['t'])) {
        /* get by id */
        $finder = \XF::finder('XF:User');
        $user = $finder->where('user_id', $_POST['v'])->fetchOne();
    } else {
        /* get by name */
        $finder = \XF::finder('XF:User');
        $user = $finder->where('username', $_POST['v'])->fetchOne();
    }
    $columns = array("user_id", "username", "last_username");
    for ($i = 0; $i < sizeof($columns); $i++) {
        $column = $columns[$i];
        $columns[$i] = array($column, $user[$column]);
    }
    
  • 在访问数组中的任何元素之前,请确保整个数组本身不为空,您可以使用 if 语句和 isset() 方法检查,如下所示

    if(!isset($cOTLdata)){
    //Handle the case where array is null
      return;
    }
    $list=$cOTLdata['char_data'];
    }
    
  • 如果你在 mpdf 中遇到这个问题,那么

    1. 转到 Mpdf.php
    2. 搜索此行: $e = $this->otl->applyOTL($e, $this->CurrentFont['useOTL']);
    3. 替换为: $e = preg_replace("/[\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8e\xe2\x80\x8f]/u", '', $e); $e = preg_replace("/[\xef\xbb\xbf]/u", '', $e);
  • 我是 PHP 新手,但这解决了我的问题。

      $user_type_res = $connection->query(query: "SELECT `user_type` from `users` WHERE email='$email'");
          $user_type = $user_type_res->fetch_assoc()['user_type'];
    

    因此,我们的想法是首先查询表中的列,然后获取该列的关联以获取数据

返回
作者最近主题: