当前位置: 首页 > news >正文

Discuz!X/数据库操作方法

原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有:

 %tDB::table()
 %dintval()
 %saddslashes()
 %nin IN (1,2,3)
 %fsprintf('%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()优化表

相关文章:

  • 前端,移动开发者,UI须懂: 不同设备的之间的尺寸
  • maven发布时在不同的环境使用不同的配置文件
  • P2P通信标准协议(一)之STUN
  • 最佳实践:如何基于消息服务MNS实现严格有序队列
  • Android Material Design-Creating Lists and Cards(创建列表和卡)-(三)
  • 自己写一个切换桌面的文件
  • GTK+重拾--07 GTK+中的事件
  • eclipse报错: Unhandled event loop exception No more handles
  • CMS 回收器的两次 STW
  • Linux指令--rcp,scp
  • Asp.net 使用正则和网络编程抓取网页数据(有用)
  • Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】
  • 用百度推荐提升PV和收益的小方法
  • [C++]四种方式求解最大子序列求和问题
  • libserialport: cross-platform library for accessing serial ports
  • 2019年如何成为全栈工程师?
  • django开发-定时任务的使用
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Logstash 参考指南(目录)
  • php ci框架整合银盛支付
  • SpringBoot几种定时任务的实现方式
  • SQLServer插入数据
  • Sublime text 3 3103 注册码
  • ViewService——一种保证客户端与服务端同步的方法
  • 基于axios的vue插件,让http请求更简单
  • 爬虫模拟登陆 SegmentFault
  • 如何实现 font-size 的响应式
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 实习面试笔记
  • 实战|智能家居行业移动应用性能分析
  • 微信小程序:实现悬浮返回和分享按钮
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​力扣解法汇总946-验证栈序列
  • #Spring-boot高级
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (23)Linux的软硬连接
  • (定时器/计数器)中断系统(详解与使用)
  • (动态规划)5. 最长回文子串 java解决
  • (二)c52学习之旅-简单了解单片机
  • (九)One-Wire总线-DS18B20
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)EOS中账户、钱包和密钥的关系
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NetCore 如何动态路由
  • .NET单元测试
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ 手记 ] 关于tomcat开机启动设置问题