问题根源分析
{dede:loop} 标签主要用于在指定范围内循环文档(通常是文章、图集等),它的基本语法是:

(图片来源网络,侵删)
{dede:loop table='dede_archives' sort='id' row='10' if=''}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:loop}
要让它显示自定义表单的数据,你需要修改 table 和 field 参数,问题通常出在以下几个地方:
- 数据表名错误:自定义表单的数据默认存储在
dede_addonxx表中(xx是表单ID,如dede_addon18),而不是主表dede_archives。 - 字段名错误或不匹配:
{dede:loop}内部的[field:字段名/]必须与你查询的数据表中的字段名完全一致,包括大小写。 - 查询条件 (
if) 错误:如果表单数据关联了特定栏目或文档,你需要正确的if条件来筛选出你想要的数据。 - 数据为空:可能你的自定义表单里根本没有提交任何数据。
- 权限问题:虽然不常见,但有时服务器或数据库权限也可能导致查询失败。
解决方案(由简到繁)
直接查询自定义表单数据(最常用)
这是最直接的方法,不通过主表,直接查询你的自定义表单数据。
操作步骤:
-
找到你的数据表名
(图片来源网络,侵删)- 登录你的网站后台。
- 进入【核心】->【内容模型管理】->【自定义表单管理】。
- 找到你想要调用的那个自定义表单,点击后面的“管理”按钮。
- 在浏览器地址栏中,你会看到一个类似
dede/addon18.php的链接,这里的addon18就是你数据表的前缀,你的完整表名就是**dede_addon18**(如果你的表前缀是dede的话),记下这个完整的表名。
-
编写
{dede:loop}- 在你需要显示表单数据的模板文件(通常是
.htm文件)中,使用以下代码:
<h3>用户反馈列表</h3> <ul> {dede:loop table='dede_addon18' sort='id' row='10' if ''} <li> <!-- 'uname' 和 'content' 是我假设的字段名,请替换成你自己的 --> 用户:[field:uname/] | 反馈内容:[field:content/] | 时间:[field:uptime function="MyDate('Y-m-d H:i:s',@me)"/] </li> {/dede:loop} </ul> - 在你需要显示表单数据的模板文件(通常是
-
代码解释
table='dede_addon18':关键! 替换成你自己的自定义表数据表名。sort='id':按id降序排列,这样最新的数据会显示在最前面,你也可以用sort='id desc'。row='10':显示10条数据。if='':这里可以写查询条件,if='ischeck=1'(只显示已审核的),如果不需要条件就留空。[field:字段名/]:关键!字段名必须和dede_addonxx表里的字段名完全一样,如果你的表单里有个“姓名”输入框,数据库里对应的字段可能是uname、name或xingming,你需要去数据库里确认。[field:uptime function="MyDate('Y-m-d H:i:s',@me)"/]:uptime是提交时间字段,function="MyDate(...)"是一个函数,用于将时间戳格式化为更易读的日期格式,如果你的时间字段名不是uptime,请修改它。
关联主表和附加表(高级用法)
如果你的自定义表单提交时,选择了关联到某个栏目(通过勾选“自定义表单内容默认发布到以下栏目”),那么数据会同时写入 dede_archives 和 dede_addonxx,这种情况下,你可能需要同时获取文章标题和表单内容。
操作步骤:

(图片来源网络,侵删)
-
确定关联关系
- 假设你的自定义表单数据在
dede_addon18。 - 它关联的文章在
dede_archives。 - 关联字段是
aid(文章ID)。
- 假设你的自定义表单数据在
-
编写
{dede:loop}- 你需要使用
JOIN查询来连接两个表。
<h3>关联文章的反馈列表</h3> <ul> {dede:loop table='dede_archives a JOIN dede_addon18 d ON a.id=d.aid' sort='a.id' row='10' if='a.arcrank > -1'} <li> <!-- a. 前缀表示 dede_archives 表的字段 --> <a href="[field:arcurl/]">[field:title/]</a> <!-- d. 前缀表示 dede_addon18 表的字段 --> <p>反馈人:[field:d.uname/]</p> <p>反馈内容:[field:d.content/]</p> </li> {/dede:loop} </ul> - 你需要使用
-
代码解释
table='dede_archives a JOIN dede_addon18 d ON a.id=d.aid':这是SQL的JOIN语句。dede_archives a:给dede_archives表起一个别名a。JOIN dede_addon18 d:连接dede_addon18表,并起别名d。ON a.id=d.aid:连接条件,a表的id等于d表的aid。
[field:a.title/]:使用a.前缀来获取dede_archives表的title字段(文章标题)。[field:d.uname/]:使用d.前缀来获取dede_addon18表的uname字段(表单里的用户名)。
使用 dede_sql 标签(更灵活)
{dede:loop} 的语法让你觉得不够灵活,你可以使用功能更强大的 {dede:sql} 标签,它可以直接执行任何SQL语句。
操作步骤:
-
编写SQL查询语句
- 假设还是查询方案一的
dede_addon18表。
- 假设还是查询方案一的
-
编写
{dede:sql}<h3>使用SQL标签调用反馈</h3> <ul> {dede:sql sql="SELECT id, uname, content, uptime FROM dede_addon18 ORDER BY id DESC LIMIT 10"} <li> ID:[field:id/] | 用户:[field:uname/] | 内容:[field:content/] <!-- 使用function处理时间 --> 时间:[field:uptime function="MyDate('Y-m-d',@me)"/] </li> {/dede:sql} </ul> -
代码解释
{dede:sql sql='...'}:直接在里面写你的SQL查询语句。SELECT id, uname, content, uptime FROM ...:明确指定你需要的字段,这是一种好习惯。ORDER BY id DESC LIMIT 10:按ID降序排序,并限制只返回10条结果。[field:字段名/]:用法和{dede:loop}一样,直接使用SQL查询返回的字段名。
调试技巧:如果还是不显示怎么办?
如果按照上述方法修改后依然没有数据,请按以下步骤排查:
- 检查数据:100%确定你的自定义表单里已经有提交的数据,可以去后台的自定义表单管理里看看。
- 检查字段名:这是最最容易出错的地方!务必登录你的phpMyAdmin,打开对应的
dede_addonxx数据表,查看表结构,确认你写的[field:字段名/]中的“字段名”是否100%正确(包括大小写)。 - 检查模板缓存:修改完模板后,去后台【生成】->【更新主页HTML】或【更新栏目HTML】,清空一下缓存,或者直接在浏览器中强制刷新
Ctrl + F5。 - 检查服务器错误:如果PHP代码有语法错误,服务器会返回500错误,可以打开服务器的错误日志查看,或者在页面最开头加上
<?php phpinfo(); ?>来测试PHP是否正常执行。 - 简化测试:先把
row设置为1,if条件留空,只调用一个最简单的字段(id),看看是否能出来,如果能,再逐步增加字段和条件,定位到是哪个部分出了问题。
| 场景 | 推荐标签 | 关键点 |
|---|---|---|
| 仅显示自定义表单本身的数据 | {dede:loop} |
正确填写 table='dede_addonxx' 2. 正确填写 [field:字段名/] |
| 需要关联文章标题等信息 | {dede:loop} + JOIN |
学会使用 JOIN 语法连接主表和附加表 2. 使用表别名前缀(如 a.title, d.content) |
| 需要复杂查询或排序 | {dede:sql} |
直接编写完整的SQL语句 2. 语法更灵活,功能更强 |
对于大多数情况,方案一 就足够解决问题了,如果方案一不行,再尝试方案三进行调试,希望这些信息能帮你解决问题!
