下面我将从基础到高级,详细讲解如何在帝国CMS模板中调用数据库。

(图片来源网络,侵删)
核心基础:[ecms] 和 SQL 语句
在帝国CMS模板中,所有数据库查询操作都围绕一个核心标签:[ecms],这个标签的作用是执行一段SQL查询语句,并将查询结果以特定格式输出到模板中。
[ecms] 标签的基本语法结构:
[e:loop={栏目ID/专题ID, 显示条数, 操作类型, 只看头条, 循环内变量名, 结束符}]
循环内容,通常包含字段调用标签如:`<?=$bqr[字段名]?>`
[/e:loop]
e:loop: 这是循环调用的标签,注意它不是[ecms],[ecms]是更广义的说法,e:loop是最常用的数据库调用方式。- : 内部是参数,用逗号分隔。
[/e:loop]: 循环结束标签。
最常用的调用方式:e:loop 调用栏目信息
这是最常见的需求,比如调用某个栏目下的文章列表。
场景1:调用指定ID的栏目文章
假设我们要调用 栏目ID为 "1" 的栏目下的 10条 文章。
模板代码:

(图片来源网络,侵删)
<h2>栏目ID为1的最新文章</h2>
<ul>
[e:loop={1,10,0,0,'newstime DESC'}]
<li>
<a href="<?=$bqsr[titleurl]?>" target="_blank"><?=$bqr[title]?></a>
<span><?=date('Y-m-d', $bqr[newstime])?></span>
</li>
[/e:loop]
</ul>
参数详解:
1: 栏目ID,如果你想调用多个栏目,可以用逗号隔开,如1,2,3。10: 显示条数,显示多少条记录。0: 操作类型。0: 按发布时间排序(默认)。1: 按ID排序。2: 按置顶级别排序。3: 按点击排序。4: 按评分排序。5: 按评论排序。
0: 只看头条。0: 不限。1: 只看头条。2: 只看非头条。
'newstime DESC': 自定义排序,这是一个强大的功能,可以直接写SQL的ORDER BY子句。newstime DESC表示按发布时间倒序排列,常用的还有id DESC(按ID倒序)、onclick DESC(按点击量倒序)。
场景2:调用当前栏目下的文章
在栏目列表页或内容页,经常需要调用当前栏目的子栏目或同级栏目文章,这时可以使用 $GLOBALS['navclassid'] 获取当前栏目ID。
模板代码(在栏目列表页):
<h2>当前栏目下的文章</h2>
<ul>
[e:loop={$GLOBALS['navclassid'],10,0,0,'newstime DESC'}]
<li>
<a href="<?=$bqsr[titleurl]?>" target="_blank"><?=$bqr[title]?></a>
</li>
[/e:loop]
</ul>
高级调用:使用自定义SQL语句
当 e:loop 的参数无法满足复杂需求时,我们可以直接写SQL语句,这提供了最大的灵活性。

