pdo连接数据库

来源:互联网 发布:js裁剪上传图片的插件 编辑:程序博客网 时间:2024/06/05 04:08

1.基类ZDO.php:

<?php

abstract class ZDO
{
   //用于缓存数据库类型,严禁直接调用
   private $dbType;
    
   private $svTables;
   
   private $svFileds;
   
    private $svWheres;
    
   /*
   * Creates a PDO instance representing a connection to a database
   */
   abstract protected function getDbHandle();
       
   /*
   * @return string about database connection information
   */
   abstract public static function getDbDsn();

   /*
   * Prepares a statement for execution and returns a statement object
   */
   private function getStatementHandle($sql)
   {
      return $this->getDbHandle()->prepare($sql);
   }
   

   /*
   * 对字符是单引号'、双引号"、反斜线\与 NUL(NULL 字符)添加反斜线进行转义
   * 当php magic_quotes_gpc 设置为 on 时,它会对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes(),可用get_magic_quotes_gpc()检测,防止双重转义
   */
   public function escape($string)
   {
      if ('oracle' == $this->getDbType()) {
         //oracle对单引号的转义
         return str_replace("'", "''", $string);
      } else {
         return addslashes($string);
      }
   }

   /*
   * 获取所有记录集
   * json_format数组中的项是否json格式
   * $sql = "SELECT sku,sl FROM zzm_wms_pd_sku WHERE sku=:sku"; $data = array('sku'=>'xxx');
   * @return array/array
   */
   public function getAll($sql, array $data=array(), $json_format=false)
   {
      $sth = $this->getStatementHandle($sql);
      $sth->setFetchMode(PDO::FETCH_ASSOC);
      $sth->execute($data);

      if (!$json_format) {
         return $sth->fetchAll();
      }

      $arr = array();
      while ($row = $sth->fetch()) {
         $arr[] = json_encode($row);
      }

      return  $arr;
   }

    /**
     * 对对象进行处理
     * 访问多条记录
     */
    public function queryObj($obj) {
       if(!$obj)
          return false;
       return $obj->fetchAll(PDO::FETCH_ASSOC);
    }
   
   
   /*
   * 获取一行记录
   * 若查询结果集有多行,出于性能考虑,sql中应含有LIMIT 1(mysql)
   * @return array/bool(false)
   */
   public function getRow($sql, array $data=array())
   {
      $sth = $this->getStatementHandle($sql);
      $sth->setFetchMode(PDO::FETCH_ASSOC);
      $sth->execute($data);

      return $sth->fetch();
   }

   /*
   * 获取一行column记录
   * 若查询结果集有多行,出于性能考虑,sql中应含有LIMIT 1(mysql)
   * @return string/bool(false)
   */
   public function getOne($sql, array $data=array())
   {
      $sth = $this->getStatementHandle($sql);
      $sth->setFetchMode(PDO::FETCH_ASSOC);
      $sth->execute($data);

      return  $sth->fetchColumn();
   }

   /*
   * 执行语句 insert update delete
   * @return int 影响行数
   */
   public function execute($sql, array $data=array())
   {
      $sth = $this->getStatementHandle($sql);
      $sth->execute($data);

      return $sth->rowCount();
   }

   /*
   * 执行语句
   * @return a PDOStatement object, or FALSE on failure.
   */
   public function query($sql)
   {
      return $this->getDbHandle()->query($sql);
   }

   /*
   * @return int 影响行数
   */
   public function insert($tableName, array $data)
   {
      $field_arr = array_keys($data);
      $fields = implode(', ', $field_arr);
      $fields_pre = ':' . implode(', :', $field_arr);

      $sql = "INSERT INTO {$tableName} ({$fields}) VALUES ({$fields_pre})";
      if ('oracle' == $this->getDbType()) {
         //对oracle表中的DATE字段特殊处理
         $fields_arr = $this->getFields($tableName);
         foreach ($fields_arr as $field_name=>$field_type) {
            if ('DATE' == $field_type) {
               $sql = str_replace(":{$field_name}", "TO_DATE(:{$field_name},'yyyy-mm-dd hh24:mi:ss')", $sql);
            }
         }
      }
      $sth = $this->getStatementHandle($sql);
      $sth->execute($data);

      return $sth->rowCount();
   }

