[Discuz教程] discuz教程:原DB类的改进和使用方法

Discuz! X2.5新版对数据库DB层进行了功能和安全方面的加强:
        


  • addslashes的处理

        仅insert(),update(),delete() 方法对传入其的数组形式的参数进行 intval 或 addslashes 安全处理,字符串形式的参数将不处理,请注意
        


  • 新添加的方法 fetch_all($sql),order(), limit(),field() 等方法

        其中 fetch_all 方法以数组方式返回查询多条记录数据,且可以设置数据的 KEY 值使用某字段值;        order(),limit(),field() 返回 SQL 语句中相应的部分
        


  • SQL 语句 format 的支持

        //例:查询10个用户uid大于100的用户数据,以uid为返回结果数组的key$arr = DB::fetch_all('SELECT * FROM %t WHERE uid>%d LIMIT %d', array('common_member', '100', '10'), 'uid');        支持的fomat有:

%t DB::table()
%d intval()
%s addslashes()
%n in IN (1,2,3)
%f sprintf('%f', $var)
%i 直接使用不进行处理

        


  • 返回值的处理

        在非UNBUFFERED的情况下:INSERT SQL 语句返回 insert_id();UPDATE 和 DELETE SQL 语句返回 affected_rows()
        新增数据层:数据层的规范和约定

        


  • 一个数据表一个class文件,以table_加上不带前缀的表名命名,尽量不操作其它表;
  • 不能使用$_G、$POST、$GET等全局变量;
  • 关联查询(JOIN)尽量拆分为单条查询,不能拆分的放入主表的类中;
  • 方法名以下划线分隔,全部为小写,全部为单数,直接返回结果,保留关键字:on、get、set, 方法参数不能以数组的形式传入,数据可以;
  • 除数据表文件以外,其它文件禁止出现SQL语句;
  • 查询结果返回一行记录方法名使用fetch开头,返回多行记录方法名使用fetch_all开头,查询中使用SQL语句count函数返回一个数值的使用count开头;
  • 方法名中by后面的是以下划线(_)分隔的表字段名,不要使用复数型,例如: fetch_all_by_uid()而不是fetch_all_by_uids();
  • 方法名需去掉表名,如:common_member表类方法 fetch_member_by_username应命名为fetch_by_username;
  • 数据表类继承discuz_table基类,基类实现CURD操作,fetch方法实现了根据一个主键 值得到一行记录、fetch_all方法实现了根据一组主键值得到多行记录(二维数据,主 键值为 key)、count方法返回了表的总记录数据;
  • 如果表是无主键或是关联主键,则基类中的CURD将不能使用,需自己在相应的表类中实现, 同时将$this->_pk设置为空;
  • DB层封装的函数实现了addslashes,个别直接写sql语句的需主意addslashes;
  • 使用C::t('tablename')->method();调用;
  • C::t插件调用方式表名:mytablename目录:source/plugin/mypluginid/table/table_mytablename.php类名:table_mytablename用法:C::t('#mypluginid#mytablename')->method();
    %t:表名占位符,DB::fetch_first("SELECT * FROM %t",array('common_member'));%d:数值占位符,DB::fetch_first("SELECT * FROM %t WHERE uid=%d",array('common_member',1));会自动执行intval%s:字符占位符,DB::fetch_first("SELECT * FROM %t WHERE username=%s",array('common_member','管理员'));会自动执行addslashes,转义特殊字符%n:DB::fetch_all("SELECT * FROM %t WHERE uid IN(%n)",array('common_member',array(1,2,3)));%f:同%d类似,只是浮点数,很少用%i:原样输出,DB::fetch_first("SELECT * FROM %t WHERE username='%i'",array('common_member','管理员')); 
发布了10 篇原创文章 · 获赞 6 · 访问量 9193
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览