织梦SQL标签变量查询如何实现?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 织梦建站 正文

{dede:sql} 标签基础

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

织梦sql标签变量查询
(图片来源网络,侵删)

基本语法结构

{dede:sql sql='你的SQL语句'}
    <li>
        [field:字段名/]
    </li>
{/dede:sql}
  • {dede:sql sql='...'}: 开始标签,sql属性是必需的,值就是你要执行的SQL语句。
  • [field:字段名/]: 循环体内的标签,用于输出查询结果中每一行的特定字段值。字段名就是你的SQL查询语句中SELECT后面的列名。
  • {/dede:sql}: 结束标签。

变量的来源与使用

{dede:sql}标签中,变量主要有两个来源:外部传入内部查询

外部变量:通过 GetPost 传入

这是最常见的用法,用于根据用户在网页上的操作(如点击、搜索)来动态查询数据,你需要使用 @me 来接收这些变量。

语法: {dede:sql sql="SELECT 字段 FROM 表名 WHERE 条件 = '@me'"} 这里的 @me 就是一个占位符,在执行SQL前,它会自动被外部传入的变量值所替换。

示例1:根据栏目ID查询该栏目下的文章

织梦sql标签变量查询
(图片来源网络,侵删)

假设你有一个链接,点击后想查看某个栏目(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:根据搜索关键词查询

织梦sql标签变量查询
(图片来源网络,侵删)

一个搜索框,用户输入“织梦教程”,然后点击搜索。

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} 会自动处理一些常用的系统字段。

GetEnv 变量的使用

你还可以直接在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']}'" 极低,绝对禁止!

核心要点:

  1. 多用 @me:凡是涉及到外部用户输入的变量,务必通过 @me 来传递。
  2. 勤过滤:在PHP代码中,使用 intval(), addslashes(), htmlspecialchars() 等函数对传入的变量进行净化。
  3. 权限控制{dede:sql} 权限很大,确保使用该标签的模板不会被未授权的用户访问。
  4. 性能考虑:避免在循环页面(如首页、列表页)中使用复杂的SQL查询,这会严重影响网站性能,它更适合用于单页(如专题页、搜索结果页)。
  5. 测试先行:在部署到正式环境前,务必在本地充分测试SQL语句的正确性和安全性。

掌握了 {dede:sql} 的用法,你就能极大地扩展织梦模板的能力,实现很多默认标签无法完成的功能。

-- 展开阅读全文 --
头像
dede频道封面分页方法是什么?
« 上一篇 今天
织梦模板如何助力装饰设计公司建站?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]