   /*
   * @param MIXED $condition 条件 string(调用前须转义) array(自动转义)
   * @return int 影响行数
   */
   public function update($tableName, array $data, $condition)
   {
      $fields_pre = '';
      foreach ($data as $key=>$val) {
         $fields_pre .= ", {$key}=:{$key}";
      }
      $fields_pre = ltrim($fields_pre, ', ');
      if ('oracle' == $this->getDbType()) {
         //对oracle表中的DATE字段特殊处理
         $fields_arr = $this->getFields($tableName);
         foreach ($fields_arr as $field_name=>$field_type) {
            if ('DATE' == $field_type) {
               $fields_pre = str_replace(":{$field_name}", "TO_DATE(:{$field_name},'yyyy-mm-dd hh24:mi:ss')", $fields_pre);
            }
         }
      }

      if (is_array($condition)) {
         $arr = $condition;
         $condition = '';
         foreach ($arr as $key=>$val) {
            $val = $this->escape($val);
            $condition .= ($condition ? ' AND ' : '') . "{$key}='{$val}'";
         }
      }

      $sql = "UPDATE {$tableName} SET {$fields_pre} WHERE {$condition}";
      $sth = $this->getStatementHandle($sql);
      $sth->execute($data);

      return $sth->rowCount();
   }

   /*
   * @param $sql
   * @return int 影响行数
   */
   public function updateEx($sql)
   {
      if(!$sql)
         return false;
      $sth = $this->getDbHandle()->query($sql);
      return $sth->rowCount();
   }  
   
   /*
   * 批量插入大量数据
   * @return int 影响行数
   */
   public function massInsert($tableName, array $massData)
   {
      $tempData = $massData;
      $data = array_shift($tempData);
      unset($tempData);
      $field_arr = array_keys($data);
      $fields = implode(', ', $field_arr);

      if ('oracle' == $this->getDbType()) {
         //针对oracle
         $temp_arr = $this->getFields($tableName);
         $outer_sql = '';
         foreach ($massData as $data) {
            $inner_sql = '';
            foreach ($data as $field_name=>$val) {
               $inner_sql .= ('' == $inner_sql) ? 'SELECT ' : ', ';
               //对oracle表中的DATE字段特殊处理
               $inner_sql .= ('DATE' == $temp_arr[$field_name]) ? "TO_DATE('" . $this->escape($val) ."','yyyy-mm-dd hh24:mi:ss')" : "'" . $this->escape($val) . "'";
            }
            $inner_sql .= ' FROM DUAL';
            
            $outer_sql .= ('' == $outer_sql) ? " {$inner_sql}" : " UNION ALL {$inner_sql}";
         }
         $sql = "INSERT INTO {$tableName} ({$fields}) {$outer_sql}";

      } else {

         $sql = "INSERT INTO {$tableName} ({$fields}) VALUES";
         $outer_sql = '';
         foreach ($massData as $data) {
            $inner_sql = '';
            foreach ($data as $val) {
               $inner_sql .= ('' == $inner_sql ? '' : ', ') . "'". $this->escape($val) ."'";
            }
            $outer_sql .= ('' == $outer_sql ? " " : ", ") . "({$inner_sql})";
         }
         $sql .= $outer_sql;
      }

      return $this->execute($sql);
   }

   /*
   * Returns the ID of the last inserted row or sequence value
   * Notice: when with transactions in mysql,如果放在事务以外,returns 0 instead of the insert id
   */
   public function lastInsertId()
   {
      return $this->getDbHandle()->lastInsertId();
   }

