全新的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 相关文章推荐
程序员编程十条戒律
Jul 09 PHP
php上传文件的增强函数
Jul 21 PHP
基于php常用正则表达式的整理汇总
Jun 08 PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 PHP
php中filter_input函数用法分析
Nov 15 PHP
php实现用于验证所有类型的信用卡类
Mar 24 PHP
如何把php5.3版本升级到php5.4或者php5.5
Jul 31 PHP
PHP实现获取某个月份周次信息的方法
Aug 11 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
php7 list()、session及其他模块的修改实例分析
May 25 PHP
php中Swoole的热更新实现代码实例
Mar 04 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
smarty section简介与用法分析
2008/10/03 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
Python使用type动态创建类操作示例
2020/02/29 Python
python实现一个猜拳游戏
2020/04/05 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
致200米运动员广播稿
2014/02/06 职场文书
暑期教师培训方案
2014/06/07 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书