以前学习过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

PHP复习_封装万能的PDO类相关推荐

  1. php mysql db封装类_封装自己的DB类(PHP)

    classDB{//属性 private $host;private $port;private $user;private $pass;private $dbname;private $charse ...

  2. 首页仪表盘echarts _封装万能表单组件

    响应式布局 element -ui 找到layout布局 – 分栏间隔 gutter:间隔 span:列数 <el-row :gutter = "20"><el- ...

  3. 09_Java面向对象_第9天(类、封装)_讲义

    今日内容介绍 1.面向对象思想 2.类与对象的关系 3.局部变量和成员变量的关系 4.封装思想 5.private,this关键字 6.随机点名器 01面向对象和面向过程的思想 A: 面向过程与面向对 ...

  4. httpurlconnection 封装_不要再封装各种Util工具类了,看看这个框架

    不要再封装各种Util工具类了,看看这个框架 Hutool 谐音 "糊涂",寓意追求 "万事都作糊涂观,无所谓失,无所谓得" 的境界.    Hutool 是一 ...

  5. 简单封装浏览器 cookie 工具类

    版权声明:本文首发 http://asing1elife.com ,转载请注明出处. https://blog.csdn.net/asing1elife/article/details/8265571 ...

  6. phppage类封装分页功能_PHP封装的page分页类定义与用法完整示例

    本文实例讲述了PHP封装的page分页类定义与用法.分享给大家供大家参考,具体如下: 亲测有效,见下图=========> 1. 测试实例test.php header("Conten ...

  7. phppage类封装分页功能_php封装的page分页类完整实例代码

    效果图 1.测试实例test.php header("Content-Type: text/html; charset=utf-8"); date_default_timezone ...

  8. W6_面向对象_封装_继承_多继承_多态

    W6_面向对象_封装_继承_多继承_多态 80.81.82.83.第02章节-Python3.5-面向对象介绍 84.第05章节-Python3.5-实例变量与类变量 85.第06章节-Python3 ...

  9. 封装,多态,类的约束,super()深入了解

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

最新文章

  1. 分享7个我常去的国外AjaxJquery网站
  2. iOS开发UI篇--UIScrollView思维导图[不断更新]
  3. statsmodels 笔记 STL
  4. python 默认参数_有趣的 Python 特性 3 | 当心默认可变参数这个大猪蹄子。
  5. [转载]eXeScope 6.50本地溢出分析
  6. adb-获取包名/界面名、获取app启动时间、卸载app、退出app、查看所有进程
  7. python全局变量被覆盖的问题
  8. 熟练的运用计算机英语怎么说,对什么运用的熟练用英语怎么说?
  9. maven安装配置之后mvn命令仍然无效的解决办法
  10. 计算机软件C盘移到D盘怎么移,c盘的软件怎样转到d盘_如何将软件从c盘移出转到d盘-win7之家...
  11. 2.计蒜客ACM题库.A1002 字符串长度
  12. 三维坐标系旋转——旋转矩阵到旋转角之间的换算
  13. 使用Selenium爬取淘宝商品
  14. linux中man手册用法,Linux中man手册的使用
  15. 小学三年级计算机室使用计划,关于三年级信息技术教学计划(精选6篇)
  16. 如何有效设计你的调查问卷?
  17. 关于el-dialog弹出层右上角叉号绑定取消按钮功能
  18. 全球顶尖人工智能专家陶大程加入京东,出任京东探索研究院院长
  19. python批处理原始核磁数据用于DPABI
  20. 关于 nodejs-websocket 的 wss 设置

热门文章

  1. 微信小程序生成Excel
  2. 网络编程中的EGAIN和EWOULDBLOCK
  3. 司空见惯 - 天黑请闭眼
  4. 干货分享!怎么复制硬盘到新硬盘
  5. 【PID优化】基于正余弦算法 (SCA)优化PID实现微型机器人系统位置控制附simulink模型和matlab代码
  6. php x.509,php – 解析X509证书
  7. C语言 会员管理系统
  8. Django——关于related查找
  9. 数值分析Matlab三维数据网格图
  10. 【SoC FPGA】外设PIO按键点灯