zoukankan      html  css  js  c++  java
  • thinkphp 3.2.3 addAll方法的坑

    在批量插入一组数据的时候,总是提示以下错误

    Insert value list does not match column list: 1136 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[0]){
                        $value[]   =  $val[1];
                    }elseif(is_scalar($val)){
                        if(0===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[0]){
                        $value[]   =  $val[1];
                    }elseif(is_scalar($val) || is_null($val)){
                        if(0===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,其他版本没测试!

  • 相关阅读:
    判断闰年
    正向代理(Forward Proxy)与反向代理(Reverse Proxy)
    What do we need to know about Vue.js?(译)
    How To Create A GitHub Profile README(译)
    Building a carousel component in React using Hooks(译)
    What is Redux JS(译)
    Weekly Contest 197
    koa-compose源码阅读与学习
    js 事件循环消息队列和微任务宏任务
    记一次字节跳动的面试
  • 原文地址:https://www.cnblogs.com/dragondean/p/thinkphp-addall-bugs.html
Copyright © 2011-2022 走看看