原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();
    

更多相关:

==============================================================================================================================

此页由蓝色于 2013-03-11 11:37:03 在1033289127的基础上最后更改。
< Discuz!X
函数 功能
DB::table($tablename) 获取正确带前缀的表名,转换数据库句柄,
DB::delete($tablename, 条件,条数限制) 删除表中的数据
DB::insert($tablename, 数据(数组),是否返回插入ID,是否是替换式,是否silent) 插入数据操作
DB::update($tablename, 数据(数组)条件) 更新操作
DB::fetch(查询后的资源) 从结果集中取关联数组,注意如果结果中的两个或以上的列具有相同字段名,最后一列将优先。
DB::fetch_first($sql) 取查询的第一条数据fetch
DB::fetch_all($sql) 查询并fetch
DB::result_first($sql) 查询结果集的第一个字段值
DB::query($sql) 普通查询
DB::num_rows(查询后的资源) 获得记录集总条数
DB::_execute(命令,参数) 执行mysql类的命令
DB::limit(n,n) 返回限制字串
DB::field(字段名, $pid) 返回条件,如果为数组则返回 in 条件
DB::order(别名, 方法) 排序

注意:由于 X1.5 里增加了SQL的安全性检测。因此,如果你的SQL语句里包含以下开头的函数 load_file,hex,substring,if,ord,char。 或者包含以下操作 intooutfile,intodumpfile,unionselect,(select')都将被拒绝执行。

替换参数 功能
%t 表名,
%s 字串,如果是数组就序列化
%f 按 %F 的样式格式化字串
%d 整数
%i 不做处理
%n 若为空即为0,若为数组,就用',' 分割,否则加引号
函数 功能
C::t($tablename')->count() 获取表所有行数
C::t($tablename')->update(键值,$data) 更新键值数据
C::t($tablename')->delete(键值) 删除键值数据
C::t($tablename')->truncate() 清空表
C::t($tablename')->insert($data, $return_insert_id,$replace) 插入数据
C::t($tablename')->fetch_all($ids) fetch 数据,可以是单一键值或者多个键值数组
C::t($tablename')->fetch_all_field() fetch所有的字段名表
C::t($tablename')->range($start, $limit, $sort) fetch值域范围
C::t($tablename')->optimize() 优化表

Discuz!X/数据库操作方法相关推荐

  1. Django(part30)--原生的数据库操作方法

    学习笔记,仅供参考 原生的数据库操作方法 使用raw进行查询操作 在django中,可以使用模型管理器的raw方法来执行select语句进行数据查询 用法 Entry.objects.raw('sql ...

  2. python连接数据库并编写调用函数_Python使用pyodbc访问数据库操作方法详解

    本文实例讲述了Python使用pyodbc访问数据库操作方法.分享给大家供大家参考,具体如下: 1.连接数据库 1)直接连接数据库和创建一个游标(cursor) cnxn =pyodbc.connec ...

  3. 基于sqlite的android数据库编程,Android编程之SQLite数据库操作方法详解

    Android编程之SQLite数据库操作方法详解 发布时间:2020-09-07 12:33:04 来源:脚本之家 阅读:85 作者:低调小一 本文实例讲述了Android SQLite数据库操作方 ...

  4. python discuz_python3实现discuz论坛数据库批量图文发帖搭建DZ插件模板网站附件源码下载...

    最近想用discuz论坛搭建一个DZ插件模板下载网站,但内容较多一个个发布主题帖子会非常麻烦,因此想着有没有什么好的方法可以批量发帖,批量回复,批量上传图片附件之类的.既然学了万能的python,于是 ...

  5. discuz论坛数据库表结构分析

    附件表:pre_forum_attachment 关键表字段说明: aid mediumint(8) --附件id tid mediumint(8) --所在主题id pid int(10)--所在帖 ...

  6. DZ X2.5 由本地上传到网站空间时要修改的配置文件。dz论坛 BBS首页模板位置。Discuz!X/数据库字典

    DZ X2.5 由本地上传到网站空间时要修改的配置文件 uc_server/data/config.inc.php config/config_global.php config/config_uce ...

  7. Discuz!NT数据库读写分离方案

    目前在Discuz!NT这个产品中,数据库作为数据持久化工具,必定在并发访问频繁且负载压力较大的情况下成 为系统性能的'瓶颈'.即使使用本地缓存等方式来解决频繁访问数据库的问题,但仍旧会有大量的并发请 ...

  8. php原码初级自定义数据库操作方法

    为什么80%的码农都做不了架构师?>>>    <?php /** *Project:消费项目 *File:配置文件 *Author:LX */ //链接数据库   开始 da ...

  9. mysql get one_Ecshop 数据库操作方法getRow、getAll、getOne区别

    ECShop没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现.这样做的好处是实现非常轻量,大大减小了分发包的文件大小.另外,当网站需要做memcached缓存时,也可以 ...

  10. 基于EF框架的数据库操作方法

    一.关于建表,以及表与表之间的关系,关系逻辑规范等等. 1.EF中 int类型做主键的特殊情况处理 EF中,主键是int类型时,会自动认为该字段是自增长,导致生成的SQL语句中不会出现这个字段. 解决 ...

最新文章

  1. BZOJ3559 : [Ctsc2014]图的分割
  2. jsp获取java后台数据_springMVC笔记:jsp页面获取后台数据记录列表
  3. Set实现类性能对比
  4. 【学习笔记】信息系统项目管理-项目採购管理-合同分类
  5. html中加js弹窗,前端html+css+js弹窗的实现
  6. php怎么在表格里插图片大小,如何批量插入图片到Word文档表格中并自动排版调整尺寸...
  7. 使用 OpenSSL 创建ssl自签名证书
  8. 《又到毕业季》MATLAB GUI 鼠标键盘交互
  9. All the python knowledge that I come across
  10. 201671030116宋菲菲 实验三作业互评与改进报告
  11. win10强制关闭飞行模式_Win7已毕业,你为什么还不用Win10?
  12. 基于安卓的掌上二手图书交易app
  13. 应用程序无法开机自启动
  14. 计算机键盘复制键,键盘按键设置复制粘贴的方法
  15. Win10配置Kafka以及Zookeeper环境(run out of available brokers错误解决)
  16. Install OIM9.1.0.1 on RHEL5.4
  17. 边吃边学:关于“水果蔬菜”的英语俚语
  18. HR管理系统如何选?
  19. INSERT/UPDATE IGNORE
  20. Mysql查询时强制指定索引

热门文章

  1. RazorPage语法介绍(二)
  2. Matlab函数——wgn
  3. MAC:一个数据缓冲区,作为参数传递到另外一个函数就崩溃
  4. 文字处理技术:有哪些难点?
  5. 别人重构了整套代码,汝还不知道哪里有问题,相差几个等级?
  6. 果然有人向吾了解如果改进doubango的问题
  7. AlphaGo程序出BUG了——第四局观感
  8. 中兴事件不会对中国高科技产生什么改变
  9. trunc函数_这几个舍入函数你都会用吗?
  10. php通用编码,php字符串怎么转换编码