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

  • 相关阅读:
    轨迹纠偏算法
    OpenStreetMap
    postgres create new super user
    postgis docker
    scala 命令台参数解析
    book
    Microsoft 365:OneDrive新特性,跨部门共享和协作
    2020年6月Microsoft 365 新功能速递
    Microsoft 365 解决方案:未经身份验证的用户上载文档小技巧 (2)
    Microsoft 365 解决方案:外部用户无法打开Microsoft Teams下录制的视频
  • 原文地址:https://www.cnblogs.com/dragondean/p/thinkphp-addall-bugs.html
Copyright © 2020-2023  润新知