正在用帝国CMS做企业站、个人博客,或者学校、小公司官网,想加一个“用户留言”功能,但不想用第三方笨重插件、怕被挂马、又嫌官方文档绕来绕去的站长,如果你是那种连帝国后台都没摸熟、看见PHP就头疼的新手,没关系,跟着这篇走,只要会打字、会复制粘贴、会点鼠标,就能把留言板从无到有搭起来,但如果你连“数据表”和“模型”是啥都不愿意搞明白,那建议直接花钱找人做,省得折腾自己。
先说清楚,我们不用任何现成留言板插件,就用帝国CMS自带的“数据表+模型+栏目+模板”机制,从零手动造一个,好处是:数据结构你完全掌控,不怕以后升级被插件坑;坏处是:要自己写一小段处理PHP代码,别慌,代码就那么十几行,照着抄就行。
第一步:建数据表
登录帝国CMS后台,顶部菜单点“系统设置” -> “数据表管理” -> “新增数据表”,表名建议填 my_gbook(只允许小写字母和下划线),其他默认。
建完表后,点“管理系统模型”或直接去“模型管理”里,新增一个模型,模型名“留言板”,绑定刚建的表 my_gbook,帝国会默认生成一些字段,我们不要那些,直接把“模型字段”里的系统字段删到最简,然后自己加我们需要的字段:

帝国CMS留言板手把手搭建,别急着找插件,先学会自己动手
nickname字段:字段类型“短文本”,表单类型“文本框”email字段:字段类型“短文本”,表单类型“文本框”gcontent字段:字段类型“长文本”,表单类型“多行文本框”createtime字段:字段类型“UNIX时间戳”,表单类型“时间戳”status字段:字段类型“数字”,表单类型“隐藏”,默认值填0
注意:gcontent 千万不要用系统自带的 content 这种保留名字,踩坑现场我会细说。
第二步:建栏目
去“栏目管理” -> “增加栏目”,栏目类型选“单页”,为什么选单页?因为单页不需要列表分页逻辑,一个页面搞定展示和提交(其实我们展示会在模板里自己循环,所以单页最好用),栏目名称写“留言板”,别名 gbook,模板选“留言板单页模板”,这个模板我们等会儿自己建,栏目绑定模型选刚才建的“留言板”模型。
第三步:写前台表单
去“模板管理” -> “标签模板”或“页面模板”,新建一个模板,名字“留言板单页模板”,内容前半部分放一个表格样式:
<div class="gbook-form">
<h3>我要留言</h3>
<form method="post" action="/e/action/gbook.php">
<input type="hidden" name="doaction" value="add">
<input type="hidden" name="classid" value="8"> <!-- 改成你的留言板栏目ID -->
<input type="hidden" name="token" value="放置帝国生成的token用于防刷新,见下面配置要点">
昵称:<input type="text" name="nickname" required>
邮箱:<input type="text" name="email"><textarea name="gcontent" rows="5" required></textarea>
<img src="/e/showcaptcha.php?t=random" onclick="this.src='/e/showcaptcha.php?t='+Math.random()" />
<input type="text" name="key" placeholder="验证码"> <!-- 注意帝国验证码字段名是key -->
<button type="submit">提交留言</button>
</form>
</div>
这段HTML里,classid 必须换成你实际的留言板栏目ID(去栏目管理能看到)。action 指向 /e/action/gbook.php,这个文件我们一会儿手动创建。
第四步:写处理PHP文件
在帝国CMS根目录的 /e/action/ 文件夹下,新建一个文件 gbook.php,用文本编辑器打开,写入以下代码(注意别用记事本做UTF-8编码,容易乱码):
<?php
require_once('../class/connect.php'); // 载入帝国核心类(路径以你实际为准)
require_once('../class/db_sql.php'); // 载入数据库操作类
require_once('../class/functions.php');
$empire = new mysqlquery();
// 基本过滤
$nickname = RepPostStr($_POST['nickname'], true);
$email = RepPostStr($_POST['email'], true);
$gcontent = RepPostStr($_POST['gcontent'], true); // 这里已经转义了
// 验证码检查(帝国自带)
include('../class/CheckLogin.php');
if (empty($_POST['key'])) { die('验证码不能为空'); }
$login_captcha = $_POST['key'];
if ($login_captcha != $_SESSION['captcha']) { die('验证码错误'); } // 具体session变量名要看你的验证码类
// 非空判断
if (empty($nickname) || empty($gcontent)) { die('昵称和内容必填'); }
// 写入附加表数据,注意表名前缀cfg_db_表名
$sql = "INSERT INTO `my_gbook` (`classid`, `nickname`, `email`, `gcontent`, `createtime`, `status`) VALUES ('{$_POST['classid']}', '{$nickname}', '{$email}', '{$gcontent}', '" . time() . "', '0')";
$empire->query($sql);
// 跳转回留言板,带上成功提示
Header("Location: /gbook/?succeed=1");
?>
实际帝国CMS的写入方式最好用官方封装的 insert 方法,$empire->query($sql) 已经够用,但为了更规范,你可以用 $empire->query1(),这里关键是 RepPostStr 这个函数,它能防SQL注入和XSS,千万不能省。
第五步:展示留言列表
回到模板文件里,在表单下面加一段PHP循环,用来查数据库里的留言:
<?php
$sql = "SELECT * FROM `my_gbook` WHERE `status`=1 ORDER BY `createtime` DESC LIMIT 50";
$result = $empire->query($sql);
while ($row = $empire->fetch($result)) {
?>
<div class="gbook-item">
<strong><?= $row['nickname'] ?></strong> 于 <?= date('Y-m-d H:i', $row['createtime']) ?> 说:
<p><?= nl2br(stripcslashes($row['gcontent'])) ?></p>
</div>
<?php } ?>
如果你不想在模板里写PHP,也可以用帝国CMS的“万能标签” [ecmsinfo] 调取,但作为手把手教学,直接写PHP更直观,新手也能复制。
配置要点(不配置必炸)
-
验证码字段名:帝国CMS的验证码类通常用
key作为表单字段名,但也有版本用verifycode,你可以在/e/class/captcha.php里查一下,反正我这里写的是通用的,不完全对的话,你打开你的验证码源文件,搜索$_POST看看它认哪个键。 -
数据表前缀:上面SQL里我写了
my_gbook,但实际上帝国CMS会自动加前缀,phome_my_gbook,所以在写SQL时,最好用帝国常量$dbtbpre代替,修改为:INSERT INTO${$dbtbpre}my_gbook,否则你直接写my_gbook会报“表不存在”。 -
后台管理留言:
status字段就是给后台审核用的,你可以在帝国后台的“信息管理”里看到所有留言,状态0待审核,1通过,若想直接在前台显示,那就在展示SQL里只查status=1,这样用户不会看到垃圾广告。 -
模板缓存:帝国CMS默认开模板缓存,你改了模板后前台不更新,去“系统设置”->“系统配置”->“性能选项”里,把“模板缓存”关掉,或者每次修改模板后点“更新缓存”。
-
开启来源检查:帝国后台“系统设置”->“参数设置”里有“是否开启提交来源检查”,如果你开着,那表单页的所在域名必须和后台域名一致,并且要给表单加“隐藏来源字段”
$_SERVER['HTTP_REFERER']自动带上,否则提交会被拒绝,最简单:临时关闭这个检查。
常见踩坑提醒(都是血泪教训)
坑1:用 content 做字段名,帝国把 content 字段默认设置为系统“内容字段”,在单页模型里会强制后台编辑,而且前台输出用 [!--content--] 会混乱,请你老老实实用 gcontent 或 body。
坑2:忘了防SQL注入,有些人直接 $_POST['gcontent'] 拼进SQL,然后被黑客提交一段 '; DROP TABLE...,你的站就没了,用 RepPostStr() 过滤,或者用 addslashes() 都行,但你既然用帝国,就按帝国的规矩来。
坑3:留言后不跳转也不提示,你的 gbook.php 在 /e/action/ 下,但有些服务器伪静态规则会拦截,导致404,建议先走绝对路径 /e/action/gbook.php,如果还不行,检查权限是否755,及根目录下是否有 .htaccess 冲突。
坑4:验证码图片永远是裂的,帝国验证码路径 /e/showcaptcha.php 需要 session 支持,如果你用了CDN或强制HTTPS,把图片地址改成绝对路径 https://你的域名/e/showcaptcha.php,并且确认 session 没有被对方跨域拦截。
坑5:列表显示乱码,帝国CMS用的是UTF-8,你的PHP文件也必须是UTF-8无BOM,否则开头有隐藏字符,页面输出几个空行,无法重新加载页面”。
坑6:后台栏目里看不到留言数据,因为你是直接往附加表写数据,没有走帝国“内容模型”的整合流程,解决办法:给 my_gbook 表加一个 id 主键和一个 checked(或复用 status)字段,然后在后台“信息管理”里无法查看,因为那个表不是系统默认的数据表,这个案子要解决,有两种途径:一是用帝国系统内置的“自定义列表”,但配置复杂;二是我们放弃后台直接管理,只通过数据库客户端(phpMyAdmin)去改 status,或者后台加一个简易管理接口,对于新手,我建议你直接用phpMyAdmin,改 status 从0到1就行,但真的懒人,也可以把 status=1 直接写死,前台提交立即显示,不加审核,注意防垃圾就好。
坑7:留言间隔没限制,被刷爆,在 gbook.php 里加个 session 判断,if ($_SESSION['last_time'] > time() - 30) die('留言太频繁'); $_SESSION['last_time']=time();,别嫌麻烦。
好了,按照以上步骤,你一定能搭出一个能用的留言板,帝国CMS虽然古老,但核心机制就是这么朴实无华,不要一上来就去下载什么“帝国留言板插件” —— 插件可能带后门,自己动手练技术才是王道,今天就到这里,要是还有问题,评论区喊我。
发表评论