帝国CMS的内容模板默认是HTML和模板标签的混合体,要在其中执行PHP代码,你需要使用特定的标签将PHP代码包裹起来,并确保你的PHP代码逻辑正确。

(图片来源网络,侵删)
核心方法:使用 <?php ... ?>
这是最直接、最常用的方法,你可以在内容模板中直接嵌入PHP代码。
语法:
<?php
// 在这里写你的PHP代码
$a = 1;
echo $a;
?>
重要提示:
- 开启PHP支持:在帝国CMS后台,系统 -> 系统设置 -> 系统参数设置 -> “内容页支持程序代码” 选项,必须设置为“是”,否则,模板中的PHP代码会被当作普通文本输出,而不会被执行。
- 代码位置:
<?php ... ?> 可以放在模板的任何位置,无论是HTML内部还是外部。
- 代码风格:强烈建议使用
echo 来输出HTML内容,而不是混用 <?php ?> 和 <?= ?>`,这样可以保持模板的清晰和可维护性。
结合帝国CMS的灵动标签
在实际应用中,我们很少会执行孤立的PHP代码,更多的是执行PHP来获取数据或进行逻辑判断,然后将结果输出,这时,就需要结合帝国CMS的“灵动标签”。
(图片来源网络,侵删)
场景1:在循环中执行PHP(获取变量)
灵动标签 [e:loop] 用于循环查询数据,在循环体内,你可以使用 <?php ... ?> 来处理当前循环到的每条数据的变量。
示例:查询“新闻”栏目下的最新5条信息,并在标题前加上“[最新]”标记。
<ul>
[e:loop={"select * from [!db.pre!]ecms_news where classid='1' order by newstime desc limit 5",5,24,0}]
<li>
<?php
// 获取当前标题
$title = $bqr['title'];
// 添加标记
$new_title = '[最新] ' . $title;
?>
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$new_title?></a>
<span><?=date('Y-m-d', $bqr['newstime'])?></span>
</li>
[/e:loop]
</ul>
代码解析:
[e:loop={...}]:查询语句,查询ecms_news表(新闻表),classid='1',按newstime降序排列,取5条。
5:显示条数。
24:模板ID(这里我们直接在模板里写,所以设为0或任意数字均可)。
0:是否启用缓存。
$bqr:这是一个数组,代表“查询结果”(Query Result),包含了当前这条数据的所有字段,如 title, newstime, smalltext 等。
$bqsr:这是一个数组,代表“查询子栏目/相关链接”(Query Sub-Result),常用的是 $bqsr['titleurl'],即当前这条数据的链接地址。
<?php ... ?>:我们在这里处理 $bqr['title'],得到 $new_title。
<?=$new_title?>:使用 <?= 是 <?php echo ... ?> 的简写,用于输出处理后的标题。
场景2:在循环外执行PHP(初始化变量)
如果你想在循环执行前做一些准备工作,比如定义一个变量、连接一个外部API等,可以在 [e:loop] 标签外使用 <?php ... ?>。
示例:查询某个栏目的文章总数,并显示在页面上方。
<div class="total-count">
<?php
// 1. 定义栏目ID
$classid = 1;
// 2. 查询该栏目下的文章总数
$total_sql = "select count(*) as total from [!db.pre!]ecms_news where classid='$classid'";
$total_arr = $empire->fetch1($total_sql);
$total_num = $total_arr['total'];
// 3. 输出结果
echo "栏目ID为 $classid 的文章总数为:$total_num 篇。";
?>
</div>
<hr>
<h2>最新文章列表</h2>
<ul>
[e:loop={"select * from [!db.pre!]ecms_news where classid='1' order by newstime desc limit 5",5,24,0}]
<li><a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a></li>
[/e:loop]
</ul>
代码解析:
$empire:这是帝国CMS的全局核心对象,包含了所有操作数据库、获取配置等的方法。
$empire->fetch1($sql):执行一条SQL查询,并返回第一条结果(一个一维数组)。
- 我们在循环外查询并输出了总数,然后在循环内列出文章列表。
常用函数和变量
在模板中执行PHP,你需要熟悉帝国CMS提供的一些核心函数和变量。
变量/函数
说明
示例
$bqr
当前记录数据数组(在[e:loop]或[show]内有效)
echo $bqr['title'];
$bqsr
当前记录相关信息数组(在[e:loop]或[show]内有效)
echo $bqsr['titleurl'];
$bqno
当前记录的序号(从0开始)
if($bqno % 2 == 0){ echo 'even'; }
$class_r
所有栏目的信息数组,键为栏目ID
echo $class_r[1]['classname'];
$public_r
系统公共变量,如网站名称、地址等
echo $public_r['sitename'];
$empire
帝国核心对象,用于数据库操作等
$empire->query("...");
GetPageList()
获取分页列表函数
<?=GetPageList(10, 1, 0, '0')?>
format_datetime()
格式化时间戳函数
<?=format_datetime($bqr['newstime'], 'Y-m-d H:i')?>
substr()
字符串截取函数
<?=esub($bqr['title'], 20, '...')?>
安全注意事项
在模板中执行PHP代码非常强大,但也伴随着安全风险。
- SQL注入:如果你直接将用户输入或变量拼接到SQL语句中,极易被注入。永远不要直接拼接变量。
- 错误示范:
$sql = "select * from table where id=$id";
- 正确示范:使用
$empire->quote() 函数来处理变量,或者使用查询函数的参数化查询方式(如果支持)。
- XSS跨站脚本:如果你直接输出用户提交的内容(如评论、标题),恶意用户可能提交
<script>alert('xss')</script> 这样的代码,使用 htmlspecialchars() 函数进行转义。
- 错误示范:
echo $bqr['user_content'];
- 正确示范:
echo htmlspecialchars($bqr['user_content']);
- 代码可读性:在模板中写复杂的PHP逻辑会使模板难以维护,对于复杂的业务逻辑,建议:
- 在
e/class/userfun.php 文件中编写自定义函数。
- 在模板中调用这些函数,而不是写大段代码。
- 示例:
- 在
e/class/userfun.php 中添加:function getNewTitle($title) {
return '[最新] ' . $title;
}
- 在模板中调用:
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=getNewTitle($bqr['title'])?></a>
需求
推荐方法
示例
简单执行PHP
直接使用 <?php ... ?>
<?php $a = 1; echo $a; ?>
循环处理数据
[e:loop] + <?php ... ?>
在循环内用 $bqr 获取数据并用PHP处理
循环前初始化
[e:loop] 标签外使用 <?php ... ?>
在循环外查询总数并定义变量
复杂数据处理
写入 userfun.php,在模板中调用
<?=myCustomFunction($param)?>
关键步骤:
- 后台开启:确保“内容页支持程序代码”为“是”。
- 使用标签:用
<?php ... ?> 包裹你的代码。
- 善用变量:熟练使用
$bqr, $bqsr, $empire 等核心变量。
- 注意安全:防范SQL注入和XSS攻击。
- 保持整洁:将复杂逻辑移至
userfun.php,保持模板简洁。
这是最直接、最常用的方法,你可以在内容模板中直接嵌入PHP代码。
语法:
<?php
// 在这里写你的PHP代码
$a = 1;
echo $a;
?>
重要提示:
- 开启PHP支持:在帝国CMS后台,系统 -> 系统设置 -> 系统参数设置 -> “内容页支持程序代码” 选项,必须设置为“是”,否则,模板中的PHP代码会被当作普通文本输出,而不会被执行。
- 代码位置:
<?php ... ?>可以放在模板的任何位置,无论是HTML内部还是外部。 - 代码风格:强烈建议使用
echo来输出HTML内容,而不是混用<?php ?>和<?=?>`,这样可以保持模板的清晰和可维护性。
结合帝国CMS的灵动标签
在实际应用中,我们很少会执行孤立的PHP代码,更多的是执行PHP来获取数据或进行逻辑判断,然后将结果输出,这时,就需要结合帝国CMS的“灵动标签”。

