使用 {dede:sql} 标签(最推荐、最常用)
这是DedeCMS专门为在模板中执行SQL查询而设计的标签,也是最安全、最方便的方法。

(图片来源网络,侵删)
语法
{dede:sql sql='你的SQL语句'}
// 循环体内的HTML代码,使用[field:字段名/]来显示数据
<li>[field:title/]</li>
{/dede:sql}
核心参数
sql(必需): 你要执行的SQL查询语句。itemindex(可选): 设置循环中每个记录的索引变量名,默认为i。itemindex='page',就可以在循环内使用[field:page/]。islocal(可选): 是否将结果集缓存到本地,yes或no,对于不常变的数据可以设为yes提高性能。
重要注意事项
- 表前缀:如果你的数据表有自定义前缀(
abc_),而不是默认的dede_,你需要在SQL语句中写全表名,查询文章表,应该是SELECT * FROM #@__archives,而不是SELECT * FROM dede_archives。#@__是DedeCMS的表前缀占位符,系统会自动替换成你配置的前缀。 - 安全与权限:
{dede:sql}标签的执行权限非常高,相当于直接执行数据库查询。请务必注意SQL注入风险! 不要直接将用户提交的数据(如URL参数)拼接到SQL语句中,如果必须使用,请进行严格的过滤或使用DedeCMS提供的函数。
示例1:查询指定分类下的文章
假设我们要在首页显示 "产品分类" (ID=5) 下的最新5篇文章。
模板代码:
<h3>最新产品</h3>
<ul>
{dede:sql sql='SELECT a.id, a.title, a.litpic, c.typename
FROM #@__archives AS a
LEFT JOIN #@__arctype AS c ON a.typeid = c.id
WHERE a.typeid = 5
ORDER BY a.pubdate DESC
LIMIT 0,5'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">
<img src="[field:litpic/]" alt="[field:title/]">
<span>[field:title/]</span>
</a>
</li>
{/dede:sql}
</ul>
代码解析:
SELECT ... FROM #@__archives AS a ...: 从主表archives(别名为a) 查询数据。LEFT JOIN #@__arctype AS c ...: 关联分类表arctype(别名为c),以获取分类名称typename。WHERE a.typeid = 5: 筛选出分类ID为5的文章。ORDER BY a.pubdate DESC: 按发布时间降序排列。LIMIT 0,5: 只取前5条记录。[field:arcurl/]: 这是一个DedeCMS的内置字段,用于自动生成文章的链接,你也可以自己拼接,如/plus/view.php?aid=[field:id/]。[field:litpic/]: 文章的缩略图。[field:title/]: 文章标题。
使用PHP代码块(功能最强大,需谨慎)
如果你需要非常复杂的逻辑,或者 {dede:sql} 标签无法满足需求,可以直接在模板中嵌入PHP代码。

(图片来源网络,侵删)
语法
在模板文件中,使用 <?php ... ?> 标签包裹PHP代码。
<?php
// 1. 引入数据库操作类
// 在DedeCMS中,全局变量 $db 已经是数据库连接对象,可以直接使用
// 2. 编写SQL语句
$sql = "SELECT id, title FROM #@__archives WHERE typeid = 10 ORDER BY id DESC LIMIT 10";
// 3. 执行查询
$dsql = $GLOBALS['dsql']; // 更规范地获取数据库对象
$arr = $dsql->GetAll($sql); // 使用GetAll获取所有结果,返回一个二维数组
// 4. 循环输出结果
if(is_array($arr)){
foreach($arr as $row){
echo "<li><a href='/plus/view.php?aid={$row['id']}'>{$row['title']}</a></li>";
}
}
?>
代码解析
$GLOBALS['dsql']或$db: 这是DedeCMS的全局数据库连接对象,使用它来执行SQL查询。$dsql->GetAll($sql): 执行查询并返回一个包含所有结果的数组,如果结果可能很多,可以考虑使用$dsql->Execute('me', $sql)然后循环while($row = $dsql->GetArray('me'))来节省内存。is_array($arr): 判断查询结果是否为空数组,避免在没有数据时出错。{$row['id']}和{$row['title']}: 在PHP双引号字符串中,可以直接使用花括号 来输出数组元素的值,这在模板中非常方便。
使用自定义函数(适用于复用逻辑)
如果你的这段SQL查询需要在多个地方使用,或者逻辑比较复杂,可以将其封装成一个自定义函数,然后在模板中调用。
步骤1:在 include/common.func.php 中添加函数
打开 /include/common.func.php 文件,在文件末尾添加你的函数:
/**
* 获取指定分类下的文章列表
* @param int $typeid 分类ID
* @param int $limit 获取数量
* @return array 文章列表数组
*/
function GetArticlesByTypeid($typeid, $limit = 10)
{
global $dsql;
$sql = "SELECT id, title, litpic FROM #@__archives WHERE typeid = {$typeid} ORDER BY pubdate DESC LIMIT 0, {$limit}";
$arr = $dsql->GetAll($sql);
return $arr;
}
步骤2:在模板中调用函数
<h3>热门资讯</h3>
<ul>
<?php
$articles = GetArticlesByTypeid(8, 5); // 获取分类ID为8的最新5篇文章
if(is_array($articles)){
foreach($articles as $art){
echo "<li><a href='/plus/view.php?aid={$art['id']}'><img src='{$art['litpic']}'><span>{$art['title']}</span></a></li>";
}
}
?>
</ul>
这种方法代码结构更清晰,易于维护和复用。

(图片来源网络,侵删)
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:sql} |
简单、直接、官方推荐,模板代码清晰。 | 功能相对固定,处理复杂逻辑(如多次查询、循环内嵌套)较麻烦。 | 绝大多数场景,特别是简单的列表查询、数据统计等。 |
| PHP代码块 | 功能最强大、最灵活,可以实现任何PHP逻辑。 | 代码量较大,容易破坏模板的简洁性,如果对PHP不熟悉容易出错。 | 需要复杂业务逻辑、多次数据库交互、或对数据进行深度处理时。 |
| 自定义函数 | 代码复用性高,逻辑与视图分离,易于维护。 | 需要修改核心文件(common.func.php),对于新手有一定门槛。 |
某个功能需要在多个模板中重复使用时。 |
给你的建议:
- 首选
{dede:sql},它能解决90%以上的模板内执行SQL的需求。 {dede:sql}标签写出的SQL语句过于复杂和臃肿,或者需要结合PHP的流程控制(如if/else),再考虑使用 PHP代码块。- 如果发现同样的查询逻辑在好几个地方都出现了,再考虑将其封装成 自定义函数。
