Discuz! 通过内置的数据库操作类实现数据调用,常用方法包括:1. 使用C::t()调用预定义数据表模型,如C::t(‘forum_thread’)->fetch_all()获取帖子数据;2. 通过DB::query()执行自定义SQL语句,需用DB::fetch()解析结果。注意使用参数绑定防止SQL注入,表名需用反引号包裹(
pre_common_member
)。推荐优先使用封装方法保障安全性与兼容性,避免直接操作数据库。复杂查询建议结合内存表或建立缓存优化性能。
在Discuz!系统中,数据库调用是站点开发与优化的核心操作之一,作为站长,合理使用数据库接口不仅能提升功能扩展性,还能有效保障数据安全与执行效率,以下从技术实现、典型应用及注意事项三个维度展开说明。
Discuz!基于PHP+MySQL架构设计,采用source/class/discuz/
目录下的discuz_database
类实现数据库操作,系统默认通过预定义的表前缀(如pre_common_member
)管理多表结构,调用时需注意表名规范。
用户表:pre_common_member
帖子表:pre_forum_post
配置表:pre_common_setting
通过DB::
静态方法调用数据库是Discuz!官方推荐的安全操作方式。
// 查询单条数据 $user = DB::fetch_first("SELECT * FROM %t WHERE uid=%d", array('common_member', 1)); // 查询多条数据 $posts = DB::fetch_all("SELECT * FROM %t WHERE fid=%d ORDER BY dateline DESC", array('forum_post', 2));
使用占位符%t
(表名)、%d
(整型)、%s
(字符串)自动过滤非规字符:
DB::query("UPDATE %t SET username=%s WHERE uid=%d", array('common_member', '新用户名', 3));
DB::transaction(function(){ DB::delete('forum_post', "pid=5"); DB::update('forum_thread', array('replies'=>'-1'), "tid=10"); });
$uid = 100; $profile = C::t('common_member')->fetch($uid); $status = C::t('common_member_status')->fetch($uid);
$threadlist = C::t('forum_thread')->fetch_all_by_fid_displayorder(2, 0, 0, 10); foreach($threadlist as $thread){ echo $thread['subject']; }
$fid = 5; $threadcount = C::t('forum_thread')->count_by_fid_displayorder($fid); $postcount = C::t('forum_post')->count_by_fid($fid);
开启查询缓存:DB::query("SQL语句", false, true);
使用内存缓存:
$data = C::t('common_setting')->fetch_all(array('siteurl', 'sitename'));
对常用查询字段(如uid
、tid
、dateline
)建立索引,通过EXPLAIN
分析慢查询。
禁止拼接SQL语句:$sql = "SELECT * FROM table WHERE id=$id"; // 高危!
统一使用C::t()
或DB::
方法
1、自定义Model类:在source/class/model/
下继承discuz_model
实现业务逻辑封装
2、读写分离:修改config/config_global.php
配置数据库主从
3、定期维护:使用tools.php
执行数据表修复(check
/repair
)
>引用说明
> 本文操作基于Discuz! X3.4版本,部分代码示例参考自[Discuz!官方开发文档](https://open.dismall.com/)及GitHub开源社区实践,数据库安全规范遵循OWASP SQL注入防护指南。