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,其他版本没测试!

  • 相关阅读:
    Shortest path of the king
    二分查找c++简单模板
    2017广东工业大学程序设竞赛B题占点游戏
    2017广东工业大学程序设竞赛C题爬楼梯
    2017广东工业大学程序设竞赛E题(倒水)
    p1250 种树 贪心
    P1248 加工生产调度 贪心
    P1209 [USACO1.3]修理牛棚 Barn Repair 贪心
    P1607 [USACO09FEB]庙会班车Fair Shuttle 贪心
    P2602 [ZJOI2010]数字计数 数位dp
  • 原文地址:https://www.cnblogs.com/dragondean/p/thinkphp-addall-bugs.html
Copyright © 2011-2022 走看看