在 DedeCMS 中,数据库调用主要通过 SQL 查询标签 {dede:sql} 来实现,这个标签非常强大,允许你在模板页面中直接执行自定义的 SQL 语句,从而获取数据库中的数据并进行显示。

(图片来源网络,侵删)
核心标签:{dede:sql}
这是所有数据库操作的基础。
基本语法结构
{dede:sql sql="你的SQL语句"}
// 循环体,用于显示查询到的每一条记录
[field:字段名/]
{/dede:sql}
{dede:sql}: 标签的开始。sql="...": 标签的核心属性,值是一个完整的 SQL 查询语句,必须用双引号 括起来。[field:字段名/]: 循环体内的标签,用于获取当前记录的特定字段值。字段名是你查询结果中的列名。{/dede:sql}: 标签的结束。
常用场景与实例
下面我们通过一些常见的场景来学习如何使用 {dede:sql}。
场景1:查询指定栏目(arctype)下的文章列表
假设我们要获取 ID 为 1 的栏目下的所有文章,并显示标题、发布时间和点击量。
SQL 语句分析:

(图片来源网络,侵删)
dede_archives: 文章主表。dede_arctype: 栏目表。typeid: 文章表中的栏目ID字段。id: 栏目表中的栏目ID字段。addtime: 发布时间。click: 点击量。
模板代码:
<h3>栏目ID为1的最新文章</h3>
<ul>
{dede:sql sql="SELECT a.id, a.title, a.addtime, a.click FROM dede_archives AS a LEFT JOIN dede_arctype AS t ON a.typeid = t.id WHERE t.id = 1 ORDER BY a.id DESC LIMIT 10"}
<li>
<a href="[field:id runphp='yes'] $id = @me; @me = GetArcUrl($id); [/field:id]" title="[field:title/]">[field:title/]</a>
<span>发布时间:[field:pubdate function="MyDate('Y-m-d H:i:s',@me)"/] | 点击:[field:click/]</span>
</li>
{/dede:sql}
</ul>
代码解析:
sql="...": 我们写了一个JOIN查询,从dede_archives和dede_arctype表中获取数据,并筛选出栏目ID为1的文章。[field:id/]: 获取文章的ID。[field:title/]: 获取文章的标题。[field:pubdate function="MyDate('Y-m-d H:i:s',@me)"/]: 这里使用了字段函数。pubdate存储的是时间戳,我们用MyDate函数将其格式化为年-月-日 时:分:秒的格式。[field:id runphp='yes'] ... [/field:id]: 这里使用了PHP运行功能。@me代表当前字段的原始值(即文章ID),我们调用系统自带的GetArcUrl()函数,根据文章ID获取到完整的文章链接。
场景2:获取特定会员发布的所有文章
假设我们要获取会员ID为 10 的用户发布的所有文章。
SQL 语句分析:

(图片来源网络,侵删)
dede_archives: 文章主表。mid: 文章表中的会员ID字段。
模板代码:
<h3>会员ID为10发布的文章</h3>
<ol>
{dede:sql sql="SELECT id, title, pubdate FROM dede_archives WHERE mid = 10 ORDER BY pubdate DESC"}
<li>
[field:title/]
<small>发布于:[field:pubdate function="MyDate('Y-m-d',@me)"/]</small>
</li>
{dede:sql}
</ol>
场景3:调用自定义表单的数据
假设你创建了一个“留言反馈”的自定义表单,表单名称为 dede_feedback,里面有 name (姓名), content (内容), addtime (提交时间) 字段。
SQL 语句分析:
dede_feedback: 自定义表单的数据表名。- 表示查询所有字段。
模板代码:
<h3>最新用户留言</h3>
<dl>
{dede:sql sql="SELECT name, content, addtime FROM dede_feedback ORDER BY id DESC LIMIT 5"}
<dt>[field:name/] 于 [field:addtime function="MyDate('Y-m-d',@me)"] 留言:</dt>
<dd>[field:content/]</dd>
{/dede:sql}
</dl>
进阶技巧
调用系统变量
在 SQL 语句中,你可以使用 DedeCMS 的全局变量,如 typeid (当前栏目ID)、topid (顶级栏目ID) 等,这样可以实现动态查询。
示例:获取当前栏目下的文章
{dede:sql sql="SELECT title FROM dede_archives WHERE typeid = ~typeid~ ORDER BY id DESC LIMIT 5"}
[field:title/]
{/dede:sql}
~typeid~会被替换为当前页面的栏目ID。
if 条件判断
在 {dede:sql} 循环体内,你可以使用 {if} 条件标签来对数据进行筛选或格式化。
示例:根据点击量显示不同样式
<ul>
{dede:sql sql="SELECT id, title, click FROM dede_archives WHERE typeid = 1 ORDER BY click DESC LIMIT 5"}
<li [field:click runphp='yes'] if(@me > 1000) @me = 'style="color:red;"'; else @me = ''; [/field:click]>
<a href="[field:id function='GetArcUrl(@me)'/]">[field:title/]</a> ([field:click/])
</li>
{/dede:sql}
</ul>
- 这里
runphp='yes'执行了一段 PHP 代码:如果点击量@me大于 1000,就给li标签添加一个style="color:red;"的样式。
只执行不输出
有时候你可能只想执行一条 SQL 语句(比如更新数据),而不需要在页面上显示任何内容。
示例:更新某篇文章的点击量
{dede:sql sql="UPDATE dede_archives SET click = click + 1 WHERE id = 100"}
{/dede:sql}
- 这段代码会执行更新操作,但页面上不会有任何输出。
重要注意事项
- 安全第一:直接使用
{dede:sql}存在 SQL 注入的风险,如果你的网站对外开放了用户投稿或有其他输入入口,请务必对用户输入进行严格的过滤和验证。在生产环境中,应谨慎使用,优先考虑使用 DedeCMS 自带的标签和模型。 - 表前缀:如果你的数据库表前缀不是默认的
dede_,那么在 SQL 语句中需要修改为你的实际表前缀,mycms_archives。 - 性能影响:复杂的 SQL 查询(如多表
JOIN、大数据量的LIMIT)可能会对网站性能产生较大影响,建议对查询的字段进行索引优化,并尽量使用LIMIT来限制返回的数据量。 - 与
{dede:arclist}的选择:{dede:arclist}是 DedeCMS 的核心文章列表标签,经过了高度优化,功能强大,且自带分页等功能。99% 的文章列表调用都应该优先使用arclist。{dede:sql}是一个万能的补充工具,当你需要查询非文章表(如自定义表单、会员表)或者需要执行arclist无法实现的复杂逻辑时,才使用它。
| 功能 | 说明 | |
|---|---|---|
| 基础调用 | {dede:sql sql="..."} |
执行任意 SQL 语句。 |
| 字段显示 | [field:字段名/] |
在循环体内显示指定字段的值。 |
| 字段处理 | [field:字段名 function="函数名(@me)"/] |
对字段值进行格式化处理,如日期、文本截取等。 |
| PHP运行 | [field:字段名 runphp='yes']...[/field:字段名] |
在标签内执行 PHP 代码,@me 代表当前值。 |
| 条件判断 | {if}...{/if} |
在循环体内进行条件逻辑判断。 |
掌握 {dede:sql} 的使用,能让你在 DedeCMS 的二次开发中更加得心应手,但请务必时刻注意安全问题。
