PHP复习_封装万能的PDO类

以前学习过PDO,可是在公司使用项目的时候发现有点忘记了,于是花了点时间对PDO再次回顾,我的代码写的很详细了,在注释上有参考案例,有需要的可以在这里下载

链接:https://pan.baidu.com/s/1tDSV_8hJdrReNa851Y5ZNQ

提取码:famt

下面我对这个类的一些重点方法进行解读

 

本类定义的私有变量

public static $config=array();//设置连接参数,配置信息
public static $link=null;//保存连接标识符
public static $pconnect=false;//是否开启长连接
public static $dbVersion=null;//保存数据库版本
public static $connected=false;//是否连接成功
public static $PDOStatement=null;//保存PDOStatement对象
public static $queryStr=null;//保存最后执行的操作
public static $error=null;//报错错误信息
public static $lastInsertId=null;//保存上一步插入操作产生AUTO_INCREMENT
public static $numRows=0;//上一步操作产生受影响的记录的条数

 

数据库连接构造函数

/**
 * 连接PDO
 * @param string $dbConfig
 * @return boolean
 */
public function __construct($dbConfig=''){
   if(!class_exists("PDO")){
      self::throw_exception('不支持PDO,请先开启');
   }
   if(!is_array($dbConfig)){
      $dbConfig=array(
      'hostname'=>DB_HOST,
      'username'=>DB_USER,
      'password'=>DB_PWD,
      'database'=>DB_NAME,
      'hostport'=>DB_PORT,
      'dbms'=>DB_TYPE,
      'dsn'=>DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME
      );
   }
   if(empty($dbConfig['hostname']))self::throw_exception('没有定义数据库配置,请先定义');
   self::$config=$dbConfig;
   if(empty(self::$config['params']))self::$config['params']=array();
   if(!isset(self::$link)){
      $configs=self::$config;
      if(self::$pconnect){
         //开启长连接,添加到配置数组中
         $configs['params'][constant("PDO::ATTR_PERSISTENT")]=true;
      }
      try{
         self::$link=new PDO($configs['dsn'],$configs['username'],$configs['password'],$configs['params']);
      }catch(PDOException $e){
         self::throw_exception($e->getMessage());
      }
      if(!self::$link){
         self::throw_exception('PDO连接错误');
         return false;
      }
      self::$link->exec('SET NAMES '.DB_CHARSET);
      self::$dbVersion=self::$link->getAttribute(constant("PDO::ATTR_SERVER_VERSION"));
      self::$connected=true;
      unset($configs);
   }
}

这部分一定要了解清楚,记得一个笑话,面试的时候,面试官让一个两年工作经验的面试者写数据库连接,结果写不出来,我们都不希望成为这样的面试者而白白浪费面试机会

 

数据查询

又分为查询所以记录,查询一条记录,根据主键查询和普通查询

/**
 * 得到所有记录
 * @param string $sql
 * @return unknown
 */
public static function getAll($sql=null){
   if($sql!=null){
      self::query($sql);
   }
   $result=self::$PDOStatement->fetchAll(constant("PDO::FETCH_ASSOC"));
   return $result;
}
/**
 * 得到结果集中的一条记录
 * @param string $sql
 * @return mixed
 */
public static function getRow($sql=null){
   if($sql!=null){
      self::query($sql);
   }
   $result=self::$PDOStatement->fetch(constant("PDO::FETCH_ASSOC"));
   return $result;
}

/**
 * 根据主键查找记录
 * @param string $tabName
 * @param int $priId
 * @param string $fields
 * @return mixed
 */
public static function findById($tabName,$priId,$fields='*'){
   $sql='SELECT %s FROM %s WHERE id=%d';
   return self::getRow(sprintf($sql,self::parseFields($fields),$tabName,$priId));
}

/**
 * 执行普通查询
 * @param unknown $tables
 * @param string $where
 * @param string $fields
 * @param string $group
 * @param string $having
 * @param string $order
 * @param string $limit
 * @return Ambigous <unknown, unknown, multitype:>
 */
