全新的PDO数据库操作类php版(仅适用Mysql)


Posted in PHP onJuly 22, 2012
/** 
* 作者:胡睿 
* 日期:2012/07/21 
* 电邮:hooray0905@foxmail.com 
*/ class HRDB{ 
protected $pdo; 
protected $res; 
protected $config; 
/*构造函数*/ 
function __construct($config){ 
$this->Config = $config; 
$this->connect(); 
} 
/*数据库连接*/ 
public function connect(){ 
$this->pdo = new PDO($this->Config['dsn'], $this->Config['name'], $this->Config['password']); 
$this->pdo->query('set names utf8;'); 
//把结果序列化成stdClass 
//$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); 
//自己写代码捕获Exception 
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
/*数据库关闭*/ 
public function close(){ 
$this->pdo = null; 
} 
public function query($sql){ 
$res = $this->pdo->query($sql); 
if($res){ 
$this->res = $res; 
} 
} 
public function exec($sql){ 
$res = $this->pdo->exec($sql); 
if($res){ 
$this->res = $res; 
} 
} 
public function fetchAll(){ 
return $this->res->fetchAll(); 
} 
public function fetch(){ 
return $this->res->fetch(); 
} 
public function fetchColumn(){ 
return $this->res->fetchColumn(); 
} 
public function lastInsertId(){ 
return $this->res->lastInsertId(); 
} 
/** 
* 参数说明 
* int $debug 是否开启调试,开启则输出sql语句 
* 0 不开启 
* 1 开启 
* 2 开启并终止程序 
* int $mode 返回类型 
* 0 返回多条记录 
* 1 返回单条记录 
* 2 返回行数 
* string/array $table 数据库表,两种传值模式 
* 普通模式: 
* 'tb_member, tb_money' 
* 数组模式: 
* array('tb_member', 'tb_money') 
* string/array $fields 需要查询的数据库字段,允许为空,默认为查找全部,两种传值模式 
* 普通模式: 
* 'username, password' 
* 数组模式: 
* array('username', 'password') 
* string/array $sqlwhere 查询条件,允许为空,两种传值模式 
* 普通模式: 
* 'and type = 1 and username like "%os%"' 
* 数组模式: 
* array('type = 1', 'username like "%os%"') 
* string $orderby 排序,默认为id倒序 
*/ 
public function select($debug, $mode, $table, $fields="*", $sqlwhere="", $orderby="tbid desc"){ 
//参数处理 
if(is_array($table)){ 
$table = implode(', ', $table); 
} 
if(is_array($fields)){ 
$fields = implode(', ', $fields); 
} 
if(is_array($sqlwhere)){ 
$sqlwhere = ' and '.implode(' and ', $sqlwhere); 
} 
//数据库操作 
if($debug === 0){ 
if($mode === 2){ 
$this->query("select count(tbid) from $table where 1=1 $sqlwhere"); 
$return = $this->fetchColumn(); 
}else if($mode === 1){ 
$this->query("select $fields from $table where 1=1 $sqlwhere order by $orderby"); 
$return = $this->fetch(); 
}else{ 
$this->query("select $fields from $table where 1=1 $sqlwhere order by $orderby"); 
$return = $this->fetchAll(); 
} 
return $return; 
}else{ 
if($mode === 2){ 
echo "select count(tbid) from $table where 1=1 $sqlwhere"; 
}else if($mode === 1){ 
echo "select $fields from $table where 1=1 $sqlwhere order by $orderby"; 
} 
else{ 
echo "select $fields from $table where 1=1 $sqlwhere order by $orderby"; 
} 
if($debug === 2){ 
exit; 
} 
} 
} 
/** 
* 参数说明 
* int $debug 是否开启调试,开启则输出sql语句 
* 0 不开启 
* 1 开启 
* 2 开启并终止程序 
* int $mode 返回类型 
* 0 无返回信息 
* 1 返回执行条目数 
* 2 返回最后一次插入记录的id 
* string/array $table 数据库表,两种传值模式 
* 普通模式: 
* 'tb_member, tb_money' 
* 数组模式: 
* array('tb_member', 'tb_money') 
* string/array $set 需要插入的字段及内容,两种传值模式 
* 普通模式: 
* 'username = "test", type = 1, dt = now()' 
* 数组模式: 
* array('username = "test"', 'type = 1', 'dt = now()') 
*/ 
public function insert($debug, $mode, $table, $set){ 
//参数处理 
if(is_array($table)){ 
$table = implode(', ', $table); 
} 
if(is_array($set)){ 
$set = implode(', ', $set); 
} 
//数据库操作 
if($debug === 0){ 
if($mode === 2){ 
$this->query("insert into $table set $set"); 
$return = $this->lastInsertId(); 
}else if($mode === 1){ 
$this->exec("insert into $table set $set"); 
$return = $this->res; 
}else{ 
$this->query("insert into $table set $set"); 
$return = NULL; 
} 
return $return; 
}else{ 
echo "insert into $table set $set"; 
if($debug === 2){ 
exit; 
} 
} 
} 
/** 
* 参数说明 
* int $debug 是否开启调试,开启则输出sql语句 
* 0 不开启 
* 1 开启 
* 2 开启并终止程序 
* int $mode 返回类型 
* 0 无返回信息 
* 1 返回执行条目数 
* string $table 数据库表,两种传值模式 
* 普通模式: 
* 'tb_member, tb_money' 
* 数组模式: 
* array('tb_member', 'tb_money') 
* string/array $set 需要更新的字段及内容,两种传值模式 
* 普通模式: 
* 'username = "test", type = 1, dt = now()' 
* 数组模式: 
* array('username = "test"', 'type = 1', 'dt = now()') 
* string/array $sqlwhere 修改条件,允许为空,两种传值模式 
* 普通模式: 
* 'and type = 1 and username like "%os%"' 
* 数组模式: 
* array('type = 1', 'username like "%os%"') 
*/ 
public function update($debug, $mode, $table, $set, $sqlwhere=""){ 
//参数处理 
if(is_array($table)){ 
$table = implode(', ', $table); 
} 
if(is_array($set)){ 
$set = implode(', ', $set); 
} 
if(is_array($sqlwhere)){ 
$sqlwhere = ' and '.implode(' and ', $sqlwhere); 
} 
//数据库操作 
if($debug === 0){ 
if($mode === 1){ 
$this->exec("update $table set $set where 1=1 $sqlwhere"); 
$return = $this->res; 
}else{ 
$this->query("update $table set $set where 1=1 $sqlwhere"); 
$return = NULL; 
} 
return $return; 
}else{ 
echo "update $table set $set where 1=1 $sqlwhere"; 
if($debug === 2){ 
exit; 
} 
} 
} 
/** 
* 参数说明 
* int $debug 是否开启调试,开启则输出sql语句 
* 0 不开启 
* 1 开启 
* 2 开启并终止程序 
* int $mode 返回类型 
* 0 无返回信息 
* 1 返回执行条目数 
* string $table 数据库表 
* string/array $sqlwhere 删除条件,允许为空,两种传值模式 
* 普通模式: 
* 'and type = 1 and username like "%os%"' 
* 数组模式: 
* array('type = 1', 'username like "%os%"') 
*/ 
public function delete($debug, $mode, $table, $sqlwhere=""){ 
//参数处理 
if(is_array($sqlwhere)){ 
$sqlwhere = ' and '.implode(' and ', $sqlwhere); 
} 
//数据库操作 
if($debug === 0){ 
if($mode === 1){ 
$this->exec("delete from $table where 1=1 $sqlwhere"); 
$return = $this->res; 
}else{ 
$this->query("delete from $table where 1=1 $sqlwhere"); 
$return = NULL; 
} 
return $return; 
}else{ 
echo "delete from $table where 1=1 $sqlwhere"; 
if($debug === 2){ 
exit; 
} 
} 
} 
}

其实使用上,和之前的相差不大,目的就是为了方便移植。

本次重写着重处理了几个问题:

① insert语句太复杂,fields与values对应容易出现误差

我们看下最常见的一句sql插入语句

insert into tb_member (username, type, dt) values ('test', 1, now())

在传统模式下,fields和values参数是分开传入的,但却要保证两者参数传入的顺序一致。这很容易导致顺序错乱或者漏传某个参数。

这次已经把问题修改了,采用了mysql独有的insert语法,同样是上面那功能,就可以换成这样的写法

insert into tb_member set username = "test", type = 1, lastlogindt = now()

就像update一样,一目了然。

② 部分参数可以用数组代替

比如这样一句sql

delete from tb_member where 1=1 and tbid = 1 and username = "hooray"

在原先调用方法的时候,需要手动拼装好where条件,这样操作的成本很高,现在完全可以用这种形式

$where = array( 
'tbid = 1', 
'username = "hooray"' 
); 
$db->delete(1, 0, 'tb_member', $where);

条件再多也不会打乱你的思路。同样,不仅仅是where参数,update里的set也可以以这种形式(具体可参见完整源码)

$set = array('username = "123"', 'type = 1', 'lastlogindt = now()'); 
$where = array('tbid = 1'); 
$db->update(1, 0, 'tb_member', $set, $where);

③ 可自定义sql语句

有时候,sql过于复杂,导致无法使用类里提供的方法去组装sql语句,这时候就需要一个功能,就是能直接传入我已经组装好的sql语句执行,并返回信息。现在,这功能也有了

$db->query('select username, password from tb_member'); 
$rs = $db->fetchAll();

是不是很像pdo原生态的写法?

④ 支持创建多数据库连接

原先的因为只是数据库操作方法,所以并不支持多数据库连接,在实现上需要复制出2个相同的文件,修改部分变量,操作实属复杂。现在这问题也解决了。

$db_hoorayos_config = array( 
'dsn'=>'mysql:host=localhost;dbname=hoorayos', 
'name'=>'root', 
'password'=>'hooray' 
); 
$db = new HRDB($db_hoorayos_config); $db_hoorayos_config2 = array( 
'dsn'=>'mysql:host=localhost;dbname=hoorayos2', 
'name'=>'root', 
'password'=>'hooray' 
); 
$db2 = new HRDB($db_hoorayos_config2);

这样就能同时创建2个数据库连接,方便处理数据库与数据库交互的情况。

大致新功能就是这么多了,整个代码并不多,欢迎阅读了解。下面是我在编写时写的测试代码,也一并提供上来,方便大家学习。

require_once('global.php'); 
require_once('inc/setting.inc.php'); $db = new HRDB($db_hoorayos_config); 
echo '<hr><b>select测试</b><hr>'; 
echo '普通模式,直接字符串传入<br>'; 
$rs = $db->select(1, 0, 'tb_member', 'username, password', 'and type = 1 and username like "%os%"'); 
echo '<br>数组模式,可传入数组<br>'; 
$fields = array('username', 'password'); 
$where = array('type = 1', 'username like "%os%"'); 
$rs = $db->select(1, 0, 'tb_member', $fields, $where); 
echo '<hr><b>insert测试</b><hr>'; 
echo '普通模式,直接字符串传入<br>'; 
$db->insert(1, 0, 'tb_member', 'username = "test", type = 1, lastlogindt = now()'); 
echo '<br>数组模式,可传入数组<br>'; 
$set = array('username = "test"', 'type = 1', 'lastlogindt = now()'); 
$db->insert(1, 0, 'tb_member', $set); 
echo '<hr><b>update测试</b><hr>'; 
echo '普通模式,直接字符串传入<br>'; 
$db->update(1, 0, 'tb_member', 'username = "123", type = 1, lastlogindt = now()', 'and tbid = 7'); 
echo '<br>数组模式,可传入数组<br>'; 
$set = array('username = "123"', 'type = 1', 'lastlogindt = now()'); 
$where = array('tbid = 1'); 
$db->update(1, 0, 'tb_member', $set, $where); 
echo '<hr><b>delete测试</b><hr>'; 
echo '普通模式,直接字符串传入<br>'; 
$db->delete(1, 0, 'tb_member', 'and tbid = 1 and username = "hooray"'); 
echo '<br>数组模式,可传入数组<br>'; 
$where = array( 
'tbid = 1', 
'username = "hooray"' 
); 
$db->delete(1, 0, 'tb_member', $where); 
echo '<hr><b>自定义sql</b><hr>'; 
$db->query('select username, password from tb_member'); 
$rs = $db->fetchAll(); 
var_dump($rs); 
$db->close();

作者:胡??X
PHP 相关文章推荐
一个可查询所有表的“通用”查询分页类
Oct 09 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
php常用Output和ptions/Info函数集介绍
Jun 19 PHP
php下获取http状态的实现代码
May 09 PHP
destoon公司主页模板风格的添加方法
Jun 20 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
PHP安装threads多线程扩展基础教程
Nov 17 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
PHP构造函数与析构函数用法示例
Sep 28 PHP
PHP实现生成带背景的图形验证码功能
Oct 03 PHP
PHP那些琐碎的知识点(整理)
May 20 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
Jul 20 #PHP
php中的一些数组排序方法分享
Jul 20 #PHP
xml在joomla表单中的应用详解分享
Jul 19 #PHP
ajax在joomla中的原生态应用代码
Jul 19 #PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
Jul 19 #PHP
php在项目中寻找代码的坏味道(综艺命名)
Jul 19 #PHP
PHP的5个安全措施小结
Jul 17 #PHP
You might like
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
php cout&amp;lt;&amp;lt;的一点看法
2010/01/24 PHP
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
PHP速成大法
2015/01/30 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
javascript多物体运动实现方法分析
2016/01/08 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
tsconfig.json配置详解
2019/05/17 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Python 如何实现访问者模式
2020/07/28 Python
提高python代码运行效率的一些建议
2020/09/29 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
大学毕业典礼演讲稿
2014/09/09 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
python自动化八大定位元素讲解
2021/07/09 Python