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
相关产品推荐
相关产品推荐

