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/数据库操作方法的更多相关文章
- 黄聪:Discuz!X/数据库操作方法、DB::table、C::t
函数 功能 DB::table($tablename) 获取正确带前缀的表名,转换数据库句柄, DB::delete($tablename, 条件,条数限制) 删除表中的数据 DB::insert($ ...
- C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看
数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...
- 常用的PHP数据库操作方法(MYSQL版)
常用的PHP数据库操作方法(MYSQL版) 作者: 字体:[增加 减小] 类型:转载 时间:2011-06-08 最近一直在折腾自己的网站首页,写的大部分PHP脚本都要用到和MYSQL数据库相关的 ...
- discuz网站数据库迁移
你的discuz网站数据库迁移,或者修改过改密码后,还要以下相关配置文件修改,才能不会出现1045错误 以windows系统为例:首先登陆远程桌面,在运行中输入cmd,单开命令模式,再输入 net ...
- TP5数据库操作方法
一.TP5数据库操作方法 1.name()方法作用 : 指定默认的数据表名(不含前缀)示例 : Db::name(‘weiba_post’);返回 : Db对象 2.setTable()方法作用 : ...
- VB通用数据库操作方法
1.VB通用数据操作方法. 2.通用数据库查询方法. 3.通用数据库操作方法. 'ERP查询数据库 Public Function YZQuery(sqls As String, msgstring ...
- centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课
centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数 ...
- ylb: 数据库操作方法基础
ylbtech-SQL Server:SQL Server-数据库操作方法基础 数据库操作方法基础. ylb: 数据库操作方法基础 返回顶部 ----------试图操作(view)--------- ...
- TP5数据库操作方法总结
一.TP5数据库操作方法 1.name()方法 作用 : 指定默认的数据表名(不含前缀) 示例 : Db::name('weiba_post'); 返回 : ...
随机推荐
- linux 内核升级 转
inux 内核升级 2011-03-25 23:13:28 分类: LINUX 因要测试一些软件,需要2.6.30以上的内核,安装好CentOS 5.5,内核是2.6.18-194.el5.这次的升级 ...
- rcp(插件开发)点击按钮出现 The chosen operation is not enabled 解决办法
别的项目组,遇到以下错误信息: 首先看一下log日志里的异常信息,估计就知道是什么问题了. 项目组遇到的这个错误是source 指向错误 找不到相关的class.
- VS2017下Git的使用
一.使用GIT上的项目 (1)找到项目的git地址 (2)打开 vs2017的团队资源管理器面板,直接克隆(复制)远程Github上的项目 (3)追加新项目,到以上工程中. 新建项目时,把项目创建在步 ...
- ECShop 调用自定义广告
原文地址:http://www.ecshoptemplate.com/article-1348.html ECShop中关于广告的调用方法,网上有很多,现在要介绍的不同于其他,根据实际情况选择使用,以 ...
- Xcode 5中非常期待的6个功能
这里是新特征汇总博文链接:iOS7新特征汇总 小引: 自从北京时间2013年06月11日苹果发布Xcode 5 Developer Preview 1,到现在(2013年7约15日)已经过去一个月,苹 ...
- 安装GCC-4.6.1详细教程
一.什么是Gcc Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作品之一.gcc是可以在多种硬体平台上编译出可执行程序的超级编译 ...
- oracle11g忘记sys密码
目 录 1 以管理员身份运行cmd窗口 2 启动sqlplus并敲入一系列命令 3 特别注意 1以管理员身份运行cmd窗口 我安装的是oracle11.2版本,sqlplus.exe所在目录是:I: ...
- 工具:使用过的 API 文档生成工具
背景 2012 年之前几乎没有为代码增加注释,当然,代码的命名也不见得合理(好的代码胜过面面俱到的注释),后来接触过一些开源框架,优秀的框架都有一个特点:文档和示例非常多,在后来的日子里,几乎会强制自 ...
- JAVA card 应用开发(二) 在项目添加APPLET
在上篇博文中.<JAVA card 应用开发创建第一个APPLET>.介绍了一个项目从无到有. 那么.我们建立了这个项目后,仅仅有一个应用(一个可选AID),假设我希望这个项目能够有多个应 ...
- Linux的命名空间详解--Linux进程的管理与调度(二)
转自:http://blog.csdn.net/gatieme/article/details/51383322 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux- ...