public static function find($tables,$where=null,$fields='*',$group=null,$having=null,$order=null,$limit=null){
   $sql='SELECT '.self::parseFields($fields).' FROM '.$tables
   .self::parseWhere($where)
   .self::parseGroup($group)
   .self::parseHaving($having)
   .self::parseOrder($order)
   .self::parseLimit($limit);
   $dataAll=self::getAll($sql);
   return count($dataAll)==1?$dataAll[0]:$dataAll;
}

 

数据添加

/**
 * 添加记录的操作
 * @param array $data
 * @param string $table
 * @return Ambigous <boolean, unknown, number>
 */
public static function add($data,$table){
   $keys=array_keys($data);
   array_walk($keys,array('PdoMySQL','addSpecialChar'));
   $fieldsStr=join(',',$keys);
   $values="'".join("','",array_values($data))."'";
   $sql="INSERT {$table}({$fieldsStr}) VALUES({$values})";
   //echo $sql;
   return self::execute($sql);
}

 

数据修改

/**
 * 更新记录
 * @param array $data
 * @param string $table
 * @param string $where
 * @param string $order
 * @param string $limit
 * @return Ambigous <boolean, unknown, number>
 */
public static function update($data,$table,$where=null,$order=null,$limit=0){
   foreach($data as $key=>$val){
      $sets.=$key."='".$val."',";
   }
   //echo $sets;
   $sets=rtrim($sets,',');
   $sql="UPDATE {$table} SET {$sets} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
   return self::execute($sql);
}

 

数据删除

/**
 * 删除记录的操作
 * @param string $table
 * @param string $where
 * @param string $order
 * @param number $limit
 * @return Ambigous <boolean, unknown, number>
 */
public static function delete($table,$where=null,$order=null,$limit=0){
   $sql="DELETE FROM {$table} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
   return self::execute($sql);
}

 

一些其他比较重要的操作

/**
 * 得到上一步插入操作产生AUTO_INCREMENT
 * @return boolean|string
 */
public static function getLastInsertId(){
   $link=self::$link;
   if(!$link)return false;
   return self::$lastInsertId;
}

/**
 * 得到数据库中数据表
 * @return multitype:mixed
 */
public static function showTables(){
   $tables=array();
   if(self::query("SHOW TABLES")){
      $result=self::getAll();
      foreach($result as $key=>$val){
         $tables[$key]=current($val);
      }
   }
   return $tables;
}

/**
 * 执行增删改操作,返回受影响的记录的条数
 * @param string $sql
 * @return boolean|unknown
 */
public static function execute($sql=null){
   $link=self::$link;
   if(!$link) return false;
   self::$queryStr=$sql;
   if(!empty(self::$PDOStatement))self::free();
   $result=$link->exec(self::$queryStr);
   self::haveErrorThrowException();
   if($result){
      self::$lastInsertId=$link->lastInsertId();
      self::$numRows=$result;
      return self::$numRows;
   }else{
      return false;
   }
}

/**
 * 自定义错误处理
 * @param unknown $errMsg
 */
public static function throw_exception($errMsg){
   echo '<div style="width:80%;background-color:#ABCDEF;color:black;font-size:20px;padding:20px 0px;">
         '.$errMsg.'
   </div>';
}

 

 

其他具体PDO封装的函数请查看代码文件,都有详细的注释哦~

 

其他关于PDO的热读

PHP复习_PDO的连接使用

http://www.mtdg.club/index/article/show/id/54.html

PHP复习_PDO普通方法的使用

http://www.mtdg.club/index/article/show/id/55.html

PHP复习_PDO数据库连接属性和防SQL注入

http://www.mtdg.club/index/article/show/id/56.html

PHP复习_PDO的事务和异常

http://www.mtdg.club/index/article/show/id/57.html

PHP复习_PDO预处理方法的使用

http://www.mtdg.club/index/article/show/id/58.html

 

博客
32132
07-14 362
07-12 294
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值