think-rom(thinkphp) 数据库参数绑定bigint被处理成浮点数(科学计数)问题

背景

think-orm(db库)在处理长整型参数时会进行一次安全处理转换成浮点型,但php浮点数超过一定长度就会失去精准度变成科学计数,导致where条件匹配不上,这个问题目前覆盖thinkphp3到8全系;

解决方案

  • 全局搜索 (float) val\[0\] : val0 找到如下图代码,不同版本可能位置不大一样,自行处理
  • 修改成如下代码
php 复制代码
/**
     * 参数绑定
     * 支持 ['name'=>'value','id'=>123] 对应命名占位符
     * 或者 ['value',123] 对应问号占位符
     * @access public
     * @param array $bind 要绑定的参数列表
     * @return void
     * @throws BindParamException
     */
    protected function bindValue(array $bind = []): void
    {
        foreach ($bind as $key => $val) {
            // 占位符
            $param = is_numeric($key) ? $key + 1 : ':' . $key;

            if (is_array($val)) {
                if (PDO::PARAM_INT == $val[1] && '' === $val[0]) {
                    $val[0] = 0;
                } elseif (self::PARAM_FLOAT == $val[1]) {
                	// $val[0] = is_string($val[0]) ? (float) $val[0] : $val[0]; // 原代码
                    $val[0] = (is_string($val[0]) && !preg_match("/^\d+(\.\d+)?$/", $val[0]))  ? (float) $val[0] : $val[0]; // 修复后的代码
                    $val[1] = PDO::PARAM_STR;
                }

                $result = $this->PDOStatement->bindValue($param, $val[0], $val[1]);
            } else {
                $result = $this->PDOStatement->bindValue($param, $val);
            }

            if (!$result) {
                throw new BindParamException(
                    "Error occurred  when binding parameters '{$param}'",
                    $this->config,
                    $this->getLastsql(),
                    $bind
                );
            }
        }
    }
相关推荐
2603_965148111 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl1 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
xfhuangfu2 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT2 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData3 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean3 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean3 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
浪子明X4 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.4 小时前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠4 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle