DbMysql.class.php中insertAll方法bug

浏览:3332 发布日期:2014/05/09 分类:站务建议
在开发中发现DbMysql.class.php中insertAll方法有一个bug,在参数$datas的各个数组key-value排列不一致的情况下插入数据错误。例如:$datas = array(
      array('id' => 1, 'name' => 'test1'),
      array('name' => 'test2', id => 2)
)
源代码为:public function insertAll($datas,$options=array(),$replace=false) {
        if(!is_array($datas[0])) return false;
        $fields = array_keys($datas[0]);
        array_walk($fields, array($this, 'parseKey'));
        $values  =  array();
        foreach ($datas as $data){
            $value   =  array();
            foreach ($data as $key=>$val){
                $val   =  $this->parseValue($val);
                if(is_scalar($val)) { // 过滤非标量数据
                    $value[]   =  $val;
                }
            }
            $values[]    = '('.implode(',', $value).')';
        }
        $sql   =  ($replace?'REPLACE':'INSERT').' INTO '.$this->parseTable($options['table']).' ('.implode(',', $fields).') VALUES '.implode(',',$values);
        return $this->execute($sql);
    }
建议修改为: public function insertAll($datas,$options=array(),$replace=false) {
        if(!is_array($datas[0])) return false;
        $fields = array_keys($datas[0]);
        $values  =  array();
        foreach ($datas as $data){
            $value   =  array();
            foreach ($fields as $key){
                $val   =  $data[$key];
                $val   =  $this->parseValue($val);
                if(is_scalar($val)) { // 过滤非标量数据
                    $value[]   =  $val;
                }
            }
            $values[]    = '('.implode(',', $value).')';
        }
        array_walk($fields, array($this, 'parseKey'));
        $sql   =  ($replace?'REPLACE':'INSERT').' INTO '.$this->parseTable($options['table']).' ('.implode(',', $fields).') VALUES '.implode(',',$values);
        return $this->execute($sql);
    }
最佳答案
评论() 相关
后面还有条评论,点击查看>>