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
                );
            }
        }
    }
相关推荐
yyuuuzz13 小时前
谷歌云基础服务的入门认知
linux·运维·服务器·数据库·人工智能·github
awu的Android笔记13 小时前
网络闪断 + DNS 故障:Android弱网模拟中最容易被忽视的两个场景
android·tcp/ip
超梦dasgg13 小时前
工作中 MySQL 读写分离主从延迟:成因、影响、落地方案、生产实战处理
数据库·mysql
Wonderful U13 小时前
Python+Django实战:打造智能生鲜果蔬进销存管理系统(采购入库、库存预警、销售开单、毛利统计)
数据库·python·django
Flynt13 小时前
Android 17内存限制:我是怎么发现App被系统悄悄干掉的
android·性能优化
Demon1_Coder13 小时前
Day4-微服务-Seata默认事务
java·数据库·微服务
我是大猴子13 小时前
Redis为什么不适合做持久化和DB的区别在哪里
数据库·redis·缓存
mN9B2uk1713 小时前
数据库锁总结
数据库·oracle
闪电悠米13 小时前
黑马点评-秒杀优化-04_lua_and_db_fallback
服务器·开发语言·网络·数据库·缓存·junit·lua
Jun62614 小时前
QT(5)-第三方日志系统
开发语言·数据库·qt