在网上看到很多关于微擎数据库操作函数的文档,基本都是照搬微擎官方文档,或者还不如官方文档写的详细。官方文档上写的也不全面,有些函数没写到文档中,数据库操作函数应该算是最常用的函数了,因此参考大牛文档及官方文档写下本篇方便自己、方便他人。在此,官方文档上已经有的、简单明了的我就不在一一赘述。
说明:
为保证数据操作安全,数据库操作有以下处理及书写原则:
1.所有数据库查询时,尽量使用封装的 pdo_getXXX 系列函数,如果无法满足再考虑书写SQL语句使用 pdo_fetchXXX 系列函数
2.所有SQL查询关键字大写,方便代码审查
3.所有SQL对象(表名,字段名,索引名等)必须用反引号包括
4.所有编码参数查询,必须使用PDO的参数绑定机制处理
5.不能绑定参数处理的查询,必须处理好变量检测及字符串转义
一个完整的数据库操作示例:
//pdo_getXXX 系列函数,推荐使用
$trades = pdo_getall('trades', array('username' => $_GPC['username'], 'tid' => $_GPC['select']));
//直接书写SQL,需要自行处理参数转义等问题
$tids = array();
if(!empty($_GPC['select'])) {
foreach($_GPC['select'] as $t) {
$tids[] = intval($t); //---- 必须将输入参数转换为无安全隐患的格式,数字列必须转换为数字列,字符串列必须使用 addslashes
}
}
if(!empty($tids)) {
$sql = 'SELECT * FROM ' . tablename('trades') . ' WHERE `username`=:username AND `tid` IN (' . implode($tids) . ')';
$pars = array();
$pars[':username'] = $_GPC['username'];
$trades = pdo_fetchall($sql, $pars);
}
范围条件操作
可用条件:array('>', '<', '<>', '!=', '>=', '<=', 'NOT IN', 'not in', '+=', '-=');
//获取id大于666的公众号
$accout = pdo_get('account', array('id >' => '666'));
//增加一次用户的登录次数
pdo_update('users_login', array('count +=' => 1),array('username' => 'lalala'));
数据基本操作
tablename()
$sql = "SELECT * FROM ".tablename('users');
echo $sql;
//输出 SELECT * FROM ims_users
pdo_get:根据条件(AND连接)到指定的表中获取一条记录
//根据uid获取用户的用户名和用户Id信息
//生成的SQL等同于:SELECT username,uid FROM ims_users WHERE uid = '1' LIMIT 1
$user = pdo_get('users', array('uid' => 1), array('username', 'uid'));
pdo_getall:根据条件(AND连接)到指定的表中获取全部记录
//获取全部启用的用户
//生成的SQL等同于:SELECT * FROM ims_users WHERE status = '1'
$user = pdo_getall('users', array('status' => 1));
pdo_getslice:根据条件(AND连接)到指定的表中获取某个区间的记录,此函数和 pdo_getall 的区别是可以指定limit 值
//获取从第一条数据开始的10条启用的用户
//生成的SQL等同于$user = SELECT * FROM ims_users WHERE status ='2' ORDER BY uid,groupid LIMIT 0, 10
$user = pdo_getslice('users', array('status' => 2), array(1,10) , $total , array() , '' , array('uid','groupid'));
pdo_getcolumn:根据条件(AND连接)到指定的表中获取一条记录的指定字段
//根据uid获取用户的用户名
//生成的SQL等同于:SELECT username FROM ims_users WHERE uid = '1' LIMIT 1
$username = pdo_getcolumn('users', array('uid' => 1), 'username',1);
pdo_fetch:根据SQL语句,查询一条记录
// :uid 是参数的一个点位符,没有使用引号,传入的第二个参数中要与SQL中的占位名称相同
$user = pdo_fetch("SELECT username, uid FROM ".tablename('users')." WHERE uid = :uid LIMIT 1", array(':uid' => 1));
// LIKE 占位的使用方法
$user = pdo_fetch("SELECT * FROM ".tablename('users')." WHERE username LIKE :username", array(':username' => '%wahaha%'));
//个人喜欢这么用:
$activity = pdo_fetch("SELECT `name` FROM `ims_fx_activity_total` WHERE `id` = {$activityid}");
pdo_fetchall:根据SQL语句,查询全部记录,使用方法与pdo_fetch相同
// 需要注意的是,返回的数组的键值为用户的uid
$user = pdo_fetchall("SELECT username, uid FROM ".tablename('users'), array(), 'uid');
pdo_fetchcolumn:根据SQL语句,查询第一条记录的第N列的值,此语句与pdo_fetch使用相同,只是此函数返回的不是一个数组而是一个字符串
// 获取用户的总数,返回的值是一个数字
$user_total = pdo_fetchcolumn("SELECT COUNT(*) FROM ".tablename('users'));
pdo_insert:对指定数据表插入一条新记录
pdo_insertid() 获取插入成功 返回的id
//添加一条用户记录,并判断是否成功
$user_data = array(
'username' => 'mizhou1',
'status' => '1',
);
$result = pdo_insert('users', $user_data);
if (!empty($result)) {
$uid = pdo_insertid();
message('添加用户成功,UID为' . $uid);
}
pdo_update:更新指定的数据表的记录
//更uid等于2的用户的用户名
$user_data = array(
'username' => 'mizhou2',
);
$result = pdo_update('users', $user_data, array('id' => 2));
if (!empty($result)) {
message('更新成功');
}
pdo_delete:删除指定条件的数据
//删除用户名为wahaha的记录
$result = pdo_delete('users', array('username' => 'wahaha'));
if (!empty($result)) {
message('删除成功');
}
pdo_query:运行一条SQL语句,可以写原生sql语句
//更uid等于2的用户的用户名
$result = pdo_query("UPDATE ".tablename('users')." SET username = :username, age = :age WHERE uid = :uid", array(':username' => 'wahaha', ':age' => 18, ':uid' => 2));
//删除用户名为mizhou2的记录
$result = pdo_query("DELETE FROM ".tablename('users')." WHERE uid = :uid", array(':uid' => 2));
if (!empty($result)) {
message('删除成功');
}
pdo_run:批量执行语句(本人没用过)
与pdo_query不同的是,pdo_run是可以一次执行多条SQL语句,每条SQL必须以;分隔。
$sql = <<<EOF
CREATE TABLE IF NOT EXISTS `ims_multisearch` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`weid` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `ims_multisearch_fields` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`reid` int(10) unsigned NOT NULL,
`type` tinyint(1) unsigned NOT NULL DEFAULT '1',
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_reid` (`reid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
EOF;
pdo_run($sql);
//运行sql原生语句
pdo_debug:调试运行SQL语句,显示执行过的SQL的栈情况
> $output 参数指定是否直接打印出调试信息
> array debug($output = true, $append = array())
pdo_debug();
//调用该函数结果如下
Array
(
[0] => Array
(
[sql] => SET NAMES 'utf8';
[error] => Array
(
[0] => 00000
[1] =>
[2] =>
)
)
[1] => Array
(
[sql] => SELECT `value` FROM `ims_core_cache` WHERE `key`=:key
[params] => Array
(
[:key] => setting
)
[error] => Array
(
[0] => 00000
[1] =>
[2] =>
)
)
)
pdo_indexexists:查询索引是否存在
//如果shopping_goods表中不存在credit字段,则新增credit字段
if(!pdo_fieldexists('shopping_goods', 'credit')) {
pdo_query("ALTER TABLE ".tablename('shopping_goods')." ADD `credit` int(11) NOT NULL DEFAULT '0';");
}
pdo_fieldexists:检查表中是否存在某个字段
//如果shopping_goods表中不存在credit字段,则新增credit字段
if(!pdo_fieldexists('shopping_goods', 'credit')) {
pdo_query("ALTER TABLE ".tablename('shopping_goods')." ADD `credit` int(11) NOT NULL DEFAULT '0';");
}
pdo_tableexists:检查数据库中是否存在某个表
pdo_tableexists($tablename);
pdo_fetchallfields检查表中所有的字段(由于时间及此函数用处原因,本人未用过,仅知道有此函数)
pdo_fetchallfields($tablename)
微擎中还有三个函数,我也没有用过,应该是关于事务的函数:
**pdo_begin**
:个人理解:开启事务函数
**pdo_commit**
:个人理解:提交事务函数
**pdo_rollback**
:个人理解:回滚事务函数
在事务中的 SQL 语句,如果出现错误,那么所有的 SQL 都不执行。当所有 SQL 有无误的时候,才提交执行。
执行SQL,如果出错,RollBack,回滚会把出错之前的操作全部取消,即执行的结果是什么都没有做。
后边几个函数,在日常工作及开发中用的几率很小,大家有兴趣的可以测试下。上述说明如有错误之处,敬请指出!在此谢过!!!
**
大家有问题,或是想交流,可在评论处留言!
**