[fastadmin] 第五十五篇 搞定 Shopro 订单详情“不存在”及“科学计数法”报错

AI摘要
本文针对FastAdmin+Shopro开发中订单详情页因超长订单号被PHP误转为科学计数法导致查询失败的问题,提供了修复方案。核心步骤是修改控制器代码,将传入的ID参数强制转换为字符串,并根据ID长度智能匹配订单号或主键ID进行查询,从而避免精度丢失。这是一篇技术性的【知识分享】文章,提供了具体的代码示例和解决思路。

快速搞定 Shopro 订单详情“不存在”及“科学计数法”报错

在使用 FastAdmin + Shopro 开发时,你可能会遇到在前台访问订单详情页却提示“订单不存在”的情况。通过打印 SQL 发现,原本长长的订单号(如 20260122...)竟然变成了类似 2.0260E+23 的科学计数法。

请求api如下:

http://shopadmin.xxxx.com/index.php/addons/shopro/order.order/detail?id=202601223288531440001400&order_sn=202601223288531440001400

sql 如下:

SELECT * FROM `fs_shopro_order` WHERE (  `user_id` = 14  AND `id` = 2.0260122328853E+23 ) AND `xmy_shopro_order`.`deletetime` IS NULL LIMIT 1

这是因为 PHP 在处理超长数字字符串时,若未强制指定类型,可能会将其误认为浮点数导致精度丢失。本文教你用 3 分钟完成修复。


修改步骤

请打开文件:addons/shopro/controller/order/Order.php

1. 找到 detail 方法

定位到 detail() 函数,你会发现原逻辑通常只通过主键 id 配合 find() 方法查询。

2. 替换核心逻辑

detail 方法的内容替换为以下代码:

PHP

public function detail()
{
    $user = auth_user();
    // 关键点1:强制转换为字符串,防止大数字变成科学计数法
    $id = (string)$this->request->param('id');

    // 关键点2:兼容查询。如果长度较长则匹配订单号,否则匹配主键ID
    $order = OrderModel::where('user_id', $user->id)
        ->where(function($query) use ($id) {
            if (strlen($id) > 10) {
                $query->where('order_sn', $id);
            } else {
                $query->where('id', $id);
            }
        })
        ->with(['items', 'invoice'])
        ->find();

    if (!$order) {
        $this->error('订单不存在');
    }

    $orderModel = new OrderModel();
    $order = $orderModel->setOrderItemStatusByOrder($order);

    // 注入商品类型逻辑(按需保留)
    if (isset($order['items'])) {
        foreach ($order['items'] as &$item) {
            $g_type = $item['goods_type'] ?? 'normal';
            $item['goods_type_text'] = $this->getGoodsTypeLabel($g_type);
        }
    }

    $this->success('获取成功', $order);
}

为什么这样改有效?

  • 字符串化处理:通过 (string)$id 确保订单号在 PHP 层级始终以文本形式存在,杜绝了被转为 float 导致精度丢失的可能。

  • 智能匹配:利用 strlen($id) > 10 这一简单规则自动识别用户传的是“内部自增ID”还是“对外展示订单号”,极大提升了接口的兼容性。

  • 权限锁定:始终保留 where('user_id', $user->id),确保用户只能查看自己的订单,安全不降级。

最后一步

修改保存后,请务必前往 FastAdmin 后台 -> 右上角 -> 点击“清除缓存”

现在,再次访问详情页,长订单号也能秒速找回!


想让虚拟商品在发货后自动确认收货? 欢迎查看我的下一篇技术分享。

本作品采用《CC 协议》,转载必须注明作者和本文链接
• 15年技术深耕:理论扎实 + 实战丰富,教学经验让复杂技术变简单 • 8年企业历练:不仅懂技术,更懂业务落地与项目实操 • 全栈服务力:技术培训 | 软件定制开发 | AI智能化升级 关注「上海PHP自学中心」获取实战干货
wangchunbo
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
啥活都干 @ 一人企业
文章
362
粉丝
376
喜欢
586
收藏
1159
排名:58
访问:12.9 万
私信
所有博文
社区赞助商