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

文件目录:

config.php文件:

 

<?php

return array(
// 数据库配置
'DB' => array(
'default_extension'=>'mysql', //这里可以是pdo或mysql
),
// 分页配置
// 上传配置
// 图像处理配置
);

I_DB.interface.php文件:

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

MySQLDB.class.php文件:

<?php
header('content-type:text/html;charset=utf-8');
/**
* MySQL数据库工具类
*/
//加载接口
include './I_DB.interface.php';
class MySQLDB implements I_DB{
private $host; //主机地址
private $port; //端口号
private $user; //用户名
private $pass; //密码
private $dbname; //数据库名
private $charset;//字符集
private $link; //保存连接数据库资源
private static $instance = null; //单例模式中的$MySQLDB对象 /**
*@param array $config 配置文件
*/
private function __construct ($config) { // 初始化属性的值
$this->init($config);
// 连接数据库
$this->my_connect();
// 设置字符集
$this->my_charset();
// 选择数据库
$this->my_dbname();
} /**
* 只能new一次,单例模式
*@param array $config 传递给构造方法的数组参数
*/
public static function getInstance($config) {
if (self::$instance == null) {
self::$instance = new self($config);
}
return self::$instance;
} /***
*私有化克隆魔术方法
*/
private function _clone() {} /**
*初始化
*@param array $config 传递给初始化方法的数组参数
*/
private function init($config) {
$this->host = isset($config['host'])?$config['host']:'localhost';
$this->port = isset($config['port'])?$config['port']:'3306';
$this->user = isset($config['user'])?$config['user']:'root';
$this->pass = isset($config['pass'])?$config['pass']:'';
$this->dbname = isset($config['dbname'])?$config['dbname']:'';
$this->charset = isset($config['charset'])?$config['charset']:'utf8';
} /**
*错误测试方法
*@param string $sql sql语句
*直接用途:用来增删改
*/
public function my_query($sql) {
if ($result = mysql_query($sql)) {
return $result;
}else {
echo "执行sql语句失败;<br/>";
echo "错误代码:",mysql_errno(),"<br/>";
echo "错误信息:",mysql_error(),'<br/>';
return false;
}
}
/**
*连接数据库
*/
private function my_connect() {
if ($link = mysql_connect("$this->host:$this->port",$this->user,$this->pass)) {
$this->link = $link;
}else {
echo "连接数据库失败:<br/>";
echo "错误代码:",mysql_errno(),"<br/>";
echo "错误信息:",mysql_error(),'<br/>';
return false;
}
} /**
*设置字符集
*/
private function my_charset() {
$sql = "set names $this->charset";
$this->my_query($sql);
}
/**
*选择数据库
*/
private function my_dbname() {
$sql = "use $this->dbname";
return $this->my_query($sql);
} /**
*返回多行多列的结果集,二维数组
*@param string sql语句
*@return mixed(array|false) *执行成功返回数组,失败返回false
*/
public function fetchAll($sql) {
if($result = $this->my_query($sql)) {
//返回资源结果集,遍历
$rows[] = '';
while ($row = mysql_fetch_assoc($result)) {
$rows[] = $row;
}
//结果集使用完毕,主动释放
mysql_free_result($result);
//返回二维数组
return $rows;
} else {
return false;
} } /**
* 返回一行多列的结果集,一维数组
*@param string 一条sql语句
*@return mixed(array|false) 执行成功返回数组,失败返回false
*/
public function fetchRow($sql) {
if($result = $this->my_query($sql)) {
//返回资源结果集,遍历
$row = mysql_fetch_assoc($result);
//结果集使用完毕,主动释放
mysql_free_result($result);
//返回一维数组
return $row;
} else {
return false;
}
} /**
*返回一行一列的结果集,单一值
*@param string 一条sql语句
*@return mixed(array|false) 执行成功返回数组,失败返回false
*/
public function fetchColumn($sql) {
if($result = $this->my_query($sql)) {
//返回资源结果集,提取
$row = mysql_fetch_row($result);
//结果集使用完毕,主动释放
mysql_free_result($result);
//返回单一值
return isset($row[0])?$row[0]:false;
} else {
return false;
}
} /**
*析构方法
*/
public function __destruct() {
@mysql_close($this->link);
}
/**
*__sleep 序列化对象的时候触发执行
*/
public function __sleep() {
return array('host','port','user','pass','charset','dbname') ;
} /**
*__wakeup 反序列化的时候触发执行
*初始化操作
*/ public function __wakeup() {
//初始化操作
// 连接数据库
$this->my_connect();
// 设置字符集
$this->my_charset();
// 选择数据库
$this->my_dbname();
} /**
*__set 为一个不可访问的属性赋值的时候自动触发
*@param string $name 属性名
*@param mixed $value 属性值
*/
public function __set($name,$value) {
$allow_set = array('host','port','user','pass','dbname','charset');
if(in_array($name,$allow_set)) {
//当前属性可以被赋值
$this->$name = $value;
}
} /**
*__get *获得一个不可访问的属性的值的时候自动触发
*@param string $name 属性名
*/
public function __get($name) {
$allow_get = array('host','port','user','pass','dbname','charset');
if (in_array($name,$allow_get)) {
return $this->$name;
}
} /**
*__call 访问一个不可访问的对象方法的时候触发
*@param string $name
*@param array $argument 参数列表
*/
public function __call($name, $argument) {
echo "对不起,您访问的".$name."()方法不存在!<br/>";
} /**
*__callstatic 访问一个不可访问的类方法(静态方法)的时候触发
*@param string $name
*@param array $argument 参数列表
*/
public static function __callStatic($name, $argument) {
echo "对不起,您访问的".$name."()静态方法不存在!<br/>";
} }

PDODB.class.php文件:

<?php
header('content-type:text/html;charset=utf-8');
/**
* 封装PDODB类
*/
// 加载接口
include './I_DB.interface.php';
class PDODB implements I_DB {
/**
* 定义相关属性
*/
private $host; //主机地址
private $port; //端口号
private $user; //用户名
private $pass; //密码
private $dbname; //数据库名
private $charset;//字符集
private $dsn; //数据源名称
private $pdo; //用于存放PDO的一个对象
// 静态私有属性用于保存单例对象
private static $instance; /**
* [__construct 构造方法]
* @param [array] $config [配置数组]
*/
private function __construct($config) {
// 初始化属性
$this->initParams($config);
// 初始化dsn
$this->initDSN();
// 实例化PDO对象
$this->initPDO();
// 初始化PDO对象的属性
$this->initAttribute();
} /**
* [getInstance 获取PDO单例对象的公开方法]
* @param [array] $config [description]
* @return [PDOobject] self::$instance [pdo对象]
*/
public static function getInstance($config) {
if (!self::$instance instanceof self) {
self::$instance = new self($config);
}
return self::$instance;
} /**
* [initParams 初始化属性]
* @param [array] $config [配置数组]
*/
private function initParams($config) {
$this->host = isset($config['host'])?$config['host']:'localhost';
$this->port = isset($config['port'])?$config['port']:'3306';
$this->user = isset($config['user'])?$config['user']:'root';
$this->pass = isset($config['pass'])?$config['pass']:'';
$this->dbname = isset($config['dbname'])?$config['dbname']:'';
$this->charset = isset($config['charset'])?$config['charset']:'utf8';
}
/**
* [initDSN 初始化dsn]
*/
private function initDSN() {
$this->dsn = "mysql:host=$this->host;port=$this->port;dbname=$this->dbname;charset=$this->charset";
} /**
* [initPDO 实例化PDO对象]
* @return [boolean] [false|none]
*/
private function initPDO() {
// 在实例化PDO对象的时候自动的走异常模式(也是唯一走异常模式的地方)
try{
$this->pdo = new PDO($this->dsn,$this->user,$this->pass);
}catch(PDOException $e) {
$this->my_error($e);
}
} /**
* [initAttribute 初始化PDO对象属性]
* @return [boolean] [false|none]
*/
private function initAttribute() {
// 修改错误模式为异常模式
$this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
} /**
* [my_error 输出异常信息]
* @param [PDOException] $e [异常对象]
* @return [boolean] [false|none]
*/
private function my_error($e) {
echo "执行sql语句失败!<br/>";
echo "错误的代码是:",$e->getCode(),"<br/>";
echo "错误的信息是:",$e->getMessage(),"<br/>";
echo "错误的脚本是:",$e->getFile(),"<br/>";
echo "错误的行号是:",$e->getLine(),'<br/>';
return false;
} /**
* [my_query 执行一条sql语句,实现增删改]
* @param [string] $sql [sql语句]
* @return [array] $result [资源结果集]
*/
public function my_query($sql) {
// 其实就是调用pdo对象中的exec方法
try{
$result = $this->pdo->exec($sql);
}catch(PDOException $e) {
$this->my_error($e);
}
return $result;
} /**
* [fetchAll 查询所有]
* @param [string] $sql [sql语句]
* @return [arry] $result [资源结果集]
*/
public function fetchAll($sql) {
// 其实就是调用PDOStatment对象里面的fetchAll方法
try{
$stmt = $this->pdo->query($sql);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 关闭游标,释放结果集
$stmt->closeCursor();
}catch(PDOException $e) {
$this->my_error($e);
}
return $result;
} /**
* [fetchRow 查询一条]
* @param [string] $sql [sql语句]
* @return [arry] $result [资源结果集]
*/
public function fetchRow($sql) {
// 其实就是调用PDOStatment对象里面的fetch方法
try{
$stmt = $this->pdo->query($sql);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
// 关闭游标,释放结果集
$stmt->closeCursor();
}catch(PDOException $e) {
$this->my_error($e);
}
return $result;
} /**
* [fetchColumn 查询单行单列]
* @param [string] $sql [sql语句]
* @return [arry] $result [资源结果集]
*/
public function fetchColumn($sql) {
// 其实就是调用PDOStatment对象里面的fetchColumn方法
try{
$stmt = $this->pdo->query($sql);
$result = $stmt->fetchColumn();
// 关闭游标,释放结果集
$stmt->closeCursor();
}catch(PDOException $e) {
$this->my_error($e);
}
return $result;
} /**
* [__clone 私有化克隆方法,保护单例模式]
*/
private function __clone() {} /**
* [__set 为一个不可访问的属性赋值的时候自动触发]
* @param [string] $name [属性名]
* @param [mixed] $value [属性值]
*/
public function __set($name,$value) {
$allow_set = array('host','port','user','pass','dbname','charset');
if(in_array($name,$allow_set)) {
//当前属性可以被赋值
$this->$name = $value;
}
} /**
* [__get *获得一个不可访问的属性的值的时候自动触发]
* @param [string] $name [属性名]
* @return [string] $name的value [该属性名的值]
*/
public function __get($name) {
$allow_get = array('host','port','user','pass','dbname','charset');
if (in_array($name,$allow_get)) {
return $this->$name;
}
} /**
* [__call 访问一个不可访问的对象方法的时候触发]
* @param [string] $name [属性名]
* @param [array] $argument [参数列表]
*/
public function __call($name, $argument) {
echo "对不起,您访问的".$name."()方法不存在!<br/>";
} /**
* [__callstatic 访问一个不可访问的类方法(静态方法)的时候触发]
* @param [string] $name [属性名]
* @param [array] $argument [参数列表]
*/
public static function __callStatic($name, $argument) {
echo "对不起,您访问的".$name."()静态方法不存在!<br/>";
}
}

