以下的例子是将MySQL和PDO封装好,再无缝切换:

文件目录:

config.php文件:

 

  1. <?php
  2.  
  3. return array(
  4. // 数据库配置
  5. 'DB' => array(
  6. 'default_extension'=>'mysql', //这里可以是pdo或mysql
  7. ),
  8. // 分页配置
  9. // 上传配置
  10. // 图像处理配置
  11. );

I_DB.interface.php文件:

  1. <?php
  2. /**
  3. * 数据库接口
  4. */
  5. interface I_DB {
  6. public static function getInstance($config);// 获取单例对象
  7. public function my_query($sql); //执行增删改
  8. public function fetchAll($sql); //查询所有
  9. public function fetchRow($sql); //查询一行
  10. public function fetchColumn($sql); //查询一个单行单列的一个值
  11. }

MySQLDB.class.php文件:

  1. <?php
  2. header('content-type:text/html;charset=utf-8');
  3. /**
  4. * MySQL数据库工具类
  5. */
  6. //加载接口
  7. include './I_DB.interface.php';
  8. class MySQLDB implements I_DB{
  9. private $host; //主机地址
  10. private $port; //端口号
  11. private $user; //用户名
  12. private $pass; //密码
  13. private $dbname; //数据库名
  14. private $charset;//字符集
  15. private $link; //保存连接数据库资源
  16. private static $instance = null; //单例模式中的$MySQLDB对象
  17.  
  18. /**
  19. *@param array $config 配置文件
  20. */
  21. private function __construct ($config) {
  22.  
  23. // 初始化属性的值
  24. $this->init($config);
  25. // 连接数据库
  26. $this->my_connect();
  27. // 设置字符集
  28. $this->my_charset();
  29. // 选择数据库
  30. $this->my_dbname();
  31. }
  32.  
  33. /**
  34. * 只能new一次,单例模式
  35. *@param array $config 传递给构造方法的数组参数
  36. */
  37. public static function getInstance($config) {
  38. if (self::$instance == null) {
  39. self::$instance = new self($config);
  40. }
  41. return self::$instance;
  42. }
  43.  
  44. /***
  45. *私有化克隆魔术方法
  46. */
  47. private function _clone() {}
  48.  
  49. /**
  50. *初始化
  51. *@param array $config 传递给初始化方法的数组参数
  52. */
  53. private function init($config) {
  54. $this->host = isset($config['host'])?$config['host']:'localhost';
  55. $this->port = isset($config['port'])?$config['port']:'3306';
  56. $this->user = isset($config['user'])?$config['user']:'root';
  57. $this->pass = isset($config['pass'])?$config['pass']:'';
  58. $this->dbname = isset($config['dbname'])?$config['dbname']:'';
  59. $this->charset = isset($config['charset'])?$config['charset']:'utf8';
  60. }
  61.  
  62. /**
  63. *错误测试方法
  64. *@param string $sql sql语句
  65. *直接用途:用来增删改
  66. */
  67. public function my_query($sql) {
  68. if ($result = mysql_query($sql)) {
  69. return $result;
  70. }else {
  71. echo "执行sql语句失败;<br/>";
  72. echo "错误代码:",mysql_errno(),"<br/>";
  73. echo "错误信息:",mysql_error(),'<br/>';
  74. return false;
  75. }
  76. }
  77. /**
  78. *连接数据库
  79. */
  80. private function my_connect() {
  81. if ($link = mysql_connect("$this->host:$this->port",$this->user,$this->pass)) {
  82. $this->link = $link;
  83. }else {
  84. echo "连接数据库失败:<br/>";
  85. echo "错误代码:",mysql_errno(),"<br/>";
  86. echo "错误信息:",mysql_error(),'<br/>';
  87. return false;
  88. }
  89. }
  90.  
  91. /**
  92. *设置字符集
  93. */
  94. private function my_charset() {
  95. $sql = "set names $this->charset";
  96. $this->my_query($sql);
  97. }
  98. /**
  99. *选择数据库
  100. */
  101. private function my_dbname() {
  102. $sql = "use $this->dbname";
  103. return $this->my_query($sql);
  104. }
  105.  
  106. /**
  107. *返回多行多列的结果集,二维数组
  108. *@param string sql语句
  109. *@return mixed(array|false) *执行成功返回数组,失败返回false
  110. */
  111. public function fetchAll($sql) {
  112. if($result = $this->my_query($sql)) {
  113. //返回资源结果集,遍历
  114. $rows[] = '';
  115. while ($row = mysql_fetch_assoc($result)) {
  116. $rows[] = $row;
  117. }
  118. //结果集使用完毕,主动释放
  119. mysql_free_result($result);
  120. //返回二维数组
  121. return $rows;
  122. } else {
  123. return false;
  124. }
  125.  
  126. }
  127.  
  128. /**
  129. * 返回一行多列的结果集,一维数组
  130. *@param string 一条sql语句
  131. *@return mixed(array|false) 执行成功返回数组,失败返回false
  132. */
  133. public function fetchRow($sql) {
  134. if($result = $this->my_query($sql)) {
  135. //返回资源结果集,遍历
  136. $row = mysql_fetch_assoc($result);
  137. //结果集使用完毕,主动释放
  138. mysql_free_result($result);
  139. //返回一维数组
  140. return $row;
  141. } else {
  142. return false;
  143. }
  144. }
  145.  
  146. /**
  147. *返回一行一列的结果集,单一值
  148. *@param string 一条sql语句
  149. *@return mixed(array|false) 执行成功返回数组,失败返回false
  150. */
  151. public function fetchColumn($sql) {
  152. if($result = $this->my_query($sql)) {
  153. //返回资源结果集,提取
  154. $row = mysql_fetch_row($result);
  155. //结果集使用完毕,主动释放
  156. mysql_free_result($result);
  157. //返回单一值
  158. return isset($row[0])?$row[0]:false;
  159. } else {
  160. return false;
  161. }
  162. }
  163.  
  164. /**
  165. *析构方法
  166. */
  167. public function __destruct() {
  168. @mysql_close($this->link);
  169. }
  170. /**
  171. *__sleep 序列化对象的时候触发执行
  172. */
  173. public function __sleep() {
  174. return array('host','port','user','pass','charset','dbname') ;
  175. }
  176.  
  177. /**
  178. *__wakeup 反序列化的时候触发执行
  179. *初始化操作
  180. */
  181.  
  182. public function __wakeup() {
  183. //初始化操作
  184. // 连接数据库
  185. $this->my_connect();
  186. // 设置字符集
  187. $this->my_charset();
  188. // 选择数据库
  189. $this->my_dbname();
  190. }
  191.  
  192. /**
  193. *__set 为一个不可访问的属性赋值的时候自动触发
  194. *@param string $name 属性名
  195. *@param mixed $value 属性值
  196. */
  197. public function __set($name,$value) {
  198. $allow_set = array('host','port','user','pass','dbname','charset');
  199. if(in_array($name,$allow_set)) {
  200. //当前属性可以被赋值
  201. $this->$name = $value;
  202. }
  203. }
  204.  
  205. /**
  206. *__get *获得一个不可访问的属性的值的时候自动触发
  207. *@param string $name 属性名
  208. */
  209. public function __get($name) {
  210. $allow_get = array('host','port','user','pass','dbname','charset');
  211. if (in_array($name,$allow_get)) {
  212. return $this->$name;
  213. }
  214. }
  215.  
  216. /**
  217. *__call 访问一个不可访问的对象方法的时候触发
  218. *@param string $name
  219. *@param array $argument 参数列表
  220. */
  221. public function __call($name, $argument) {
  222. echo "对不起,您访问的".$name."()方法不存在!<br/>";
  223. }
  224.  
  225. /**
  226. *__callstatic 访问一个不可访问的类方法(静态方法)的时候触发
  227. *@param string $name
  228. *@param array $argument 参数列表
  229. */
  230. public static function __callStatic($name, $argument) {
  231. echo "对不起,您访问的".$name."()静态方法不存在!<br/>";
  232. }
  233.  
  234. }

