侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP用PDO如何封装简单易用的DB类详解

php  /  管理员 发布于 7年前   192

前言

PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用。

我个人理解:PDO是一个抽象类,为我们提供访问数据的接口方法,下面这篇将给大家介绍关于PHP如何利用PDO封装简单易用的DB类,下面话不多说,来一起看看详细的介绍:

使用

创建测试库和表

create database db_test;CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` char(11) NOT NULL, `created_at` int(10) unsigned NOT NULL, PRIMARY KEY (`uid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `user` VALUES ('1', 'wang', '1501109027');INSERT INTO `user` VALUES ('2', 'meng', '1501109026');INSERT INTO `user` VALUES ('3', 'liu', '1501009027');INSERT INTO `user` VALUES ('4', 'yuan', '1500109027');

代码测试

require __DIR__ . '/DB.php';$db = new DB();$db->__setup([ 'dsn'=>'mysql:dbname=db_test;host=localhost', 'username'=>'root', 'password'=>'******', 'charset'=>'utf8']);$user = $db->fetch('SELECT * FROM user where id = :id', ['id' => 1]);echo $user['name'];echo "\n";$insertId = $db->insert('user', ['name' => 'salamander', 'created_at' => time()]);echo "insert user {$insertId}\n";$users = $db->fetchAll('SELECT * FROM user');foreach ($users as $item) { echo "user {$item['id']} is {$item['name']} \n";} 

运行结果

DB工具类

dsn = $config['dsn'];  $this->user = $config['username'];  $this->password = $config['password'];  $this->charset = $config['charset'];  $this->connect(); } private function connect() {  if(!$this->dbh){   $options = array(    \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . $this->charset,   );   $this->dbh = new \PDO($this->dsn, $this->user,    $this->password, $options);  } } public function beginTransaction() {  return $this->dbh->beginTransaction(); } public function inTransaction() {  return $this->dbh->inTransaction(); } public function rollBack() {  return $this->dbh->rollBack(); } public function commit() {  return $this->dbh->commit(); } function watchException($execute_state) {  if(!$execute_state){   throw new MySQLException("SQL: {$this->lastSQL}\n".$this->sth->errorInfo()[2], intval($this->sth->errorCode()));  } } public function fetchAll($sql, $parameters=[]) {  $result = [];  $this->lastSQL = $sql;  $this->sth = $this->dbh->prepare($sql);  $this->watchException($this->sth->execute($parameters));  while($result[] = $this->sth->fetch(\PDO::FETCH_ASSOC)){ }  array_pop($result);  return $result; } public function fetchColumnAll($sql, $parameters=[], $position=0) {  $result = [];  $this->lastSQL = $sql;  $this->sth = $this->dbh->prepare($sql);  $this->watchException($this->sth->execute($parameters));  while($result[] = $this->sth->fetch(\PDO::FETCH_COLUMN, $position)){ }  array_pop($result);  return $result; } public function exists($sql, $parameters=[]) {  $this->lastSQL = $sql;  $data = $this->fetch($sql, $parameters);  return !empty($data); } public function query($sql, $parameters=[]) {  $this->lastSQL = $sql;  $this->sth = $this->dbh->prepare($sql);  $this->watchException($this->sth->execute($parameters));  return $this->sth->rowCount(); } public function fetch($sql, $parameters=[], $type=\PDO::FETCH_ASSOC) {  $this->lastSQL = $sql;  $this->sth = $this->dbh->prepare($sql);  $this->watchException($this->sth->execute($parameters));  return $this->sth->fetch($type); } public function fetchColumn($sql, $parameters=[], $position=0) {  $this->lastSQL = $sql;  $this->sth = $this->dbh->prepare($sql);  $this->watchException($this->sth->execute($parameters));  return $this->sth->fetch(\PDO::FETCH_COLUMN, $position); } public function update($table, $parameters=[], $condition=[]) {  $table = $this->format_table_name($table);  $sql = "UPDATE $table SET ";  $fields = [];  $pdo_parameters = [];  foreach ( $parameters as $field=>$value){   $fields[] = '`'.$field.'`=:field_'.$field;   $pdo_parameters['field_'.$field] = $value;  }  $sql .= implode(',', $fields);  $fields = [];  $where = '';  if(is_string($condition)) {   $where = $condition;  } else if(is_array($condition)) {   foreach($condition as $field=>$value){    $parameters[$field] = $value;    $fields[] = '`'.$field.'`=:condition_'.$field;    $pdo_parameters['condition_'.$field] = $value;   }   $where = implode(' AND ', $fields);  }  if(!empty($where)) {   $sql .= ' WHERE '.$where;  }  return $this->query($sql, $pdo_parameters); } public function insert($table, $parameters=[]) {  $table = $this->format_table_name($table);  $sql = "INSERT INTO $table";  $fields = [];  $placeholder = [];  foreach ( $parameters as $field=>$value){   $placeholder[] = ':'.$field;   $fields[] = '`'.$field.'`';  }  $sql .= '('.implode(",", $fields).') VALUES ('.implode(",", $placeholder).')';  $this->lastSQL = $sql;  $this->sth = $this->dbh->prepare($sql);  $this->watchException($this->sth->execute($parameters));  $id = $this->dbh->lastInsertId();  if(empty($id)) {   return $this->sth->rowCount();  } else {   return $id;  } } public function errorInfo() {  return $this->sth->errorInfo(); } protected function format_table_name($table) {  $parts = explode(".", $table, 2);  if(count($parts) > 1) {   $table = $parts[0].".`{$parts[1]}`";  } else {   $table = "`$table`";  }  return $table; } function errorCode() {  return $this->sth->errorCode(); }}class MySQLException extends \Exception { }

框架中使用建议

在框架中使用DB类,用单例模式或者用依赖容器来管理较好。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对AIDI的支持

您可能感兴趣的文章:

  • 全新的PDO数据库操作类php版(仅适用Mysql)
  • PHP实现PDO的mysql数据库操作类
  • php基于PDO实现功能强大的MYSQL封装类实例
  • PHP基于单例模式编写PDO类的方法
  • PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
  • PHP封装的PDO数据库操作类实例
  • PHP的PDO常用类库实例分析
  • PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
  • PHP封装的数据库模型Model类完整示例【基于PDO】
  • php封装的pdo数据库操作工具类与用法示例


  • 上一条:
    PHP将数据导出Excel表中的实例(投机型)
    下一条:
    详解PHP防止直接访问.php 文件的实现方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客