   /*
   * 开始一个事务(关闭自动提交模式,此时会提交未提交的事务)
   * @return bool
   */
   public function beginTransaction()
   {
      return $this->getDbHandle()->beginTransaction();
   }

   /*
   * 提交一个事务(恢复到自动提交模式)
   * @return bool
   */
   public function commit()
   {
      return $this->getDbHandle()->commit();
   }

   /*
   * 回滚一个事务(恢复到自动提交模式, 当在一个事务内有类似删除或创建数据表等 DLL 语句时,会自动导致一个隐式地提交。隐式地提交将无法回滚此事务范围内的任何更改。)
   * @return bool
   */
   public function rollBack()
   {
      return $this->getDbHandle()->rollBack();
   }

   /*
   * 获取表字段数组 mysql:KEY(PRI/UNI/MUL) oracle:DATA_TYPE(NUMBER/VARCHAR2)
   * @return array
   */
   public function getFields($tableName)
   {
      $fields = array();
      switch ($this->getDbType()) {
         case 'mysql':
            $sql = "DESCRIBE {$tableName}";
            $arr = $this->getAll($sql);
            foreach ($arr as $val) {
               $fields[$val['Field']] = $val['Key'];
            }
            break;
         case 'oracle':
            $sql = "SELECT COLUMN_NAME,DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME='{$tableName}'";
            $arr = $this->getAll($sql);
            foreach ($arr as $val) {
               $fields[$val['COLUMN_NAME']] = $val['DATA_TYPE'];
            }
            break;
         case 'sqlserver':
            $sql = "SELECT NAME FROM SYSCOLUMNS WHERE ID=object_id('{$tableName}')";
              $arr = $this->getAll($sql);
            foreach ($arr as $val) {
               $fields[$val['NAME']] = $val['NAME'];
            }
            break;
         default:
            throw new Exception('unknown database type');
      }

      return $fields;
   }

   /*
   * 获取数据库类型
   * @return string
   */
   public function getDbType()
   {
      if ($this->dbType === null) {
         if (strpos($this->getDbDsn(), 'mysql:') !== false) {
            $this->dbType = 'mysql';
         } else if (strpos($this->getDbDsn(), 'oci:') !== false) {
            $this->dbType = 'oracle';
         } else if(strpos($this->getDbDsn(), 'sqlsrv:') !== false){
             $this->dbType = 'sqlserver';
         } else {
            $this->dbType = 'unkown';
         }
      }

      return $this->dbType;
   }

   /*-----------------------------------------------SQL Sever 2008--------------------------------------------------------*/
    /*$tableName 表名
     */
   public function svTable($tableName){
    if(!empty($tableName)){
        
      if(is_array($tableName)){
        foreach ($tableName as $key=>$val){
          $tableNameArr[] = $val;
        }
        $this->svTables = implode(',', $tableNameArr);
      }else{
        $this->svTables = $tableName;
      }
      
      return $this;
    }
    return false;
   }
   
    /*$filed 字段
     *string "$v,$v2,$v3"
     *array array('$v','$v2','$v3')
     */
   public function svFiled($filed){
    if(!empty($filed)){
        
      if(is_array($filed)){
        foreach ($filed as $val){
          $filedArr[] = "[".$val."]";
        }
        $this->svFileds = $filedArr;
      }else{
        $this->svFileds = $filed;
      }
      
      return $this;
    }else{
        
        if(!empty($this->svTables)){
          $filed = $this->getFields($this->svTables);
          foreach ($filed as $key=>$v){
             $filedArr[] = "[".$v."]";
          }
             $this->svFileds = $filedArr;
         return $this;  
        }
        
      return false;    
    }
    return false;
   }
   
   /*$svwhere 条件
    *string
    *array array($filed=>'=$v1',$filed2=>'<>$v2');
    */
   public function svWhere($svwhere){
       if(!empty($svwhere)){
         if(is_array($svwhere)){
             foreach ($svwhere as $key=>$val){
               $whereArr [] = $key.$val;
             }
             $this->svWheres = implode(' AND ', $whereArr);
         }else{
             $this->svWheres = $svwhere;
         }
         
      return $this;
       }
       return false;
   }
   