PDODB.class.php文件:

  1. <?php
  2. header('content-type:text/html;charset=utf-8');
  3. /**
  4. * 封装PDODB类
  5. */
  6. // 加载接口
  7. include './I_DB.interface.php';
  8. class PDODB implements I_DB {
  9. /**
  10. * 定义相关属性
  11. */
  12. private $host; //主机地址
  13. private $port; //端口号
  14. private $user; //用户名
  15. private $pass; //密码
  16. private $dbname; //数据库名
  17. private $charset;//字符集
  18. private $dsn; //数据源名称
  19. private $pdo; //用于存放PDO的一个对象
  20. // 静态私有属性用于保存单例对象
  21. private static $instance;
  22.  
  23. /**
  24. * [__construct 构造方法]
  25. * @param [array] $config [配置数组]
  26. */
  27. private function __construct($config) {
  28. // 初始化属性
  29. $this->initParams($config);
  30. // 初始化dsn
  31. $this->initDSN();
  32. // 实例化PDO对象
  33. $this->initPDO();
  34. // 初始化PDO对象的属性
  35. $this->initAttribute();
  36. }
  37.  
  38. /**
  39. * [getInstance 获取PDO单例对象的公开方法]
  40. * @param [array] $config [description]
  41. * @return [PDOobject] self::$instance [pdo对象]
  42. */
  43. public static function getInstance($config) {
  44. if (!self::$instance instanceof self) {
  45. self::$instance = new self($config);
  46. }
  47. return self::$instance;
  48. }
  49.  
  50. /**
  51. * [initParams 初始化属性]
  52. * @param [array] $config [配置数组]
  53. */
  54. private function initParams($config) {
  55. $this->host = isset($config['host'])?$config['host']:'localhost';
  56. $this->port = isset($config['port'])?$config['port']:'3306';
  57. $this->user = isset($config['user'])?$config['user']:'root';
  58. $this->pass = isset($config['pass'])?$config['pass']:'';
  59. $this->dbname = isset($config['dbname'])?$config['dbname']:'';
  60. $this->charset = isset($config['charset'])?$config['charset']:'utf8';
  61. }
  62. /**
  63. * [initDSN 初始化dsn]
  64. */
  65. private function initDSN() {
  66. $this->dsn = "mysql:host=$this->host;port=$this->port;dbname=$this->dbname;charset=$this->charset";
  67. }
  68.  
  69. /**
  70. * [initPDO 实例化PDO对象]
  71. * @return [boolean] [false|none]
  72. */
  73. private function initPDO() {
  74. // 在实例化PDO对象的时候自动的走异常模式(也是唯一走异常模式的地方)
  75. try{
  76. $this->pdo = new PDO($this->dsn,$this->user,$this->pass);
  77. }catch(PDOException $e) {
  78. $this->my_error($e);
  79. }
  80. }
  81.  
  82. /**
  83. * [initAttribute 初始化PDO对象属性]
  84. * @return [boolean] [false|none]
  85. */
  86. private function initAttribute() {
  87. // 修改错误模式为异常模式
  88. $this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  89. }
  90.  
  91. /**
  92. * [my_error 输出异常信息]
  93. * @param [PDOException] $e [异常对象]
  94. * @return [boolean] [false|none]
  95. */
  96. private function my_error($e) {
  97. echo "执行sql语句失败!<br/>";
  98. echo "错误的代码是:",$e->getCode(),"<br/>";
  99. echo "错误的信息是:",$e->getMessage(),"<br/>";
  100. echo "错误的脚本是:",$e->getFile(),"<br/>";
  101. echo "错误的行号是:",$e->getLine(),'<br/>';
  102. return false;
  103. }
  104.  
  105. /**
  106. * [my_query 执行一条sql语句,实现增删改]
  107. * @param [string] $sql [sql语句]
  108. * @return [array] $result [资源结果集]
  109. */
  110. public function my_query($sql) {
  111. // 其实就是调用pdo对象中的exec方法
  112. try{
  113. $result = $this->pdo->exec($sql);
  114. }catch(PDOException $e) {
  115. $this->my_error($e);
  116. }
  117. return $result;
  118. }
  119.  
  120. /**
  121. * [fetchAll 查询所有]
  122. * @param [string] $sql [sql语句]
  123. * @return [arry] $result [资源结果集]
  124. */
  125. public function fetchAll($sql) {
  126. // 其实就是调用PDOStatment对象里面的fetchAll方法
  127. try{
  128. $stmt = $this->pdo->query($sql);
  129. $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
  130. // 关闭游标,释放结果集
  131. $stmt->closeCursor();
  132. }catch(PDOException $e) {
  133. $this->my_error($e);
  134. }
  135. return $result;
  136. }
  137.  
  138. /**
  139. * [fetchRow 查询一条]
  140. * @param [string] $sql [sql语句]
  141. * @return [arry] $result [资源结果集]
  142. */
  143. public function fetchRow($sql) {
  144. // 其实就是调用PDOStatment对象里面的fetch方法
  145. try{
  146. $stmt = $this->pdo->query($sql);
  147. $result = $stmt->fetch(PDO::FETCH_ASSOC);
  148. // 关闭游标,释放结果集
  149. $stmt->closeCursor();
  150. }catch(PDOException $e) {
  151. $this->my_error($e);
  152. }
  153. return $result;
  154. }
  155.  
  156. /**
  157. * [fetchColumn 查询单行单列]
  158. * @param [string] $sql [sql语句]
  159. * @return [arry] $result [资源结果集]
  160. */
  161. public function fetchColumn($sql) {
  162. // 其实就是调用PDOStatment对象里面的fetchColumn方法
  163. try{
  164. $stmt = $this->pdo->query($sql);
  165. $result = $stmt->fetchColumn();
  166. // 关闭游标,释放结果集
  167. $stmt->closeCursor();
  168. }catch(PDOException $e) {
  169. $this->my_error($e);
  170. }
  171. return $result;
  172. }
  173.  
  174. /**
  175. * [__clone 私有化克隆方法,保护单例模式]
  176. */
  177. private function __clone() {}
  178.  
  179. /**
  180. * [__set 为一个不可访问的属性赋值的时候自动触发]
  181. * @param [string] $name [属性名]
  182. * @param [mixed] $value [属性值]
  183. */
  184. public function __set($name,$value) {
  185. $allow_set = array('host','port','user','pass','dbname','charset');
  186. if(in_array($name,$allow_set)) {
  187. //当前属性可以被赋值
  188. $this->$name = $value;
  189. }
  190. }
  191.  
  192. /**
  193. * [__get *获得一个不可访问的属性的值的时候自动触发]
  194. * @param [string] $name [属性名]
  195. * @return [string] $name的value [该属性名的值]
  196. */
  197. public function __get($name) {
  198. $allow_get = array('host','port','user','pass','dbname','charset');
  199. if (in_array($name,$allow_get)) {
  200. return $this->$name;
  201. }
  202. }
  203.  
  204. /**
  205. * [__call 访问一个不可访问的对象方法的时候触发]
  206. * @param [string] $name [属性名]
  207. * @param [array] $argument [参数列表]
  208. */
  209. public function __call($name, $argument) {
  210. echo "对不起,您访问的".$name."()方法不存在!<br/>";
  211. }
  212.  
  213. /**
  214. * [__callstatic 访问一个不可访问的类方法(静态方法)的时候触发]
  215. * @param [string] $name [属性名]
  216. * @param [array] $argument [参数列表]
  217. */
  218. public static function __callStatic($name, $argument) {
  219. echo "对不起,您访问的".$name."()静态方法不存在!<br/>";
  220. }
  221. }

最后的测试类:

  1. <?php
  2. header('content-type:text/html;charset=utf-8');
  3. // 先读取配置文件
  4. $conf = include './config.php';
  5.  
  6. $config = [
  7. 'pass'=>'123456',
  8. 'dbname'=>'bbs'
  9. ];
  10.  
  11. // 实例化数据库操作对象
  12. switch ($conf['DB']['default_extension']) {
  13. case 'mysql':
  14. include './MySQLDB.class.php';
  15. $db = MySQLDB::getInstance($config);
  16. break;
  17. case 'pdo':
  18. include './PDODB.class.php';
  19. $db = PDODB::getInstance($config);
  20. break;
  21. default:
  22. break;
  23. }
  24.  
  25. $sql = "select * from user limit 4";
  26. echo "<pre>";
  27. var_dump($db->fetchAll($sql));
  28. echo "</pre>";
  29. echo "<hr>";

测试结果:

 还可以在配置文件config.php中切换到pdo中操作数据库!

封装:PDO与MySQL之间的无缝切换的更多相关文章

  1. 面向对象的方式进行数据交换网络之间的差异--无缝切换的发展到单机游戏C/S模式

    上一页本文描述描述有关数据的发展过程之间的差异支撑点,这里展示的另一个特点:无缝切换的发展,以独立C/S模式 一般C/S模式都面临一个问题: 就是开发过程中的调试难题,由于涉及到client和服务端相 ...

  2. log4net使用封装,无缝切换 dotnet 和 dotnetcore

    log4net使用封装,无缝切换 dotnet 和 dotnetcore Intro 自己有几个自己的小项目,有许多公用的方法/扩展/工具类等等,于是封装了一些常用的工具类/扩展方法 WeihanLi ...

  3. MediaPlayer: 在不同控件之间实现视频的无缝切换的方法

    最近使用MediaPlayer + TextureView 实现了一个视频播放器,并且实现了它的横竖屏切换的效果,唯一美中不足的是在横竖屏切换的时候画面会卡顿一下,虽然也不影响播放,但是怕测试会报Bu ...

  4. php-fpm 和 mysql 之间的关系

    我们都知道,php是不能直接操作 mysql的,他需要通过扩展提供接口调用,php的mysql扩展也好几个,只支持面向过程的mysql,既支持面向过程也支持面向对象的mysqli,只支持面向对象的PD ...

  5. 手写jwt验证,实现java和node无缝切换

    前言 前端时间和我朋友写了一个简易用户管理后台,功能其实很简单,涉及到的技术栈有:vue+elementUI,java+spring MVC以及node+egg,数据库用的mysql,简单方便. 一开 ...

  6. Android主题换肤 无缝切换

    2016年7月6日 更新:主题换肤库子项目地址:ThemeSkinning,让app集成换肤更加容易.欢迎star以及使用,提供改进意见. 更新日志: v1.3.0:增加一键切换切换字体(初版)v1. ...

  7. MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL

    [转载]http://www.cnblogs.com/52fhy/p/5352304.html 本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对 ...

  8. 面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式

    上一篇这里描写叙述了一个关于差异数据在开发过程中的一个长处,这里来演示另外一个特点:单机开发之无缝切换到C/S模式 一般C/S模式都面临一个问题: 就是开发过程中的调试难题,由于涉及到client和服 ...

  9. EasyDSS视频点播服务器实现多分辨率/多码率无缝切换的办法

    EasyDSS流媒体音视频直播与点播服务器软件,是一套提供一站式的转码.点播.直播.检索.回放.录像下载服务的高性能RTMP/HLS/HTTP-FLV流媒体服务,极大地简化了流媒体相关业务的开发和集成 ...

随机推荐

  1. Maven实战04_使用Archetype生成项目骨架

    在上一章中的HelloWorld中,我们的项目遵循了一些Maven项目的约定 在项目的根目录中放置pom.xml 在src/main/java目录中放置项目的主代码 在src/test/java目录中 ...

  2. idea短信验证

    idea短信验证(短信接口:阿里云:消息中间件:activeMQ) 主要分为两步:1.创建发消息  2.创建收消息 1.创建发消息 1.1 创建maven工程 1.2 pom.xml文件导入依赖 注意 ...

  3. Jmeter设置中文汉化

    下载汉化包logkit-2.0.jar 将汉化包copy至 jmeter文件的lib目录下 打开Jmeter软件,设置汉化包 Options  ->  ChooseLanguage  -> ...

  4. HBase 三维模型解析

    总结下一直想写hbase的实践经验,在用hbase的过程中,我们都知道,rowkey设计的好坏,是我们能最大发挥hbase的架构优势,也是我们是否正确理解hbase的一个关键点.闲话少说,进入正题. ...

  5. linux后台执行程序相关命令

    linux下我们如果想一个任务或者程序还后台执行可以使用&,实际上linux还提供了其他任务调度的命令. bg将一个在后台暂停的命令,变成继续执行 fg将后台中的命令调至前台继续运行 jobs ...

  6. 如何在 Flink 1.9 中使用 Hive?

    Apache Flink 从 1.9.0 版本开始增加了与 Hive 集成的功能,用户可以通过 Flink 来访问 Hive 的元数据,以及读写 Hive 中的表.本文将主要从项目的设计架构.最新进展 ...

  7. 「G2016 SCOI2018 Round #2」B

    传送门 杜教筛的简单题. 莫比乌斯反演一下,然后杜教筛.

  8. LATEX公式集锦(转载)

  9. linux 修改命令提示符&ubuntu目录颜色个性化

    1.linux 命令提示符个性化 在 ANSI 兼容终端(例如 xterm.rxvt.konsole 等)里, 可以用彩色显示文本而不仅仅是黑白. 本文示范了如何使用粗体和彩色的文字.     相信每 ...

  10. 深入了解MVC(转)

    MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性.可移植性,代码的可 ...