php封装的pdo数据库操作工具类与用法示例


Posted in PHP onMay 08, 2019

本文实例讲述了php封装的pdo数据库操作工具类与用法。分享给大家供大家参考,具体如下:

<?php
header("Content-Type:text/html;charset=utf-8");
class PdoMysql{
  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_INCREMANT
  public static $numRows = null;//受影响记录的条数
  /**
   * 构造函数,连接数据库
   *
   * @param   array|string $dbConfig The database configuration
   *
   * @return   boolean    ( description_of_the_return_value )
   */
  public function __construct($dbConfig=''){
    if(!class_exists("PDO")){
      self::throw_exception("不支持PDO,请先开启");
    }
    if(!is_array($dbConfig)){
      $dbConfig = array(
              'hostname' => 'localhost',
              'username' => 'root',
              'password' => '1234',
              'database' => 'test',
              'hostport' => '3306',
              'dbms'   => 'mysql',
              'dsn'   => 'mysql:host=localhost;dbname=test'
            );
    }
    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 utf8");
      self::$dbVersion = self::$link->getAttribute(constant("PDO::ATTR_SERVER_VERSION"));
      unset($configs);
    }
  }
  /**
   * 得到所有记录
   *
   * @param   <type> $sql  The sql
   *
   * @return   <type> All.
   */
  public static function getAll($sql=null){
    if($sql!=null){
      self::query($sql);
    }
    $result = self::$PDOStatement->fetchAll(constant("PDO::FETCH_ASSOC"));
    return $result;
  }
  /**
   * 得到一条记录
   *
   * @param   <type> $sql  The sql
   *
   * @return   <type> The row.
   */
  public static function getRow($sql=null){
    if($sql!=null){
      self::query($sql);
    }
    $result = self::$PDOStatement->fetch(constant("PDO::FETCH_ASSOC"));
    return $result;
  }
  /**
   * 执行增删改操作,返回受影响记录的条数
   *
   * @param   <type>  $sql  The sql
   *
   * @return   boolean ( description_of_the_return_value )
   */
  public static function execute($sql=null){
    $link = self::$link;
    if(!$link)return false;
    if($sql!=null){
      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 $result;
    }else{
      return false;
    }
  }
  /**
   * 根据主键查找记录
   *
   * @param   <type> $tabName The tab name
   * @param   <type> $priId  The pri identifier
   * @param   string $fields  The fields
   *
   * @return   <type> ( description_of_the_return_value )
   */
  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   <type> $tables The tables
   * @param   <type> $where  The where
   * @param   string $fields The fields
   * @param   <type> $group  The group
   * @param   <type> $having The having
   * @param   <type> $order  The order
   * @param   <type> $limit  The limit
   *
   * @return   <type> ( description_of_the_return_value )
   */
  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);
    $data = self::getAll($sql);
    return $data;
  }
  /**
   * 添加记录
   *
   * @param   <type> $data  The data
   * @param   <type> $table The table
   *
   * @return   <type> ( description_of_the_return_value )
   */
  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})";
    return self::execute($sql);
  }
  /**
   * 更新数据
   *
   * @param   <type> $data  The data
   * @param   <type> $table The table
   * @param   <type> $where The where
   * @param   <type> $order The order
   * @param   <type> $limit The limit
   */
  public static function update($data,$table,$where=null,$order=null,$limit=null){
    $sets = '';
    foreach ($data as $key => $value) {
      $sets .= $key."='".$value."',";
    }
    $sets = rtrim($sets,',');
    $sql = "UPDATE {$table} SET {$sets}".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
    echo $sql;
  }
  /**
   * 删除数据
   *
   * @param   <type> $data  The data
   * @param   <type> $table The table
   * @param   <type> $where The where
   * @param   <type> $order The order
   * @param   <type> $limit The limit
   *
   * @return   <type> ( description_of_the_return_value )
   */
  public static function delete($table,$where=null,$order=null,$limit=null){
    $sql = "DELETE FROM {$table} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
    return self::execute($sql);
  }
  /**
   * 执行查询
   *
   * @param   string  $sql  The sql
   *
   * @return   boolean ( description_of_the_return_value )
   */
  public static function query($sql=''){
    $link = self::$link;
    if(!$link)return false;
    //判断之前是否有结果集,如果有的话,释放结果集
    if(!empty(self::$PDOStatement))self::free();
    self::$queryStr = $sql;
    self::$PDOStatement = $link->prepare(self::$queryStr);
    $res = self::$PDOStatement->execute();
    self::haveErrorThrowException();
    return $res;
  }
  /**
   * 获取最后执行的sql
   *
   * @return   boolean The last sql.
   */
  public static function getLastSql(){
    $link = self::$link;
    if(!$link){
      return false;
    }
    return self::$queryStr;
  }
  /**
   * 获取最后插入的ID
   *
   * @return   boolean The last insert identifier.
   */
  public static function getLastInsertId(){
    $link = self::$link;
    if(!$link){
      return false;
    }
    return self::$lastInsertId;
  }
  /**
   * 获得数据库的版本
   *
   * @return   boolean The database version.
   */
  public static function getDbVersion(){
    $link = self::$link;
    if(!$link){
      return false;
    }
    return self::$dbVersion;
  }
  /**
   * 得到数据库中表
   *
   * @return   array ( description_of_the_return_value )
   */
  public static function showTables(){
    $tables = array();
    if(self::query("show tables")){
      $result = self::getAll();
      foreach ($result as $key => $value) {
        $tables[$key] = current($value);
      }
    }
    return $tables;
  }
  /**
   * 解析where条件
   *
   * @param   <type> $where The where
   *
   * @return   <type> ( description_of_the_return_value )
   */
  public static function parseWhere($where){
    $whereStr = '';
    if(is_string($where)&&!empty($where)){
      $whereStr = $where;
    }
    return empty($whereStr) ? '' : ' WHERE '.$whereStr;
  }
  /**
   * 解析group
   *
   * @param   <type> $group The group
   *
   * @return   <type> ( description_of_the_return_value )
   */
  public static function parseGroup($group){
    $groupStr = '';
    if(is_array($group)){
      $groupStr = implode(',', $group);
    }elseif(is_string($group)&&!empty($group)){
      $groupStr = $group;
    }
    return empty($groupStr) ? '' : ' GROUP BY '.$groupStr;
  }
  /**
   * 解析having
   *
   * @param   <type> $having The having
   *
   * @return   <type> ( description_of_the_return_value )
   */
  public static function parseHaving($having){
    $havingStr = '';
    if(is_string($having)&&!empty($having)){
      $havingStr = $having;
    }
    return empty($havingStr) ? '' : ' HAVING '.$havingStr;
  }
  /**
   * 解析order
   *
   * @param   <type> $order The order
   *
   * @return   <type> ( description_of_the_return_value )
   */
  public static function parseOrder($order){
    $orderStr = '';
    if(is_string($order)&&!empty($order)){
      $orderStr = $order;
    }
    return empty($orderStr) ? '' : ' ORDER BY '.$orderStr;
  }
  /**
   * 解析limit
   *
   * @param   <type> $limit The limit
   *
   * @return   <type> ( description_of_the_return_value )
   */
  public static function parseLimit($limit){
    $limitStr = '';
    if(is_array($limit)){
      $limitStr = implode(',', $limit);
    }elseif(is_string($limit)&&!empty($limit)){
      $limitStr = $limit;
    }
    return empty($limitStr) ? '' : ' LIMIT '.$limitStr;
  }
  /**
   * 解析字段
   *
   * @param   <type> $fields The fields
   *
   * @return   string ( description_of_the_return_value )
   */
  public static function parseFields($fields){
    if(is_array($fields)){
      array_walk($fields, array('PdoMySQL','addSpecialChar'));
      $fieldsStr = implode(',', $fields);
    }elseif (is_string($fields)&&!(empty($fields))) {
      if(strpos($fields, '`')===false){
        $fields = explode(',', $fields);
        array_walk($fields, array('PdoMySQL','addSpecialChar'));
        $fieldsStr = implode(',', $fields);
      }else{
        $fieldsStr = $fields;
      }
    }else{
      $fieldsStr = "*";
    }
    return $fieldsStr; 
  }
  /**
   * 通过反引号引用字字段
   *
   * @param   string $value The value
   *
   * @return   string ( description_of_the_return_value )
   */
  public static function addSpecialChar(&$value){
    if($value==="*"||strpos($value,'.')!==false||strpos($value,'`')!==false){
      //不用做处理
    }elseif(strpos($value, '`')===false){
      $value = '`'.trim($value).'`';
    }
    return $value;
  }
  /**
   * 释放结果集
   */
  public static function free(){
    self::$PDOStatement = null;
  }
  /**
   * 抛出错误信息
   *
   * @return   boolean ( description_of_the_return_value )
   */
  public static function haveErrorThrowException(){
    $obj = empty(self::$PDOStatement) ? self::$link : self::$PDOStatement;
    $arrError = $obj->errorInfo();
    if($arrError[0]!='00000'){
      self::$error = 'SQLSTATE=>'.$arrError[0].'<br/>SQL Error=>'.$arrError[2].'<br/>Error SQL=>'.self::$queryStr;
      self::throw_exception(self::$error);
      return false;
    }
    if(self::$queryStr==''){
      self::throw_exception('没有执行SQL语句');
      return false;
    }
  }
  /**
   * 自定义错误处理
   *
   * @param   <type> $errMsg The error message
   */
  public static function throw_exception($errMsg){
    echo $errMsg;
  }
  /**
   * 销毁连接对象,关闭数据库
   */
  public static function close(){
    self::$link = null;
  }
}
$pdo = new PdoMysql();
var_dump($pdo->showTables());

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php入门教程 精简版
Dec 13 PHP
在php和MySql中计算时间差的方法
Apr 22 PHP
PHP中strtotime函数使用方法详解
Nov 27 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
linux中cd命令使用详解
Jan 08 PHP
从wamp到xampp的升级之路
Apr 08 PHP
PHP时间和日期函数详解
May 08 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
PHP容器类的两种实现方式示例
Jul 24 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 PHP
Laravel框架查询构造器简单示例
May 08 #PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 #PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
May 08 #PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 #PHP
Laravel框架路由管理简单示例
May 07 #PHP
Laravel框架实现简单的学生信息管理平台案例
May 07 #PHP
Laravel框架Request、Response及Session操作示例
May 06 #PHP
You might like
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
pygame实现弹力球及其变速效果
2017/07/03 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
物业管理应届生求职信
2013/10/28 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
免职证明样本
2014/10/23 职场文书
端午节活动总结报告
2015/02/11 职场文书
小学生家长意见
2015/06/03 职场文书
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers