数据库层
2024-07-17 23:44 更新
为了获取更多最新内容及功能更新,请直接访问我们的首页以查看DzzOffice笔记的最新地址。
通用接口DB
- addslashes的处理
仅insert()、update()、delete()
方法对传入其的数组形式的参数进行intval或addslashes安全处理,字符串形式的参数将不处理。
- 新添加的方法 fetch_all($sql),order(), limit(),field() 等方法。其中fetch_all方法以数组方式返回查询多条记录数据,并可设置数据的KEY值使用某字段值;order()、limit()、field()
返回 SQL 语句中相应的部分。
- SQL 语句 format 的支持
//例:查询20个用户uid大于100的用户数据,以uid为返回结果数组的key
$arr = DB::fetch_all('SELECT * FROM %t WHERE uid>%d LIMIT %d', array('user', '100', '20'), 'uid');
- 支持的fomat有:
%t | DB::table() |
%d | intval() |
%s | addslashes() |
%n | in IN (1,2,3) |
%f | sprintf('%f', $var) |
%i | 直接使用不进行处理 |
建议所有的查询语句都使用上述格式方式,以增强安全性。
- 返回值的处理
在非UNBUFFERED的情况下:INSERTSQL 语句返回insert_id();UPDATE和DELETESQL 语句返回affected_rows()
- 常用操作符(具体实现代码查看./core/class/dzz/dzz_database.php)
- DB::table($table) 返回完整的表名称供查询使用,其中$table为不带表前缀的表名;
- DB::limit($start,$limit=0) 返回mysql查询的limit限定条件;
- DB::order($field, $order = 'ASC') 返回mysql查询的order by限定条件;
- DB::field($field, $val, $glue = '=') 根据$glue值返回mysql查询的where限定条件,$glue可用值:=、+、-、|、&、^、>、<、<>、<=、>=、like、in、notin;
- DB::fetch_all($sql, $arg = array(), $keyfield = '', $silent=false) 数组方式返回查询多条记录数据,并可设置数据的KEY值使用某字段值;
- DB::fetch_first($sql, $arg = array(), $silent = false) 数组方式返回一条记录;
- DB::result_first($sql, $arg = array(), $silent = false) 返回一条记录的第一个字段的值;
- DB::query($sql, $arg = array(), $silent = false, $unbuffered = false) 通用查询语言,返回查询结果;
- DB::insert($table, $data, $return_insert_id = false, $replace = false, $silent = false) 插入一条数据;
- DB::delete($table, $condition, $limit = 0, $unbuffered = true) 根据$condition删除符合条件的记录;
- DB::update($table, $data, $condition, $unbuffered = false, $low_priority = false) 更新符合条件的记录。
数据表模型C::t
DzzOffice可以使用数据层来操作数据表。使用数据层具有以下优点:
- 结构清晰,便于阅读。
- 对查询参数进行格式化处理,增强了安全性。
- 集中数据操作sql语句,便于维护和更新。
- 实现缓存操作的相关函数,解决MYSQL自身对高并发处理的性能瓶颈。
使用数据层需要满足以下条件:
- 具有以table_加上不带前缀的表名的class文件。
- 操作类class_表名的类继承dzz_table基类。
数据层的规范和约定
- 一个数据表对应一个class文件,以table_加上不带前缀的表名命名,尽量不操作其它表;
- 使用C::t('tablename')->method()调用;
- 不建议使用$_G、$_POST、$_GET等全局变量(可以以参数形式带入或者使用getglobal来获取全局变量);
- 关联查询(JOIN)尽量拆分为单条查询,不能拆分的放入主表的类中;
- 方法名以下划线分隔,全部为小写,全部为单数,直接返回结果,保留关键字:on、get、set。方法参数不能以数组的形式传入,数据可以;
- 除数据表文件以外,其它文件尽量不要出现SQL语句,便于后续的数据表的维护和更新;
- 建议方法名:查询结果返回一行记录方法名使用fetch开头,返回多行记录方法名使用fetch_all开头,查询中使用SQL语句count函数返回一个数值的使用count开头;
- 方法名中by后面的是以下划线(_)分隔的表字段名,不要使用复数型,例如: fetch_all_by_uid()而不是fetch_all_by_uids();
- 方法名需去掉表名,如:dzz_table表类方法 fetch_table_by_all应命名为fetch_all;
- 数据表类继承dzz_table基类,基类实现CURD操作,fetch方法实现了根据一个主键 值得到一行记录、fetch_all方法实现了根据一组主键值得到多行记录(二维数据,主键值为 key)、count方法返回了表的总记录数据;
- 如果表是无主键或是关联主键,则基类中的CURD将不能使用,需自己在相应的表类中实现, 同时将$this->_pk设置为空;
- DB层封装的函数实现了addslashes,个别直接写sql语句的需注意addslashes;
- C::t插件调用方式
表名:dzz_table
目录:dzz/test/class/table/table_test.php
类名:table_test
用法:C::t('test') ->method();
- 基类实现缓存操作的相关函数,数据表类中增加下面的参数来启用数据缓存(需要服务器开启缓存),例如:
public function __construct() {
$this->_table = 'app_open';
$this->_pk = 'extid';
$this->_pre_cache_key = 'app_open_';//缓存主键名前缀,为空时表示此表不支持缓存
$this->_cache_ttl =0; 缓存时间,以秒为单位,0表示永久或相关配置文件中的默认值
parent::__construct();
}
注意:开启表缓存后,所有数据的更新、插入和删除都需要更新相关的缓存(使用基类的更新操作会自动更新缓存)。
以上内容是否对您有帮助:
更多建议: