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有:
%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();
更多相关:
==============================================================================================================================
函数 | 功能 |
---|---|
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/数据库操作方法相关推荐
- Django(part30)--原生的数据库操作方法
学习笔记,仅供参考 原生的数据库操作方法 使用raw进行查询操作 在django中,可以使用模型管理器的raw方法来执行select语句进行数据查询 用法 Entry.objects.raw('sql ...
- python连接数据库并编写调用函数_Python使用pyodbc访问数据库操作方法详解
本文实例讲述了Python使用pyodbc访问数据库操作方法.分享给大家供大家参考,具体如下: 1.连接数据库 1)直接连接数据库和创建一个游标(cursor) cnxn =pyodbc.connec ...
- 基于sqlite的android数据库编程,Android编程之SQLite数据库操作方法详解
Android编程之SQLite数据库操作方法详解 发布时间:2020-09-07 12:33:04 来源:脚本之家 阅读:85 作者:低调小一 本文实例讲述了Android SQLite数据库操作方 ...
- python discuz_python3实现discuz论坛数据库批量图文发帖搭建DZ插件模板网站附件源码下载...
最近想用discuz论坛搭建一个DZ插件模板下载网站,但内容较多一个个发布主题帖子会非常麻烦,因此想着有没有什么好的方法可以批量发帖,批量回复,批量上传图片附件之类的.既然学了万能的python,于是 ...
- discuz论坛数据库表结构分析
附件表:pre_forum_attachment 关键表字段说明: aid mediumint(8) --附件id tid mediumint(8) --所在主题id pid int(10)--所在帖 ...
- DZ X2.5 由本地上传到网站空间时要修改的配置文件。dz论坛 BBS首页模板位置。Discuz!X/数据库字典
DZ X2.5 由本地上传到网站空间时要修改的配置文件 uc_server/data/config.inc.php config/config_global.php config/config_uce ...
- Discuz!NT数据库读写分离方案
目前在Discuz!NT这个产品中,数据库作为数据持久化工具,必定在并发访问频繁且负载压力较大的情况下成 为系统性能的'瓶颈'.即使使用本地缓存等方式来解决频繁访问数据库的问题,但仍旧会有大量的并发请 ...
- php原码初级自定义数据库操作方法
为什么80%的码农都做不了架构师?>>> <?php /** *Project:消费项目 *File:配置文件 *Author:LX */ //链接数据库 开始 da ...
- mysql get one_Ecshop 数据库操作方法getRow、getAll、getOne区别
ECShop没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现.这样做的好处是实现非常轻量,大大减小了分发包的文件大小.另外,当网站需要做memcached缓存时,也可以 ...
- 基于EF框架的数据库操作方法
一.关于建表,以及表与表之间的关系,关系逻辑规范等等. 1.EF中 int类型做主键的特殊情况处理 EF中,主键是int类型时,会自动认为该字段是自增长,导致生成的SQL语句中不会出现这个字段. 解决 ...
最新文章
- BZOJ3559 : [Ctsc2014]图的分割
- jsp获取java后台数据_springMVC笔记:jsp页面获取后台数据记录列表
- Set实现类性能对比
- 【学习笔记】信息系统项目管理-项目採购管理-合同分类
- html中加js弹窗,前端html+css+js弹窗的实现
- php怎么在表格里插图片大小,如何批量插入图片到Word文档表格中并自动排版调整尺寸...
- 使用 OpenSSL 创建ssl自签名证书
- 《又到毕业季》MATLAB GUI 鼠标键盘交互
- All the python knowledge that I come across
- 201671030116宋菲菲 实验三作业互评与改进报告
- win10强制关闭飞行模式_Win7已毕业,你为什么还不用Win10?
- 基于安卓的掌上二手图书交易app
- 应用程序无法开机自启动
- 计算机键盘复制键,键盘按键设置复制粘贴的方法
- Win10配置Kafka以及Zookeeper环境(run out of available brokers错误解决)
- Install OIM9.1.0.1 on RHEL5.4
- 边吃边学:关于“水果蔬菜”的英语俚语
- HR管理系统如何选?
- INSERT/UPDATE IGNORE
- Mysql查询时强制指定索引