   /*录入信息
    *$params  REQUEST数据
    *必须属性
    *string $this->svTables
    *array  $this->svFileds
    */
   public function svInsert(){
       $params = implode(',',$this->svGetParams());
         if(!empty($this->svTables) && !empty($this->svFileds) && !empty($params)){
              $fileds = implode(',', $this->svFileds);
             $sql = "INSERT INTO {$this->svTables} ({$fileds}) VALUES ({$params})";
             return $sql;
         }
         return false;
     }
     
   /*select 输出(循环)
    *必须属性
    *string $this->svTables
    *array  $this->svFileds
    */  
   public function svSelect(){
     $filed = implode(',', $this->svFileds);
     if(!empty($this->svWheres)){
        $sql = "SELECT {$filed} FROM {$this->svTables} WHERE {$this->svWheres}";
       return $this->query($sql);
     }else{
        $sql = "SELECT {$filed} FROM {$this->svTables}";
       return $this->query($sql);
     }
     return false;
   }  
 
   
   /*必须属性
    *$updata array('$v','$v2','$v3') 与  $this->svFileds 相关
    *string $this->svTables
    *array  $this->svFileds
    *string $this->svWheres
    */  
   public function svUpdate($updata){
       if(!empty($updata)){
         foreach ($this->svFileds as $key=>$v){
           $updataArr[] = $v."='".$updata[$key]."'";
         }
         $updata = implode(',', $updataArr);
      $sql = "UPDATE {$this->svTables} SET {$updata} WHERE {$this->svWheres}";
      return $this->execute($sql);
       }
     return false;
   }
   
   /*删除
    * 必须属性
    * string $this->svTables
    * string $this->svWheres
    */
   public function svDelete(){
     if(!empty($this->svTables) && !empty($this->svWheres)){
        $sql = "DELETE FROM {$this->svTables} WHERE ".$this->svWheres;
       return $this->execute($sql);
     }
     return false;
   }
   
  /*获取 $start 到  $num 信息
   *必须属性
   *string $this->svTables
   *array  $this->svFileds
   */
   public function svQuerySql($num, $start = 0, $pk_id = NULL){
       if(!empty($this->svTables)){
         $pk_id = $this->svGetPkid($this->svTables);
         $filed = implode(',', $this->svFileds);
           if(!empty($this->svWheres)){
             $sql = "SELECT TOP ({$num}) {$filed} FROM {$this->svTables} WHERE {$pk_id} NOT IN (SELECT TOP ({$start}) {$pk_id} FROM {$this->svTables}) AND {$this->svWheres}";
           }else{
              $sql = "SELECT TOP ({$num}) {$filed} FROM {$this->svTables} WHERE {$pk_id} NOT IN (SELECT TOP ({$start}) {$pk_id} FROM {$this->svTables})";
           }
          return $sql;
       }
       return false;
   }

  /*$tableName 表名
   *$pk_id 主键(默认为 $tableName 字段第一位)
   */
   public function svGetPkid($tableName,$pk_id = NULL){
   if($tableName){    
    if($pk_id == NULL){
         $sql = "SELECT NAME FROM SYSCOLUMNS WHERE ID=object_id('{$tableName}')";
      $pk_id_arr = $this->getAll($sql);
      $pk_id = $pk_id_arr[0]['NAME'];
        }else{
         $pk_id = $pk_id;
        }
        return $pk_id;
   }
   return false;
   }
   
    /*分页涉及
     * $table 表名
     *$pk_id 主键
     *$fileds 字段(默认为所有)
     */
   public function svSearchSql($tableName,$fileds="*",$num, $start = 0){
       if($tableName){
         $pk_id = $this->svGetPkid($tableName);
      $sql = "SELECT TOP ({$num}) {$fileds} FROM {$tableName} WHERE {$pk_id} NOT IN (SELECT TOP ({$start}) {$pk_id} FROM {$tableName}) AND ";
     return $sql;
       }
       return false;
   }
   
    /*分页涉及
    /*$table 表名
     *$where 条件(默认为NULL)
    */
   public function svSearchLimit($sql,$where = NULL){
       if($sql){
        if($where == NULL){
         $sql = $sql;
        }else{
         $sql = $sql.$where;
        }
     return $this->query($sql);
    }
    return false;
   }
    
    /*录入信息
     * $table 表名
     * $result array($filed=>$val,$filed2=>$val2,$filed(n)=>$val(n))
     */
    public function svInsertData($table,$result){
        
     if(is_array($result)){
         $result = $this->svAuthData($result);
         foreach($result as $key=>$v){
         $k[]=$key;
         if(!get_magic_quotes_gpc()){
           $val[]="'".addslashes($v)."'";
          }else{
           $val[]="'".$v."'";
          }
         }
         $k=implode(",",$k);
         $val=implode(",",$val);
         $sql="INSERT INTO {$table}({$k})VALUES({$val})";
         return $this->execute($sql);
     }
     return false;
  }
  /* REQUEST 验证
   */
  public function svGetParams(){
   if(isset($_REQUEST)){
       $getType = $_SERVER['REQUEST_METHOD'];
     switch ($getType){
         case 'POST':
             $data = $this->svAuthData($_POST);
             break;
         case 'GET':
             $data = $this->svAuthData($_GET);
             break;            
     }
    return $data;
   }
   return false;
  }
 
   /*数据验证
    * $data string
   */
   public function svAuthData($data){
       if(!empty($data)){
        $Adata = preg_replace("/\<script\>|\<\/script\>|where|update|select|union|insert|delete|load_file|outfile|or|and/i","",$data);
         return $Adata;
       }
       return false;
    }
    
  /*删除
   *$table 表名
   *$where 条件(默认为null)
   */
   public function svDeletes($table,$where = NULL){
       if($where){
        $sql = "DELETE FROM {$table} WHERE ".$where;
     return $this->query($sql);
       }
       return false;
  }
 
  /*更新
   *$table 表名
   *$updata array($filed=>$val,$filed2=>$val2,$filed(n)=>$val(n)) 更新值
   *$where string / where array($filed=>'=$val',$filed=>'<=$val',$filed=>'<>$val')条件
   */
   public function svUpdates($table,$updata,$where){
      if(is_array($updata)){
         foreach($updata as $key=>$v){
         $k=$key;
         if(!get_magic_quotes_gpc()){
           $val="'".addslashes($v)."'";
          }else{
           $val="'".$v."'";
          }
          $up_key[] = $k."=".$val;
         }
        
         if(is_array($where)){
           $arr = array();
           foreach ($where as $key=>$val){
             array_push($arr, $key.$val);
           }
           $where = implode(" AND ", $arr);
         }
         $up_key=implode(",",$up_key);
         $update = "UPDATE {$table} SET {$up_key} WHERE {$where}";

         return $this->query($update);
        }
    return false;
  }   

}

2.数据库连接类Dbxx.php:

<?php
class Dbxx extends ZDO
{
   private static $dsn = 'mysql:host=localhost;port=3306;dbname=dbname';
   //private static $dsn = 'oci:dbname=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SID=ORCL)));charset=utf8';

   //private static $dsn = 'sqlsrv:Server=localhost;Database=dbname';


   private static $username = 'username';
   private static $password = 'passwd';

   private static $dbh;
   protected function getDbHandle()
   {
      if (self::$dbh === null) {
         self::$dbh = new PDO(self::$dsn, self::$username, self::$password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
         self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      }

      return self::$dbh;
   }

   public static function getDbDsn()
   {
      return self::$dsn;
   }

}


0 0
原创粉丝点击