(图片来源网络,侵删)
场景1:在循环中执行PHP(获取变量)
灵动标签 [e:loop] 用于循环查询数据,在循环体内,你可以使用 <?php ... ?> 来处理当前循环到的每条数据的变量。
示例:查询“新闻”栏目下的最新5条信息,并在标题前加上“[最新]”标记。
<ul>
[e:loop={"select * from [!db.pre!]ecms_news where classid='1' order by newstime desc limit 5",5,24,0}]
<li>
<?php
// 获取当前标题
$title = $bqr['title'];
// 添加标记
$new_title = '[最新] ' . $title;
?>
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$new_title?></a>
<span><?=date('Y-m-d', $bqr['newstime'])?></span>
</li>
[/e:loop]
</ul>
代码解析:
[e:loop={...}]:查询语句,查询ecms_news表(新闻表),classid='1',按newstime降序排列,取5条。5:显示条数。24:模板ID(这里我们直接在模板里写,所以设为0或任意数字均可)。0:是否启用缓存。$bqr:这是一个数组,代表“查询结果”(Query Result),包含了当前这条数据的所有字段,如title,newstime,smalltext等。$bqsr:这是一个数组,代表“查询子栏目/相关链接”(Query Sub-Result),常用的是$bqsr['titleurl'],即当前这条数据的链接地址。<?php ... ?>:我们在这里处理$bqr['title'],得到$new_title。<?=$new_title?>:使用<?=是<?php echo ... ?>的简写,用于输出处理后的标题。
场景2:在循环外执行PHP(初始化变量)
如果你想在循环执行前做一些准备工作,比如定义一个变量、连接一个外部API等,可以在 [e:loop] 标签外使用 <?php ... ?>。
示例:查询某个栏目的文章总数,并显示在页面上方。
<div class="total-count">
<?php
// 1. 定义栏目ID
$classid = 1;
// 2. 查询该栏目下的文章总数
$total_sql = "select count(*) as total from [!db.pre!]ecms_news where classid='$classid'";
$total_arr = $empire->fetch1($total_sql);
$total_num = $total_arr['total'];
// 3. 输出结果
echo "栏目ID为 $classid 的文章总数为:$total_num 篇。";
?>
</div>
<hr>
<h2>最新文章列表</h2>
<ul>
[e:loop={"select * from [!db.pre!]ecms_news where classid='1' order by newstime desc limit 5",5,24,0}]
<li><a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a></li>
[/e:loop]
</ul>
代码解析:
$empire:这是帝国CMS的全局核心对象,包含了所有操作数据库、获取配置等的方法。$empire->fetch1($sql):执行一条SQL查询,并返回第一条结果(一个一维数组)。- 我们在循环外查询并输出了总数,然后在循环内列出文章列表。
常用函数和变量
在模板中执行PHP,你需要熟悉帝国CMS提供的一些核心函数和变量。
| 变量/函数 | 说明 | 示例 |
|---|---|---|
$bqr |
当前记录数据数组(在[e:loop]或[show]内有效) |
echo $bqr['title']; |
$bqsr |
当前记录相关信息数组(在[e:loop]或[show]内有效) |
echo $bqsr['titleurl']; |
$bqno |
当前记录的序号(从0开始) | if($bqno % 2 == 0){ echo 'even'; } |
$class_r |
所有栏目的信息数组,键为栏目ID | echo $class_r[1]['classname']; |
$public_r |
系统公共变量,如网站名称、地址等 | echo $public_r['sitename']; |
$empire |
帝国核心对象,用于数据库操作等 | $empire->query("..."); |
GetPageList() |
获取分页列表函数 | <?=GetPageList(10, 1, 0, '0')?> |
format_datetime() |
格式化时间戳函数 | <?=format_datetime($bqr['newstime'], 'Y-m-d H:i')?> |
substr() |
字符串截取函数 | <?=esub($bqr['title'], 20, '...')?> |
安全注意事项
在模板中执行PHP代码非常强大,但也伴随着安全风险。
- SQL注入:如果你直接将用户输入或变量拼接到SQL语句中,极易被注入。永远不要直接拼接变量。
- 错误示范:
$sql = "select * from table where id=$id"; - 正确示范:使用
$empire->quote()函数来处理变量,或者使用查询函数的参数化查询方式(如果支持)。
- 错误示范:
- XSS跨站脚本:如果你直接输出用户提交的内容(如评论、标题),恶意用户可能提交
<script>alert('xss')</script>这样的代码,使用htmlspecialchars()函数进行转义。- 错误示范:
echo $bqr['user_content']; - 正确示范:
echo htmlspecialchars($bqr['user_content']);
- 错误示范:
- 代码可读性:在模板中写复杂的PHP逻辑会使模板难以维护,对于复杂的业务逻辑,建议:
- 在
e/class/userfun.php文件中编写自定义函数。 - 在模板中调用这些函数,而不是写大段代码。
- 示例:
- 在
e/class/userfun.php中添加:function getNewTitle($title) { return '[最新] ' . $title; } - 在模板中调用:
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=getNewTitle($bqr['title'])?></a>
- 在
- 在
| 需求 | 推荐方法 | 示例 |
|---|---|---|
| 简单执行PHP | 直接使用 <?php ... ?> |
<?php $a = 1; echo $a; ?> |
| 循环处理数据 | [e:loop] + <?php ... ?> |
在循环内用 $bqr 获取数据并用PHP处理 |
| 循环前初始化 | [e:loop] 标签外使用 <?php ... ?> |
在循环外查询总数并定义变量 |
| 复杂数据处理 | 写入 userfun.php,在模板中调用 |
<?=myCustomFunction($param)?> |
关键步骤:
- 后台开启:确保“内容页支持程序代码”为“是”。
- 使用标签:用
<?php ... ?>包裹你的代码。 - 善用变量:熟练使用
$bqr,$bqsr,$empire等核心变量。 - 注意安全:防范SQL注入和XSS攻击。
- 保持整洁:将复杂逻辑移至
userfun.php,保持模板简洁。
