PDO封装万能的Model类

【今日推荐】:为什么一到面试就懵逼!>>> hot3.png

  • 目录
  • 1. 前言
  • 2. 万能PDO类
  • 2.1 类的私有变量
  • 2.2 类的构造函数
  • 2.3 常用的数据查询方法
  • 2.3.1 得到所有记录
  • 2.3.2得到结果集中的一条记录
  • 2.3.3根据主键查找记录
  • 2.3.4执行普通查询
  • 2.3.5添加记录
  • 2.3.6更新记录
  • 2.3.7删除记录
  • 2.3.8执行增删改操作,返回受影响的记录的条数
  • 3. 总结

1.前言

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

代码分享:https://github.com/mtdgclub/PDO

具体查看根目录下的pdoMysqlClass.php

2. 万能PDO类

2.1 类的私有变量

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;//上一步操作产生受影响的记录的条数

2.2 类的构造函数

/**
 * 连接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);
   }
}

2.3 常用的数据查询方法

2.3.1 得到所有记录

/**
 * 得到所有记录
 * @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;
}

2.3.2得到结果集中的一条记录

/**
 * 得到结果集中的一条记录
 * @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;
}

2.3.3根据主键查找记录

/**
 * 根据主键查找记录
 * @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));
}

2.3.4执行普通查询

/**
 * 执行普通查询
 * @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;
}

2.3.5添加记录

/**
 * 添加记录
 * @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);
}

2.3.6更新记录

/**
 * 更新记录
 * @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);
}

2.3.7删除记录

/**
 * 删除记录
 * @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);
}

2.3.8执行增删改操作,返回受影响的记录的条数

/**
 * 执行增删改操作,返回受影响的记录的条数
 * @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;
   }
}

3. 总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 PHP PDO 封装的示例: ```php class Database { private $host = "localhost"; private $user = "username"; private $password = "password"; private $database = "database"; private $charset = "utf8mb4"; private $pdo; public function __construct() { $dsn = "mysql:host={$this->host};dbname={$this->database};charset={$this->charset}"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; $this->pdo = new PDO($dsn, $this->user, $this->password, $options); } public function query($sql, $params = []) { $stmt = $this->pdo->prepare($sql); $stmt->execute($params); return $stmt; } public function fetchAll($sql, $params = []) { $stmt = $this->query($sql, $params); return $stmt->fetchAll(); } public function fetch($sql, $params = []) { $stmt = $this->query($sql, $params); return $stmt->fetch(); } public function insert($table, $data) { $keys = array_keys($data); $values = array_values($data); $placeholders = implode(',', array_fill(0, count($values), '?')); $sql = "INSERT INTO $table (" . implode(',', $keys) . ") VALUES ($placeholders)"; $this->query($sql, $values); return $this->pdo->lastInsertId(); } public function update($table, $data, $where) { $set = []; $values = []; foreach ($data as $key => $value) { $set[] = "$key = ?"; $values[] = $value; } $sql = "UPDATE $table SET " . implode(',', $set) . " WHERE $where"; return $this->query($sql, $values)->rowCount(); } public function delete($table, $where) { $sql = "DELETE FROM $table WHERE $where"; return $this->query($sql)->rowCount(); } } ``` 这个封装PDO,包含了常用的查询操作,如 query、fetchAll、fetch,以及增删改操作,如 insert、update、delete。你可以根据自己的需要进行扩展。使用时,只需要实例化这个,并调用相应的方法即可。例如: ```php $db = new Database(); $rows = $db->fetchAll("SELECT * FROM table WHERE id = ?", [1]); ``` 这个示例会查询一个 ID 为 1 的记录,并返回一个数组。你可以根据需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值