最后的测试类:

<?php
header('content-type:text/html;charset=utf-8');
// 先读取配置文件
$conf = include './config.php'; $config = [
'pass'=>'123456',
'dbname'=>'bbs'
]; // 实例化数据库操作对象
switch ($conf['DB']['default_extension']) {
case 'mysql':
include './MySQLDB.class.php';
$db = MySQLDB::getInstance($config);
break;
case 'pdo':
include './PDODB.class.php';
$db = PDODB::getInstance($config);
break;
default:
break;
} $sql = "select * from user limit 4";
echo "<pre>";
var_dump($db->fetchAll($sql));
echo "</pre>";
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. hdu 1171 (背包或者母函数问题)

    Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. Bu ...

  2. Django项目: 项目环境搭建 ---- 一、创建django项目

    项目环境搭建 一.创建django项目 1.创建python虚拟环境 在虚拟机上创建python虚拟环境,因为实际项目部署,实在linux mkvirtualenv -p /usr/bin/pytho ...

  3. Simple implementation and results of genetic algorithm.

    This experiment was done for the final assignment of my Professional English class. This part has be ...

  4. 矩阵快速幂求Fibonacci

    原理 我们取矩阵A 则 F1=F2=1;则可以轻易求出F(i) #define maxn 2 #define mo 1000000007 struct Matrix{ long long a[maxn ...

  5. BZOJ1491:1491: [NOI2007]社交网络

    1491: [NOI2007]社交网络 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2204  Solved: 1175[Submit][Status ...

  6. Objective-C头文件导出工具class-dump

    首先,这个工具是开源的.作者网站:http://stevenygard.com/projects/class-dump/ 用途: 分析库文件或可执行文件,得到Objective-C类和部分C结构体的信 ...

  7. WWDC2013 Objective-C 新特性

    WWDC(Apple Worldwide Developers Conference),苹果开发者大会,苹果开发者怎么能少得了Objective-C,正是它支撑着整个苹果开发生态圈,同样这门语言也代表 ...

  8. [转载]C语言EOF是什么?

    原贴网址:http://www.kuqin.com/language/20111112/314745.html 收藏于此: 我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的 ...

  9. 关于python的字典操作

    字典和列表的区别: 列表是有序的 字典是无序的 字典使用{}定义 字典使用键值对存储数据,键值对之间使用 “   ,”分隔 键 key 是索引 值 value 是数据 键和值之间使用  “  :”分隔 ...

  10. JSP-response(HttpServletResponse)

    1 HttpServletResponse概述 2 Response 运行过程 3 通过抓包工具抓取Http响应 4 响应行 5 设置响应头 set  和add的区别 6 重定向 需要完成分析‘ 6 ...