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

背景

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

解决方案

  • 全局搜索 (float) $val[0] : $val[0] 找到如下图代码,不同版本可能位置不大一样,自行处理
    think-orm 参数绑定失精度问题
  • 修改成如下代码
/*** 参数绑定* 支持 ['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);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/129869.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建一个Vue3+Ts+Vite项目

Vue3TsVite项目(目录篇)——如何从零到一搭建Vue3后台管理系统_从零开始搭建后台管理系统_礼貌而已的博客-CSDN博客

【广州华锐互动】VR虚拟现实技术应用于新兵作战体验的优势

随着虚拟现实(VR)技术的不断发展,越来越多的军校开始将其应用于军事训练中。VR技术可以通过模拟真实的环境和情境,为学员提供更加直观、生动的训练体验。本文将从以下几个方面阐述VR虚拟现实技术在军事作战演习中的应用场景。 1.战场模拟 通过VR技术&…

Dart-Kotlin/Java/Swift/Object-C、Kotlin-C数据类型对照表

Dart-Kotlin/Java/Swift/Object-C、Kotlin-C数据类型对照表

竞赛选题 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

07_项目开发_用户信息列表

1 用户信息列表内容展示 用户信息列表,主要完成用户信息的添加、删除、修改和查找功能。 用户列表页面效果: 单击“添加用户”按钮,进入添加用户页面。 填写正确的信息后,单击“添加用户”按钮,会直接跳转到用户列表…

保研经历分享(一)

这个系列的文章主要是想记录一下自己大学期间最重要的一件事(保研!!)的经历、过程,外加一些保研流程介绍、面试经验、院校投递、踩坑经历,主要给学弟学妹们避雷,也做一些借鉴吧~ 这一篇主要是对保研过程的一些介绍&…

深度学习DAY1:神经网络NN;二元分类

深度学习笔记 DAY1 深度学习基本知识 1.神经网络 1.1 单一神经元 所有神经元将房屋大小size作为输入x,计算线性方程,结果取max(0,y),输出预测房价y ReLU函数(线性整流函数)–max(0&#xf…

【软件测试】JUnit详解

文章目录 一. Junit是什么?二.Junit中常见的注解1. Test2. BeforeAll & AfterAll3. BeforeEach & AfterEach4. ParameterizedTest参数化5. Disabled6. Order 三. 测试套件1. 通过class运行测试用例2. 通过包运行测试用例 四. 断言 一. Junit是什么? JUnit是一个用于…

一站式 API 管理和测试工具:PostCat 轻松完成接口调测 | 开源日报 No.49

rubickCenter/rubick Stars: 5.0k License: MIT Rubick 是一个基于 electron 开源工具箱的项目,它允许用户自由集成丰富插件来创建最终桌面效率工具。该项目以 Dota 英雄中的 Rubick 为名,因为他可以使用其他英雄作为插件完成任务。以下是 Rubick 的主要…

TL-ER3220G端口映射设置

1、打开IE浏览器或其它浏览器,在地址栏输入192.168.1.1登录路由器的Web管理界面; 2、打开后弹出密码输入框,输入路由器的用户名和密码,出厂默认值为admin/admin,成功登录后将看到路由器的系统状态信息; 3、…

springboot整合pi支付开发

pi支付流程图: 使用Pi SDK功能发起支付由 Pi SDK 自动调用的回调函数(让您的应用服务器知道它需要发出批准 API 请求)从您的应用程序服务器到 Pi 服务器的 API 请求以批准付款(让 Pi 服务器知道您知道此付款)Pi浏览器向…

16.(开发工具篇mysql)mysql不同库同步数据的异常记录

1:mysql导入时出现“ERROR at line : Unknown command ‘\‘‘.“的解决办法 default-character-set=utf82:ERROR 2006 (HY000) at line 71: MySQL server has gone away (1) 连接超时 查看各项连接时间: show global variables like %timeout;这些值是相对是MySQL的默认…