(图片来源网络,侵删)
场景:调用自定义表中的数据
假设我们有一个自定义数据表 phome_enewsuser(用户表),我们想查询其中的用户名和邮箱。
模板代码:
<h2>用户列表</h2>
<ul>
[e:loop={"select userid, username, email from phome_enewsuser order by userid desc limit 10",10,24,0}]
<li>
用户名:<?=$bqr['username']?> | 邮箱:<?=$bqr['email']?>
</li>
[/e:loop]
</ul>
参数详解:
"select userid, username, email from phome_enewsuser order by userid desc limit 10": 这就是完整的 SQL查询语句,注意SQL语句需要用双引号包裹。10: 显示条数,这里的limit 10在SQL中已经写了,这个参数可以写0或保持一致。24: 操作类型,非常重要!0: 查询主表phome_ecms_news等系统表。1: 查询附表。24: 查询任意表,当你查询自定义表或者非标准的系统表时,必须使用24。
0: 只看头条,对自定义表无效,可以写0。
字段调用与常用系统变量
在循环体内,如何获取字段的值?
调用文章/信息字段
系统通过一个数组变量 <?=$bqr?> 将当前循环记录的字段值传递给模板。
-
<?=$bqr[title]?> - 标题链接:
<?=$bqsr[titleurl]?>(推荐使用,自动处理了动态/静态链接) - 缩略图:
<?=$bqr[titlepic]?>(如果为空,可以设置默认图:<?=empty($bqr[titlepic]) ? '/images/default.jpg' : $bqr[titlepic]?>) - 简介:
<?=$bqr[smalltext]?> - 发布时间:
<?=$bqr[newstime]?>(这是时间戳,需要用date()函数格式化)- 格式化示例:
<?=date('Y-m-d H:i:s', $bqr[newstime])?>
- 格式化示例:
- 点击数:
<?=$bqr[onclick]?> - 自定义字段: 如果你在后台添加了自定义字段,
address(地址),直接调用<?=$bqr[address]?>即可。
常用系统变量
$GLOBALS['navclassid']: 当前栏目ID。$public_r['newsurl']: 网站根目录URL。$bqno: 当前循环的序号,从1开始,可以用来实现隔行变色等效果。
示例:隔行变色
<ul>
[e:loop={1,10,0,0}]
<li class="<?=($bqno % 2 == 0) ? 'even' : 'odd'?>">
<a href="<?=$bqsr[titleurl]?>"><?=$bqr[title]?></a>
</li>
[/e:loop]
</ul>
CSS中定义 .even { background-color: #f0f0f0; } 即可。
其他重要调用
调用子栏目列表
使用 GetClass() 函数。
[e:loop={"select classid, classname, classimg from phome_enewsclass where bclassid='$GLOBALS[navclassid]' order by myorder,classid asc",0,24,0}]
<div class="class-item">
<a href="<?=$public_r['newsurl']?><?=$bqr[classpath]?>">
<img src="<?=$bqr[classimg]?:'/images/default-class.jpg'?>" alt="<?=$bqr[classname]?>">
<span><?=$bqr[classname]?></span>
</a>
</div>
[/e:loop]
调用指定专题
专题调用和栏目调用类似,但参数是专题ID。
[e:loop={专题ID, 10, 87, 0}]
<a href="<?=$bqsr[titleurl]?>"><?=$bqr[title]?></a>
[/e:loop]
操作类型 87 表示调用专题。
安全注意事项
-
防止SQL注入:
- 永远不要直接将用户输入(如URL参数)拼接到SQL语句中。
- 如果需要根据条件查询,优先使用
e:loop的参数。 - 如果必须用自定义SQL,请对变量进行过滤或使用预处理语句(在帝国CMS中通常通过函数处理)。
-
字段命名规范:
- 调用字段时,确保字段名正确,如果字段名是数据库保留关键字(如
order,key),最好用反引号包裹,如<?=$bqr[order]?>,但帝国CMS的标签系统通常已经做了处理,直接用<?=$bqr[order]?>也可以。
- 调用字段时,确保字段名正确,如果字段名是数据库保留关键字(如
| 需求场景 | 推荐方法 | 示例 |
|---|---|---|
| 调用栏目下的文章 | e:loop 基础调用 |
[e:loop={1,10,0,0}]...[/e:loop] |
| 调用当前栏目文章 | e:loop + $GLOBALS['navclassid'] |
[e:loop={$GLOBALS['navclassid'],10}]...[/e:loop] |
| 复杂排序或筛选 | e:loop + 自定义排序 |
[e:loop={1,10,0,0,'onclick DESC'}]...[/e:loop] |
| 调用自定义表数据 | e:loop + 自定义SQL + 操作类型24 |
[e:loop={"select ...",10,24,0}]...[/e:loop] |
| 调用子栏目 | e:loop + GetClass() SQL |
[e:loop={"select ... from phome_enewsclass ...",0,24,0}]...[/e:loop] |
掌握 e:loop 的各种参数组合和自定义SQL的使用,你就可以在帝国CMS模板中实现几乎所有的数据库调用需求,建议多在后台的“自定义页面”功能中测试代码,确认无误后再应用到正式模板中。
