DedeCMS 的 SQL 调用功能非常强大,允许你直接在模板文件中使用 SQL 语句查询数据库,并将结果动态地展示在页面上,这通常通过 {dede:sql} 标签实现。

第一步:了解下载数据库表结构
在写 SQL 语句之前,我们首先要明确 DedeCMS 中存储下载信息的表结构,这个表通常是 dede_downloads 或 dede_downloads 的相关表。
你可以通过你的 DedeCMS 后台 -> 系统 -> SQL命令行工具 来执行 DESCRIBE dede_downloads; (对于MySQL) 来查看表结构。
dede_downloads 表的核心字段通常包括:
| 字段名 | 说明 | 常用场景 |
|---|---|---|
id |
下载资源的唯一ID | 主键,用于精确查找 |
url |
下载地址(可以是本站或外链) | 用于生成下载链接 |
filesize |
文件大小 | 用于显示文件大小 |
hits |
下载次数(点击次数) | 用于统计和排序 |
posttime |
发布/上传时间 | 用于按时间排序 |
dpath |
本地下载服务器路径 | 如果是本地下载,可能需要用到 |
userip |
上传者IP | 一般较少在模板中使用 |
typeid |
所属栏目ID | 用于关联栏目,实现按栏目调用 |
第二步:使用 {dede:sql} 标签调用数据
{dede:sql} 是 DedeCMS 提供的万能 SQL 查询标签,其基本语法如下:

{dede:sql sql='你的SQL语句'}
<a href='[field:url/]'>[field:title/]</a> ([field:filesize/]) - 下载次数: [field:hits/]
{/dede:sql}
标签说明:
{dede:sql}: 开始标签。sql='...': 属性,里面放置你的标准 SQL 查询语句。[field:字段名/]: 循环体内的标签,用于输出 SQL 查询结果中每一行的特定字段值。{/dede:sql}: 结束标签。
第三步:常用 SQL 调用示例
下面我们通过一些具体的例子来演示如何调用下载数据库。
示例1:调用最新的5个下载资源
这个需求很常见,比如在首页展示最新上传的文件。
<h3>最新上传</h3>
<ul>
{dede:sql sql="SELECT id, title, url, filesize, posttime FROM dede_downloads ORDER BY posttime DESC LIMIT 0,5"}
<li>
<a href="[field:url/]" target="_blank">[field:title/]</a>
<span>([field:filesize/])</span>
</li>
{/dede:sql}
</ul>
SQL 语句解析:

SELECT id, title, url, filesize, posttime: 选择需要的字段。FROM dede_downloads: 从下载表查询。ORDER BY posttime DESC: 按发布时间降序排列(最新的在前)。LIMIT 0,5: 从第0条记录开始,取5条记录。
示例2:调用下载量最高的5个热门资源
这个可以用来展示热门下载。
<h3>热门下载</h3>
<ul>
{dede:sql sql="SELECT id, title, url, hits FROM dede_downloads ORDER BY hits DESC LIMIT 0,5"}
<li>
<a href="[field:url/]" target="_blank">[field:title/]</a>
<span>下载: [field:hits/] 次</span>
</li>
{/dede:sql}
</ul>
SQL 语句解析:
ORDER BY hits DESC: 按下载次数降序排列。LIMIT 0,5: 取前5条。
示例3:调用指定栏目下的下载资源
如果你的下载资源都归类到了特定的栏目(比如栏目ID为 5),可以这样调用。
<h3>软件下载专区</h3>
<ul>
{dede:sql sql="SELECT id, title, url, hits FROM dede_downloads WHERE typeid=5 ORDER BY hits DESC LIMIT 0,10"}
<li>
<a href="[field:url/]" target="_blank">[field:title/]</a>
</li>
{/dede:sql}
</ul>
SQL 语句解析:
WHERE typeid=5: 添加查询条件,只筛选出栏目ID为5的下载资源。
示例4:组合查询(按栏目且按时间)
更复杂的场景,比如调用“软件下载专区”最近一周上传的热门文件。
<h3>本周热门软件</h3>
<ul>
{dede:sql sql="
SELECT id, title, url, hits, posttime
FROM dede_downloads
WHERE typeid=5 AND posttime > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 7 DAY))
ORDER BY hits DESC
LIMIT 0,8
"}
<li>
<a href="[field:url/]" target="_blank">[field:title/]</a>
<small>([field:posttime function="MyDate('Y-m-d',@me)"/])</small>
</li>
{/dede:sql}
</ul>
SQL 语句解析:
WHERE typeid=5 AND posttime > ...: 组合查询条件。UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 7 DAY)): 获取7天前的 Unix 时间戳。posttime字段存储的也是时间戳,所以可以直接比较。[field:posttime function="MyDate('Y-m-d',@me)"/]: 这里用到了字段函数。@me代表当前字段的原始值(时间戳),MyDate是 DedeCMS 的内置函数,用于将时间戳格式化为 'Y-m-d' 格式的日期。
第四步:安全注意事项(非常重要!)
直接在模板中写 SQL 语句有潜在的安全风险,如果处理不当,可能会导致 SQL 注入攻击。
-
不要信任用户输入:如果你的 SQL 语句中的参数(
typeid)是来自用户提交的(如 URL 参数?typeid=5),绝对不能直接拼接到 SQL 语句中,正确的做法是使用 DedeCMS 提供的GetQuery()函数来获取并过滤。错误示范(危险!):
{dede:sql sql="SELECT * FROM dede_downloads WHERE typeid=[field:typeid/]"} // [field:typeid/] 来自用户,不安全正确示范(安全):
{dede:sql sql="SELECT * FROM dede_downloads WHERE typeid=~typeid~"} [field:typename/] {/dede:sql}在调用这个模板的页面(通常是列表页或首页),你需要 PHP 代码来设置这个变量:
// 在 index.php 或 list.php 等文件中 $typeid = isset($_GET['typeid']) ? intval($_GET['typeid']) : 0; // intval() 强制转为整数,防止注入 $GLOBALS['typeid'] = $typeid;
-
最小权限原则:确保你的数据库用户只有
SELECT权限,而没有DELETE,UPDATE,DROP等危险操作的权限,即使发生 SQL 注入,攻击者也最多只能查询数据,而不能破坏你的数据库。
在 DedeCMS 中调用下载数据库的核心就是灵活运用 希望这份详细的指南能帮助你在 DedeCMS 中自如地调用下载数据!{dede:sql}
SELECT, FROM, WHERE, ORDER BY, LIMIT 等 SQL 基础语句。[field:字段名/] 如何输出查询结果。function 对字段值进行格式化处理(如日期格式化)。
