You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP7.4.20下管理员登录时uc_quote_uc_order第311行报数组偏移访问错误

错误原因

Trying to access array offset on value of type bool in uc_quote_uc_order() (第311行)
该报错核心触发逻辑如下:

  • Drupal数据库查询的fetchAssoc()方法在查询结果为空时,会返回布尔值false而非空数组
  • 当对应订单没有在uc_order_quotes表中生成过配送报价记录时,$quote = db_query(...)->fetchAssoc()拿到的结果就是false
  • 代码直接将$order->quote = $quote赋值为false后,第311行尝试以数组形式访问$quote['accessorials'],就会触发「在布尔类型值上访问数组偏移」的错误

仅管理员登录触发的原因:普通用户访问的订单基本都是完成过配送报价计算的有效订单,表中有对应记录;管理员通常有权限查看所有状态的订单,包括未完成配送流程、测试生成、已删除配送配置的无报价记录订单,所以更容易触发这个场景。

修复方案

修改load分支的代码,查询不到报价时先给$quote赋默认值,避免出现布尔值:

case 'load':
      $quote = db_query("SELECT method, accessorials, rate FROM {uc_order_quotes} WHERE order_id = :id", array(':id' => $order->order_id))->fetchAssoc();
      // 新增判断:查询结果为false时赋值为带默认字段的数组,避免后续数组访问报错
      if (!$quote) {
        $quote = [
          'method' => '',
          'accessorials' => '',
          'rate' => 0
        ];
      }
      $order->quote = $quote;
      $order->quote['accessorials'] = strval($quote['accessorials']);
break;

如果不需要保留默认字段,也可以简化判断,兼容极端场景:

case 'load':
      $quote = db_query("SELECT method, accessorials, rate FROM {uc_order_quotes} WHERE order_id = :id", array(':id' => $order->order_id))->fetchAssoc();
      // 查询为空时默认赋值为空数组
      $quote = $quote ?: [];
      $order->quote = $quote;
      // 访问字段前加isset判断,避免字段不存在的报错
      $order->quote['accessorials'] = isset($quote['accessorials']) ? strval($quote['accessorials']) : '';
break;

内容的提问来源于stack exchange,提问作者stealth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 19:15:10