在批量插入一組數據的時候,總是提示以下錯誤
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,其他版本沒測試!