{dede:sql} 标签基础
{dede:sql}标签用于执行一个SQL查询,并将其返回的结果集在模板中进行循环显示。

基本语法结构
{dede:sql sql='你的SQL语句'}
<li>
[field:字段名/]
</li>
{/dede:sql}
{dede:sql sql='...'}: 开始标签,sql属性是必需的,值就是你要执行的SQL语句。[field:字段名/]: 循环体内的标签,用于输出查询结果中每一行的特定字段值。字段名就是你的SQL查询语句中SELECT后面的列名。{/dede:sql}: 结束标签。
变量的来源与使用
在{dede:sql}标签中,变量主要有两个来源:外部传入和内部查询。
外部变量:通过 Get 或 Post 传入
这是最常见的用法,用于根据用户在网页上的操作(如点击、搜索)来动态查询数据,你需要使用 @me 来接收这些变量。
语法:
{dede:sql sql="SELECT 字段 FROM 表名 WHERE 条件 = '@me'"}
这里的 @me 就是一个占位符,在执行SQL前,它会自动被外部传入的变量值所替换。
示例1:根据栏目ID查询该栏目下的文章

假设你有一个链接,点击后想查看某个栏目(ID为2)下的所有文章:
<a href="/special.php?cid=2">查看栏目ID为2的文章</a>
在 special.php 文件中,你需要获取这个 cid 参数,并将其传递给模板,在模板文件(special.htm)中,你可以这样写:
{dede:sql sql="SELECT * FROM `dede_archives` WHERE typeid = @me"}
<a href="[field:arcurl/]">[field:title/]</a>
<p>[field:description function='cn_substr(@me, 100)'/]...</p>
<hr>
{/dede:sql}
PHP代码 (special.php) 部分:
你需要确保在PHP文件中获取了cid并把它赋值给模板。
require_once(dirname(__FILE__)."/include/common.inc.php");
$cid = isset($cid) ? intval($cid) : 0; // 获取并安全化cid参数
// 将cid变量传递给模板
$dtp = new DedeTemplate();
$dtp->Assign('cid', $cid); // 关键步骤:将PHP变量cid赋值给模板变量@me
$dtp->Display('special.htm');
示例2:根据搜索关键词查询

一个搜索框,用户输入“织梦教程”,然后点击搜索。
HTML表单:
<form action="/search.php" method="get">
<input type="text" name="keyword">
<button type="submit">搜索</button>
</form>
在 search.php 中获取 keyword 并传递给模板,然后在模板 search.htm 中使用:
{dede:sql sql="SELECT * FROM `dede_archives` WHERE title LIKE '%@me%'"}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:sql}
PHP代码 (search.php) 部分:
require_once(dirname(__FILE__)."/include/common.inc.php");
$keyword = isset($keyword) ? addslashes($keyword) : ''; // 获取并转义关键词
$dtp = new DedeTemplate();
$dtp->Assign('keyword', $keyword); // 将keyword赋值给@me
$dtp->Display('search.htm');
内部变量:查询结果中的字段
这些就是SQL查询返回的字段,直接使用 [field:字段名/] 即可输出。
示例:查询指定会员信息并显示
{dede:sql sql="SELECT userid, uname, email FROM `dede_member` WHERE userid = 1"}
<p>用户名:[field:uname/]</p>
<p>邮箱:[field:email/]</p>
<p>用户ID:[field:userid/]</p>
{/dede:sql}
输出结果可能为:
用户名:admin
邮箱:admin@example.com
用户ID:1
高级技巧与注意事项
函数修饰 (function)
你可以像其他织梦标签一样,对[field:...]的输出使用函数进行修饰。
示例:截取描述、日期格式化
{dede:sql sql="SELECT title, pubdate, description FROM `dede_archives` LIMIT 5"}
<h3>[field:title/]</h3>
<p>发布时间:[field:pubdate function='MyDate("Y-m-d H:i:s", @me)'/]</p>
<p>简介:[field:description function='cn_substr(@me, 80)'/]...</p>
{/dede:sql}
安全性:防止SQL注入
这是使用 {dede:sql} 最最重要的一点! 直接拼接用户输入到SQL语句中是极其危险的,会导致SQL注入攻击。
危险写法(绝对不要用!):
{dede:sql sql="SELECT * FROM dede_archives WHERE title = '{$_GET['keyword']}'"}
攻击者可以通过构造 keyword 参数(如:' OR '1'='1)来获取或破坏你的数据库。
安全写法:
始终使用 @me 占位符,并在PHP代码中对变量进行过滤和转义。 如上面示例2所示,使用 addslashes() 或更安全的预处理方式(虽然织梦的@me机制已经做了部分处理,但养成良好的过滤习惯总是对的)。
执行复杂查询
你可以执行任何有效的 SELECT 查询,包括 JOIN 连接查询。
示例:联合查询文章和栏目信息
假设你想同时获取文章标题、所属栏目名称和栏目链接。
{dede:sql sql="
SELECT
a.title,
c.typename,
c.typelink
FROM
`dede_archives` a
LEFT JOIN
`dede_arctype` c ON a.typeid = c.id
WHERE
a.ismake = 1
LIMIT 10
"}
<li>
<a href="[field:typelink/]">[field:typename/]</a> -
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:sql}
注意: 这里 [field:arcurl/] 是个特例,因为 arcurl (文章链接) 并不是 dede_archives 表里的一个字段,而是织梦系统根据文章ID自动生成的链接。{dede:sql} 会自动处理一些常用的系统字段。
Get 和 Env 变量的使用
你还可以直接在SQL语句中使用织梦的全局变量,如 @tid (栏目ID), @cid (同@tid), @memberid (会员ID) 等。
示例:获取当前栏目ID下的文章(在列表页模板中使用)
{dede:sql sql="SELECT title FROM `dede_archives` WHERE typeid = @tid"}
[field:title/]
{/dede:sql}
这种写法不需要在PHP中手动传递变量,织梦会自动在当前页面上下文中查找并替换这些变量。
总结与最佳实践
| 场景 | 推荐方法 | 示例 | 安全性 |
|---|---|---|---|
| 根据用户输入查询 | 使用 @me 占位符,在PHP中过滤变量 |
{dede:sql sql="... WHERE id=@me"} |
高 |
| 使用系统已有变量 | 直接使用 @tid, @memberid 等 |
{dede:sql sql="... WHERE typeid=@tid"} |
高 |
| 展示固定数据 | 直接写死SQL | {dede:sql sql="SELECT ... FROM ... WHERE ..." |
高 |
| 危险操作 | 直接拼接 $_GET, $_POST |
sql="... WHERE id='{$_GET['id']}'" |
极低,绝对禁止! |
核心要点:
- 多用
@me:凡是涉及到外部用户输入的变量,务必通过@me来传递。 - 勤过滤:在PHP代码中,使用
intval(),addslashes(),htmlspecialchars()等函数对传入的变量进行净化。 - 权限控制:
{dede:sql}权限很大,确保使用该标签的模板不会被未授权的用户访问。 - 性能考虑:避免在循环页面(如首页、列表页)中使用复杂的SQL查询,这会严重影响网站性能,它更适合用于单页(如专题页、搜索结果页)。
- 测试先行:在部署到正式环境前,务必在本地充分测试SQL语句的正确性和安全性。
掌握了 {dede:sql} 的用法,你就能极大地扩展织梦模板的能力,实现很多默认标签无法完成的功能。
