当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP实现的数据库封装类

PHP
利用discuz实现PHP大文件上传应用实例代码
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
php在字符串中查找另一个字符串
php下HTTP Response中的Chunked编码实现方法
PHP实现定时生成HTML网站首页实例代码
PHP下一个非常全面获取图象信息的函数
PHP strtr() 函数使用说明
php 删除无限级目录与文件代码共享
php AJAX实例根据邮编自动完成地址信息
php miniBB中文乱码问题解决方法
cmd下运行php脚本
PHP 遍历XP文件夹下所有文件
php 移除数组重复元素的一点说明
discuz论坛 用户登录 后台程序代码
Optimizer与Debugger兼容性问题的解决方法
Zend Studio 无法启动的问题解决方法
php 页面执行时间计算代码
php smarty的预保留变量总结
php获取网页内容方法总结
php读取msn上的用户信息类

PHP实现的数据库封装类


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 230 ::
收藏到网摘: n/a

 PHP学习实例,数据库封装类。

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

  /*打印错误*/
  static function throwError($errmsg){
    echo '&lt;p>error:'.$errmsg.'</p>';
    exit();
  }
}
?>
<?php
class db{
    private $result = array();
    private $connector = array();
    private $configs = array();
    private $active = 0;
    private $default_config = array(
        'dbtype' => 'mysql',
          'index' =&gt; 0,'user' =&gt; 'root', 'pwd' =&gt; '' ,'host' =&gt; 'localhost' ,'port'=&gt; 3306,'charset' =&gt; 'utf8' ,'dbname' =&gt; null
    );
   
   /*初始化*/
   public function __construct($config = array()){
     if($config) $this-&gt;connect($config);
   }

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

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

     $config = Core::inHerit($this-&gt;default_config,$config);
     !in_array($config['dbtype'],array('mysql')) &&  Core::throwError('未支持的数据库类型');
     extract($config);
     $this-&gt;configs[$index] = $config;
     $this-&gt;{'_'.$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-&gt;connector[$index] =  mysqli_connect ( $host, $user, $pwd , null, $port) or Core::throwError(mysql_error());
     $this-&gt;active = $index;
     if($dbname) $this-&gt;selectDb($dbname,$charset);
   }
  
   /*取得当前连接*/
   private function _getConnect(){
     return $this-&gt;connector[$this-&gt;active];
   }
   /*取得当前连接使用的数据库类型 带参数自动拼接为函数名*/
   private function _getDbTypeFunc($funcname = null){
     $dbtype = $this-&gt;configs[$this-&gt;active]['dbtype'];
     return $funcname?'_'.$dbtype.'_'.$funcname:$dbtype;
   }
   /*选择数据库*/
   public function selectDb($dbname,$charset){
     mysqli_select_db($this-&gt;_getConnect(),$dbname) or Core::throwError(mysql_error());
     $this-&gt;_mysql_query('set names '.$charset);
   }
  
   /*执行语句*/
   private function _mysql_query($sql){
    $result = mysqli_query($this-&gt;_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-&gt;_getConnect(),$sql) or Core::throwError('wrong sql:'.$sql);
       
       
        $ptype = '';
        $bindparam = array($stmt,'');
   
        foreach ($sqlv as $k =&gt; $v){
            $ptype .= $this-&gt;_getParamType($k);
            $bindparam[] = $v;
            }
        $bindparam[1] = $ptype;
   
        call_user_func_array('mysqli_stmt_bind_param',$bindparam);
        return $this-&gt;_mysql_stmt_exec($stmt,$sql);
   }

   private function _mysql_bind_in_sort(){
       $argus = func_get_args() ;
       $sql = array_shift($argus);
       $stmt = mysqli_prepare($this-&gt;_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-&gt;_mysql_stmt_exec($stmt,$sql);
   }

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

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

   /*根据参数形式使用不同函数*/
   private function _mysql_iquery($sql , $sqlv = array()){
     if ($sqlv){
         if (is_array($sqlv))
             return  $this-&gt;_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-&gt;_mysql_query($sql,$sqlv);
     }
   }
 
  /*根据键名前缀区分数据类型*/
  private function _getParamType($key){
     $r = 's';
     /*首字母小写 第二个字母大写 则第一个字母为模式前缀*/
     $mode = array(
       'i' =&gt; 'i','s' =&gt; 's','d' =&gt; 'd','b' =&gt; 'b'   
     );
     if (strlen($key) &gt;= 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-&gt;_cmdType($sql);
   }
   public function query($sql , $sqlv = array()){
       $func = $this-&gt;_getDbTypeFunc('iquery');
      
       $argus = func_get_args() ;
       $argus[0] = trim($argus[0]);
       return call_user_func_array(array($this,$func),$argus);
   }
 
}
?>

<?php
$d = array(
  'dbname' => 'test',
  'charset' =&gt; 'latin1'
  );
$db = new db($d);

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

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

var_dump($r);
?>