dede数据库调用指令有哪些常见用法?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 DEDE建站 正文

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

dede数据库调用指令
(图片来源网络,侵删)

核心标签:{dede:sql}

这是所有数据库操作的基础。

基本语法结构

{dede:sql sql="你的SQL语句"}
    // 循环体,用于显示查询到的每一条记录
    [field:字段名/]
{/dede:sql}
  • {dede:sql}: 标签的开始。
  • sql="...": 标签的核心属性,值是一个完整的 SQL 查询语句,必须用双引号 括起来。
  • [field:字段名/]: 循环体内的标签,用于获取当前记录的特定字段值。字段名 是你查询结果中的列名。
  • {/dede:sql}: 标签的结束。

常用场景与实例

下面我们通过一些常见的场景来学习如何使用 {dede:sql}

场景1:查询指定栏目(arctype)下的文章列表

假设我们要获取 ID 为 1 的栏目下的所有文章,并显示标题、发布时间和点击量。

SQL 语句分析:

dede数据库调用指令
(图片来源网络,侵删)
  • 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>

代码解析:

  1. sql="...": 我们写了一个 JOIN 查询,从 dede_archivesdede_arctype 表中获取数据,并筛选出栏目ID为1的文章。
  2. [field:id/]: 获取文章的ID。
  3. [field:title/]: 获取文章的标题。
  4. [field:pubdate function="MyDate('Y-m-d H:i:s',@me)"/]: 这里使用了字段函数pubdate 存储的是时间戳,我们用 MyDate 函数将其格式化为 年-月-日 时:分:秒 的格式。
  5. [field:id runphp='yes'] ... [/field:id]: 这里使用了PHP运行功能。@me 代表当前字段的原始值(即文章ID),我们调用系统自带的 GetArcUrl() 函数,根据文章ID获取到完整的文章链接。

场景2:获取特定会员发布的所有文章

假设我们要获取会员ID为 10 的用户发布的所有文章。

SQL 语句分析:

dede数据库调用指令
(图片来源网络,侵删)
  • 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}
  • 这段代码会执行更新操作,但页面上不会有任何输出。

重要注意事项

  1. 安全第一:直接使用 {dede:sql} 存在 SQL 注入的风险,如果你的网站对外开放了用户投稿或有其他输入入口,请务必对用户输入进行严格的过滤和验证。在生产环境中,应谨慎使用,优先考虑使用 DedeCMS 自带的标签和模型。
  2. 表前缀:如果你的数据库表前缀不是默认的 dede_,那么在 SQL 语句中需要修改为你的实际表前缀,mycms_archives
  3. 性能影响:复杂的 SQL 查询(如多表 JOIN、大数据量的 LIMIT)可能会对网站性能产生较大影响,建议对查询的字段进行索引优化,并尽量使用 LIMIT 来限制返回的数据量。
  4. {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 的二次开发中更加得心应手,但请务必时刻注意安全问题。

-- 展开阅读全文 --
头像
dede 修改图片目录
« 上一篇 03-01
织梦上传图片大小限制
下一篇 » 03-01

相关文章

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

目录[+]