织梦loop标签使用教程

loop SQL 高级查询

loop标签是什么

织梦 {dede:loop} 是一个底层 SQL 循环标签,可以查询任意数据表并循环输出。相比 {dede:arclist} 只能查文档表,loop 更灵活,能调用栏目、用户、自定义表,适合做高级功能。

基本语法

{dede:loop table='数据表' sort='排序字段' row='行数' if='条件'}
  [field:字段名/]
{/dede:loop}

参数详解

实例一:调用最新10篇文章

{dede:loop table='dede_archives' sort='pubdate' row='10' if='arcrank>-1'}
  <li>
    <a href="/view.php?aid=[field:id/]">[field:title/]</a>
    <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
  </li>
{/dede:loop}
  1. 织梦loop标签使用教程 2026-07-29
  2. 织梦arclist如何过滤重复文章 2026-07-28
  3. 织梦模板缓存如何关闭 2026-07-27

实例二:调用指定栏目下的子栏目

{dede:loop table='dede_arctype' sort='sortrank' row='20' if="reid='1'"}
  <a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">
    [field:typename/]
  </a>
{/dede:loop}

实例三:调用热门文章(按点击量)

{dede:loop table='dede_archives' sort='click' row='8' if='arcrank>-1 AND typeid=5'}
  <li>
    <a href="/view.php?aid=[field:id/]">[field:title/]</a>
    阅读:[field:click/]
  </li>
{/dede:loop}

实例四:调用自定义表数据

假设你建了一个留言表 dede_guestbook

{dede:loop table='dede_guestbook' sort='dtime' row='5' if='ischeck=1'}
  <div class="msg">
    <strong>[field:uname/]:</strong>
    [field:msg function="cn_substr(@me,80)"/]
    <time>[field:dtime function="GetDateMk(@me)"/]</time>
  </div>
{/dede:loop}

实例五:多表联合查询

调用文章标题 + 栏目名,需 JOIN:

{dede:loop table='dede_archives arc,dede_arctype t'
        sort='arc.pubdate' row='10'
        if='arc.typeid=t.id AND arc.arcrank>-1'}
  <li>
    <a href="/view.php?aid=[field:arc.id/]">[field:arc.title/]</a>
    - [field:t.typename/]
  </li>
{/dede:loop}
注意:多表 JOIN 时,table 用逗号分隔并加表别名,if 中写连接条件。字段引用要带表别名前缀,如 [field:arc.title/]

loop 与 sql 标签的区别

织梦还有个 {dede:sql} 标签,写法更接近原生 SQL:

{dede:sql sql="SELECT * FROM dede_archives WHERE arcrank>-1 LIMIT 10"}
  [field:title/]
{/dede:sql}

对比:

分页支持

loop 本身不分页,需要分页可改用 {dede:listsql} 标签或在 loop 外层手动拼接分页参数。

性能优化建议

常见问题

loop 不输出任何内容

1) 表名写错(前缀可能不是 dede_,而是 dede_);2) if 条件写错;3) 字段名拼写错误。

SQL 注入风险

不要把用户输入直接拼到 if 中,用 if='typeid='.intval($tid) 强制转整数。

行动建议

用 loop 之前先想清楚能否用 arclist、channel 等专用标签实现,专用标签性能和安全性都更好。loop 是「最后一招」,用于专用标签覆盖不到的场景。建议把常用的 loop 查询封装成自定义标签或函数,避免模板里满屏 SQL,提升可维护性。把数据库表结构和索引情况整理成文档,写 loop 时心里有数,查询效率才有保障。