核心要点
在 phpcms (特指较早的 V9 版本) 的模板中,你不需要手动在 SQL 查询语句里写数据表前缀,前缀的添加和替换是由 phpcms 系统在后台自动完成的。

(图片来源网络,侵删)
这主要是为了安全和灵活性,允许用户在同一个数据库中安装多个 phpcms 站点而不会产生冲突。
数据表前缀是什么?
数据表前缀是加在所有数据表名称前面的一串字符,通常是为了避免与其它程序的数据表重名。
- 默认前缀是
v9_ - 安装 phpcms 时,你可以将其设置为
mywebsite_、abc_或者留空。
这样, phpcms 的内容表就会是 v9_content,如果你设置了 mywebsite_ 前缀,表名就会变成 mywebsite_content。
在模板中如何正确使用?
在 phpcms 的模板文件(.html 文件)中,当你需要执行自定义的 SQL 查询时,绝对不能直接写完整的表名。

(图片来源网络,侵删)
❌ 错误的做法
假设你的表前缀是 v9_,你在模板里这样写是错误的:
{php $db = pc_base::load_model('content_model');}
{php $result = $db->query("SELECT * FROM v9_content WHERE catid=1");}
这个写法是硬编码的,如果你的站长把数据库前缀从 v9_ 改成了 new_,那么这个模板就会失效,查询不到任何数据。
✅ 正确的做法
phpcms 提供了一个专门的变量 DB_PRE 来代表当前的数据表前缀,你应该在所有 SQL 查询中使用它。
正确示例:

(图片来源网络,侵删)
{php $db = pc_base::load_model('content_model');}
{php $result = $db->query("SELECT * FROM ".DB_PRE."content WHERE catid=1");}
代码解释:
DB_PRE: 这是一个 phpcms 模板中预定义的常量/变量,它的值就是你在后台设置的数据表前缀(v9_)。- 这是 PHP 的字符串连接符。
".DB_PRE."content: 这段代码在 PHP 引擎解析时,会变成"v9_content"(假设前缀是v9_),从而实现了动态的表名替换。
完整的模板示例
下面是一个完整的 phpcms 模板文件示例,展示了如何使用 DB_PRE 来获取指定分类下的文章列表。
文件路径:templates/default/your_module/list.html
{template "content","header"}
<h2>自定义文章列表</h2>
<ul>
{php
// 1. 加载内容模型
$db = pc_base::load_model('content_model');
// 2. 定义要查询的栏目ID (栏目ID为5)
$catid = 5;
// 3. 编写SQL查询,使用 DB_PRE 动态获取表名
// 注意:这里使用了 LIMIT 10 来限制只显示10条数据
$sql = "SELECT id, title, inputtime FROM ".DB_PRE."content WHERE catid=".$catid." AND status=99 ORDER BY id DESC LIMIT 10";
// 4. 执行查询
$result = $db->query($sql);
// 5. 遍历查询结果并输出
while($r = $db->fetch_array($result)) {
}
<li>
<a href="{siteurl()}index.php?m=content&c=index&a=show&catid={$r['catid']}&id={$r['id']}">
{$r['title']} (发布时间:{date('Y-m-d H:i:s', $r['inputtime'])})
</a>
</li>
{/php}
</ul>
{template "content","footer"}
如何查看或修改数据表前缀?
如果你忘记了当前站点的数据表前缀,或者需要修改它,可以按照以下步骤操作:
- 登录 phpcms 后台。
- 进入 “系统” -> “数据库” -> “数据库配置”。
- 在这里你可以看到当前数据库的连接信息,其中就包含了 “表前缀” 一项。
- 你可以在这里直接修改前缀,但强烈建议:修改前缀后,最好使用 phpcms 提供的数据库工具(如果有的话)或手动导出导入数据,以确保所有引用旧表名的程序都能正常工作,仅仅修改这个配置文件可能会导致很多功能异常。
| 操作 | 正确方式 | 错误方式 |
|---|---|---|
| 在模板中写 SQL | 使用 DB_PRE 变量,如 DB_PRE."content" |
直接写完整表名,如 v9_content |
| 核心原因 | 保证模板的通用性和可移植性,适应不同的安装环境 | 硬编码导致更换前缀后模板失效 |
| 查看/修改前缀 | 后台:系统 -> 数据库 -> 数据库配置 |
无(直接修改数据库文件是错误的) |
记住这个黄金法则:在 phpcms 模板的任何 SQL 语句中,表名前永远使用 DB_PRE. 来拼接。 这样你的模板就会非常健壮,可以适应各种部署环境。
