thinkphp 3.2.3 addAll方法的坑
2024-09-28 12:11:21
在批量插入一组数据的时候,总是提示以下错误
Insert value list does not match column list: Column count doesn't match value count at row 1
核对了半天数据库的字段和插入的数据,发现真没问题。
然后我把要执行的sql打印出来后发现valus部分少一个字段。
然后根据提示和方法逆向查看代码发现了问题:
mysql.class.php文件的insertAll方法存在缺陷
第120行开始:
foreach ($data as $key=>$val){
if(is_array($val) && 'exp' == $val[]){
$value[] = $val[];
}elseif(is_scalar($val)){
if(===strpos($val,':') && in_array($val,array_keys($this->bind))){
$value[] = $this->parseValue($val);
}else{
$name = count($this->bind);
$value[] = ':'.$name;
$this->bindParam($name,$val);
}
}
}
这里只判断了is_array和is_scalar,然后is_array比较常用,没啥问题,is_scalar的意思是判断是否是一个“标量”,然后null并不是标量,所以被跳过去了,当批量插入的时候有null则会少一个字段。所以出现文头的错误提示。
改正方法很多,比如我直接加了一个is_null判断,修改后的代码为
foreach ($data as $key=>$val){
if(is_array($val) && 'exp' == $val[]){
$value[] = $val[];
}elseif(is_scalar($val) || is_null($val)){
if(===strpos($val,':') && in_array($val,array_keys($this->bind))){
$value[] = $this->parseValue($val);
}else{
$name = count($this->bind);
$value[] = ':'.$name;
$this->bindParam($name,$val);
}
}
}
然后就一切正常了!我用的是3.2.3,其他版本没测试!
最新文章
- JavaScript: 零基础轻松学闭包
- cocos2d-x3.2创建新项目失败的一种可能性(cygwin自带的python2.6被抢先执行)
- 用node开发repl应用
- LightOJ1125 Divisible Group Sums(DP)
- python Django 学习笔记(三)—— 模版的使用
- Xcode快照——管理应用程序版本
- CSS中nth-child和nth-of-type的简单使用
- Java-Android 之动画的实现
- 解决Timer回调方法重复调用的问题
- java中的各种数据类型在内存中存储的方式
- Dagoin之modelform组件
- tomcat配置文件及性能优化
- Python常用模块:datetime
- rabbitMQ 在 windows 64位环境下无法启动(提示乱码)的解决方法
- (网页)Http状态码大全(200、404、500等)(转CSDN)
- Linter pylint is not installed
- 51nod1185 威佐夫游戏 V2 (模拟乘法)
- win10安装PS和AI后报代码为16的错误解决方法
- vue element-ui怎样提炼一个自己写的js当作公共js
- 2018.10.16 NOIP模拟 长者(主席树+hash)