Heim > php教程 > php手册 > Hauptteil

一个PHP数据库操作类源码

WBOY
Freigeben: 2016-06-21 08:57:23
Original
1320 Leute haben es durchsucht

class Core{
  /*对数组进行继承*/
  static function inHerit($arr_orgin,$arr_output){
    return array_merge($arr_orgin,$arr_output);
 
  }

  /*打印错误*/
  static function throwError($errmsg){
    echo '

error:'.$errmsg.'

';
    exit();
  }
}
?>
class db{
    private $result = array();
    private $connector = array();
    private $configs = array();
    private $active = 0;
    private $default_config = array(
        'dbtype' => 'mysql',
          'index' => 0,'user' => 'root', 'pwd' => '' ,'host' => 'localhost' ,'port'=> 3306,'charset' => 'utf8' ,'dbname' => null
    );
   
   /*初始化*/
   public function __construct($config = array()){
     if($config) $this->connect($config);
   }

   public function __destruct(){
       foreach($this->connector as $index => $connect)
           $this->{'_'.$this->configs[$index]['dbtype'].'_close'}($connect);
           
   }

   private function _mysql_close($connect){
      mysqli_close($connect);
   }
   /*选择连接*/
   public function selectConnect($index){
        return  isset($this->connector[$index]) && (($this->active = $index) || true);
   }
   /*建立连接*/
   public function connect($config){
     (!isset($config['index'])) && $config['index'] = $this->default_config['index']++  ;

     $config = Core::inHerit($this->default_config,$config);
     !in_array($config['dbtype'],array('mysql')) &&  Core::throwError('未支持的数据库类型');
     extract($config);
     $this->configs[$index] = $config;
     $this->{'_'.$config['dbtype'].'_connect'}($user, $pwd,$host,$dbname,$charset,$index,$port);
   
   }
   private function _mysql_connect($user = 'root', $pwd = '' ,$host = 'localhost' ,$dbname = null,$charset = 'utf8' ,$index = 0 ,$port = 3306){
     $this->connector[$index] =  mysqli_connect ( $host, $user, $pwd , null, $port) or Core::throwError(mysql_error());
     $this->active = $index;
     if($dbname) $this->selectDb($dbname,$charset);
   }
  
   /*取得当前连接*/
   private function _getConnect(){
     return $this->connector[$this->active];
   }
   /*取得当前连接使用的数据库类型 带参数自动拼接为函数名*/
   private function _getDbTypeFunc($funcname = null){
     $dbtype = $this->configs[$this->active]['dbtype'];
     return $funcname?'_'.$dbtype.'_'.$funcname:$dbtype;
   }
   /*选择数据库*/
   public function selectDb($dbname,$charset){
     mysqli_select_db($this->_getConnect(),$dbname) or Core::throwError(mysql_error());
     $this->_mysql_query('set names '.$charset);
   }
  
   /*执行语句*/
   private function _mysql_query($sql){
    $result = mysqli_query($this->_getConnect(),$sql) or Core::throwError(mysql_error());
    return $result;
   }

   private function _mysql_bind_by_name($sql , $sqlv){
        $sql_param = array();
       
        $getparam = $getparam2 =   '\w+?';// $getparam = array_keys($sqlv); implode('|',$getparam);
        preg_match_all('/:('.$getparam.')\b/iU',$sql,$getparam) or   Core::throwError('参数绑定错误');
       
        $getparam = $getparam[1];
        $getparam = array_flip($getparam);

        count($getparam) != count($sqlv) || array_diff_key($getparam,$sqlv) &&  Core::throwError('参数不匹配');

        $sql = preg_replace('/:('.$getparam2.')\b/iU','?',$sql)  ;
               
        $sqlv = array_merge($getparam,$sqlv);
       
        unset($getparam2);
        unset($getparam);
       
       
        $stmt = mysqli_prepare($this->_getConnect(),$sql) or Core::throwError('wrong sql:'.$sql);
       
       
        $ptype = '';
        $bindparam = array($stmt,'');
   
        foreach ($sqlv as $k => $v){
            $ptype .= $this->_getParamType($k);
            $bindparam[] = $v;
            }
        $bindparam[1] = $ptype;
   
        call_user_func_array('mysqli_stmt_bind_param',$bindparam);
        return $this->_mysql_stmt_exec($stmt,$sql);
   }

   private function _mysql_bind_in_sort(){
       $argus = func_get_args() ;
       $sql = array_shift($argus);
       $stmt = mysqli_prepare($this->_getConnect(),$sql) or Core::throwError('wrong sql:'.$sql);
       $pcount = mysqli_stmt_param_count($stmt);
      
       $pcount != count($argus)  && Core::throwError('参数不匹配');
       $ptype = str_repeat('s',$pcount);
       array_splice($argus, 0, 0 ,array($stmt,$ptype));
       call_user_func_array('mysqli_stmt_bind_param',$argus);

       return $this->_mysql_stmt_exec($stmt,$sql);
   }

   private function _mysql_stmt_exec($stmt,$sql){
         mysqli_stmt_execute($stmt);

        if($this->isSelect($sql)){ ///返回值绑定
           
            mysqli_stmt_bind_result($stmt,$a);
             while ($stmt->fetch()) {
                    print_r($a);
                    echo '
';
                }
         }
         $stmt->close();
  
   }

   /*根据参数形式使用不同函数*/
   private function _mysql_iquery($sql , $sqlv = array()){
     if ($sqlv){
         if (is_array($sqlv))
             return  $this->_mysql_bind_by_name($sql , $sqlv);
         else{
             $argus = func_get_args() ;
             return call_user_func_array(array($this,'_mysql_bind_in_sort'),$argus);
         }
     }else{
         return $this->_mysql_query($sql,$sqlv);
     }
   }
 
  /*根据键名前缀区分数据类型*/
  private function _getParamType($key){
     $r = 's';
     /*首字母小写 第二个字母大写 则第一个字母为模式前缀*/
     $mode = array(
       'i' => 'i','s' => 's','d' => 'd','b' => 'b'   
     );
     if (strlen($key) >= 2 &&  $key[0] == strtolower($key[0]) && $key[1] == strtoupper($key[1]) && in_array($key[0],$mode))
        $r = $mode[$key[0]];
   
     return $r;
  }
 /*分析sql语句 判断行为*/
  private function _cmdType($sql){
      return substr(strtolower($sql),0,strpos($sql,' '));
       
   }
   /*分析sql语句是否为select语句*/
   private function isSelect($sql){
        return  'select' == $this->_cmdType($sql);
   }
   public function query($sql , $sqlv = array()){
       $func = $this->_getDbTypeFunc('iquery');
      
       $argus = func_get_args() ;
       $argus[0] = trim($argus[0]);
       return call_user_func_array(array($this,$func),$argus);
   }
 
}
?>

$d = array(
  'dbname' => 'test',
  'charset' => 'latin1'
  );
$db = new db($d);

//数组方式绑定参数
$sqlv = array('iId1'=>'14','id2' => 30);
$r = $db -> query("select id from toselect where   id > :iId1 and id

//标准方式绑定参数
$r = $db -> query("select content from toselect where   id > ? ",13);

var_dump($r);
?>



Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!