数据库层

2024-07-17 23:44 更新

为了获取更多最新内容及功能更新,请直接访问我们的首页以查看DzzOffice笔记的最新地址。

通用接口DB

  1. addslashes的处理

insert()update()delete()

方法对传入其的数组形式的参数进行intvaladdslashes安全处理,字符串形式的参数将不处理。

  1. 新添加的方法 fetch_all($sql),order(), limit(),field() 等方法。其中fetch_all方法以数组方式返回查询多条记录数据,并可设置数据的KEY值使用某字段值;order()、limit()、field()

返回 SQL 语句中相应的部分。

  1. 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有:
%tDB::table()
%dintval()
%saddslashes()
%nin IN (1,2,3)
%fsprintf('%f', $var)
%i直接使用不进行处理

建议所有的查询语句都使用上述格式方式,以增强安全性。

  1. 返回值的处理

在非UNBUFFERED的情况下:INSERTSQL 语句返回insert_id();UPDATEDELETESQL 语句返回affected_rows()

  1. 常用操作符(具体实现代码查看./core/class/dzz/dzz_database.php)
  1. DB::table($table) 返回完整的表名称供查询使用,其中$table为不带表前缀的表名;
  2. DB::limit($start,$limit=0) 返回mysql查询的limit限定条件;
  3. DB::order($field, $order = 'ASC') 返回mysql查询的order by限定条件;
  4. DB::field($field, $val, $glue = '=') 根据$glue值返回mysql查询的where限定条件,$glue可用值:=、+、-、|、&、^、>、<、<>、<=、>=、like、in、notin;
  5. DB::fetch_all($sql, $arg = array(), $keyfield = '', $silent=false) 数组方式返回查询多条记录数据,并可设置数据的KEY值使用某字段值;
  6. DB::fetch_first($sql, $arg = array(), $silent = false) 数组方式返回一条记录;
  7. DB::result_first($sql, $arg = array(), $silent = false) 返回一条记录的第一个字段的值;
  8. DB::query($sql, $arg = array(), $silent = false, $unbuffered = false) 通用查询语言,返回查询结果;
  9. DB::insert($table, $data, $return_insert_id = false, $replace = false, $silent = false) 插入一条数据;
  10. DB::delete($table, $condition, $limit = 0, $unbuffered = true) 根据$condition删除符合条件的记录;
  11. 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(); }

注意:开启表缓存后,所有数据的更新、插入和删除都需要更新相关的缓存(使用基类的更新操作会自动更新缓存)。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号