<?php  
class dbModel {      
    protected $fields =   array();  
      
    /** 
     * @desc 批量添加 
     *  
     * @param Array $dataList 
     * @param String $tableName 
     * @return boolean 
     */  
    public function addAll($dataList,$tableName) {  
        if (! is_array ( $dataList ) || empty($tableName))  return false;  
        $this->fields = $this->getFields($tableName);  
        foreach ( $dataList as $key => $val ) {  
            $dataList[$key] = $this->_facade($val);  
        }  
        return $this->insertAll($dataList, $tableName);  
    }  
      
  
    /** 
     * @desc 批量插入数据 
     *  
     * @param Array $datas 
     * @param String $tableName 
     * @return boolean|Ambigous <boolean, resource> 
     */  
    protected function insertAll($datas,$tableName) {  
        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){  
                if(is_scalar($val)) { // 过滤非标量数据  
                    $value[]   =  $val;  
                }  
            }  
            $values[]    = '('.implode(',', $value).')';  
        }  
        $sql   =  'INSERT INTO '.$tableName.' ('.implode(',', $fields).') VALUES '.implode(',',$values);  
        return $this->
mysql->query($sql);  
    }  
      
      
    /** 
     *  
     * @desc 得到数据表结构 
     * @param String $tableName 
     * @return Array $info 
     */  
    protected function getFields($tableName) {  
        $result = $this->mysql->findAll ( 'SHOW COLUMNS FROM ' . $tableName );  
        $info = array ();  
        foreach ( $result as $key => $val ) {  
            $info [$val ['Field']] = array (  
                    'name' => $val ['Field'],  
                    'type' => $val ['Type'],  
                    'notnull' => ( bool ) ($val ['Null'] === ''),    
                    'default' => $val ['Default'],  
                    'primary' => (strtolower ( $val ['Key'] ) == 'pri'),  
                    'autoinc' => (strtolower ( $val ['Extra'] ) == 'auto_increment')   
            );  
        }  
        return $info;  
    }  
      
    /** 
     *  
     * @desc 过滤
数据库中没有的字段数据 
     * @param Array $data 
     * @return Array $data 
     */  
    protected function _facade(&$data){  
        if(!empty($this->fields)){  
            $fields = array_keys($this->fields);  
            foreach($data as $key=>$val){  
                if(!in_array($key,$fields,true)){  
                    unset($data[$key]);  
                }else if(is_scalar($val)){  
                    // 字段类型检查  
                    $this->_parseType($data,$key);  
                }  
            }  
        }  
        return $data;  
    }  
      
    /** 
     * @desc 转义类型 
     *  
     * @param Array $data 
     * @param String $key 
     */  
    protected function _parseType(&$data,$key){  
        $fieldType = strtolower($this->fields[$key]['type']);  
        if(false !== strpos($fieldType,'char')){  
            $data[$key]   =  '''.mysql_real_escape_string($data[$key]).''';  
        }elseif(false === strpos($fieldType,'bigint') || false !== strpos($fieldType,'int')) {  
            $data[$key]   =  intval($data[$key]);  
        }elseif(false !== strpos($fieldType,'float') || false !== strpos($fieldType,'double')){  
            $data[$key]   =  floatval($data[$key]);  
        }elseif(false !== strpos($fieldType,'bool')){  
            $data[$key]   =  (bool)$data[$key];  
        }  
    }  
      
    /** 
     * @desc 转义非法字段名称 
     *  
     * @param String $key 
     * @return string $key 
     */  
    protected function parseKey(&$key) {  
        $key   =  trim($key);  
        if(!preg_match('/[,'"*()`.s]/',$key)) {  
            $key = '`'.$key.'`';  
        }  
        return $key;  
    }      
}