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,其他版本沒測試!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM