核心原理
无论使用哪种方法,其基本步骤都是:

- 连接数据库:使用 PHPCMS 的数据库配置信息(主机名、用户名、密码、数据库名)建立一个数据库连接。
- 执行 SQL:通过这个连接,编写并执行你想查询的 SQL 语句。
- 处理结果:获取查询结果,并将其格式化成 DedeCMS 可以识别和使用的形式(通常是数组)。
- 关闭连接:释放数据库资源。
使用 Dede 的 {dede:sql} 标签(最推荐)
这是最灵活、最符合 DedeCMS 模板引擎思想的方法,它允许你在模板文件中直接嵌入 PHP 代码来执行复杂的数据库操作。
适用场景:在模板文件(.htm)中需要直接调用 PHPCMS 数据时。
操作步骤:
-
找到 PHPCMS 的数据库配置文件 通常位于
phpcms/config.php,打开这个文件,找到数据库连接信息,记下以下几项:
(图片来源网络,侵删)db_host(数据库主机)db_user(数据库用户名)db_pass(数据库密码)db_name(数据库名)db_tablepre(数据库表前缀,非常重要!)
-
在 Dede 模板中使用
{dede:sql}在你需要调用数据的 Dede 模板文件(
index.htm)中,使用如下代码:{dede:sql sql=" // 1. 在这里直接写 PHP 代码来连接和查询数据库 $phpcms_db = new mysqli('PHPCMS_DB_HOST', 'PHPCMS_DB_USER', 'PHPCMS_DB_PASS', 'PHPCMS_DB_NAME'); // 检查连接是否成功 if ($phpcms_db->connect_error) { die('连接失败: ' . $phpcms_db->connect_error); } // 设置字符集,防止乱码 $phpcms_db->set_charset('utf8'); // 2. 编写你的 SQL 查询语句 // 记得把 phpcms_ 替换成你实际的表前缀 $query = \"SELECT id, title, inputtime FROM phpcms_content WHERE status=1 ORDER BY id DESC LIMIT 10\"; $result = $phpcms_db->query($query); // 3. 遍历结果并输出 $i = 0; $artlist = ''; while ($row = $result->fetch_assoc()) { $i++; // 这里你可以根据需要格式化输出 $artlist .= \"<li><a href='show.php?id={$row['id']}'>{$row['title']}</a> <span>\".date('Y-m-d', $row['inputtime']).\"</span></li>\"; } // 4. 关闭连接 $phpcms_db->close(); // 5. 输出最终结果 echo $artlist; "}
代码解释:
sql=""属性里的内容就是一段完整的 PHP 代码。- 我们使用原生的
mysqli扩展来连接数据库,因为它更通用且高效。 - 务必替换掉
PHPCMS_DB_HOST等占位符为你自己的配置信息。 - 务必将
phpcms_替换为你在 PHPCMS 中实际设置的表前缀。 - 最后通过
echo将处理好的 HTML 字符串输出到模板中。
使用 Dede 的 {dede:php}
这个标签和 {dede:sql} 类似,但它更侧重于执行一段独立的 PHP 代码块,而不是直接返回一个查询结果集,它非常适合做更复杂的逻辑判断。
(图片来源网络,侵删)
适用场景:当调用数据的同时,还需要在模板中进行复杂的 PHP 逻辑处理时。
操作步骤:
-
准备 PHP 代码:和方法一类似,准备好连接和查询 PHPCMS 数据库的 PHP 代码。
-
在模板中使用 {dede:php}
{dede:php}
// 1. 连接 PHPCMS 数据库
$phpcms_db = new mysqli('PHPCMS_DB_HOST', 'PHPCMS_DB_USER', 'PHPCMS_DB_PASS', 'PHPCMS_DB_NAME');
if ($phpcms_db->connect_error) {
die('连接失败: ' . $phpcms_db->connect_error);
}
$phpcms_db->set_charset('utf8');
// 2. 执行查询
$query = \"SELECT id, title, inputtime FROM phpcms_content WHERE status=1 ORDER BY id DESC LIMIT 10\";
$result = $phpcms_db->query($query);
// 3. 循环输出
while ($row = $result->fetch_assoc()) {
// 在这里可以直接使用 echo 输出
// 也可以将数据存入一个数组,供后续标签使用(但相对复杂)
echo \"<li><a href='show.php?id={$row['id']}'>{$row['title']}</a></li>\";
}
// 4. 关闭连接
$phpcms_db->close();
{/dede:php}
与方法一的区别:
{dede:sql} 更像一个“查询工具”,它把结果返回,由标签本身处理输出。
{dede:php} 更像一个“PHP 代码执行器”,你需要在代码块内部完成所有事情,包括 echo 输出。
- 对于单纯的数据库查询和列表输出,
{dede:sql} 通常更简洁。
修改 Dede 源码文件(不推荐,仅限高级用户)
这种方法通过修改 DedeCMS 的核心文件(如 include/common.inc.php),在全局初始化时就连接上 PHPCMS 的数据库,之后,你可以在任何 PHP 文件或标签中直接使用这个连接。
适用场景:网站中大量页面、模块都需要频繁调用 PHPCMS 数据,且不希望在每个模板里都重复写连接代码。
操作步骤:
-
打开 Dede 核心文件:/include/common.inc.php
-
在文件末尾添加数据库连接代码:
// ... common.inc.php 文件原有代码 ...
// 在文件最后添加以下代码,连接 PHPCMS 数据库
$phpcms_db = new mysqli('PHPCMS_DB_HOST', 'PHPCMS_DB_USER', 'PHPCMS_DB_PASS', 'PHPCMS_DB_NAME');
if ($phpcms_db->connect_error) {
// 在生产环境中,建议记录日志而不是直接显示错误
die('PHPCMS 数据库连接失败');
}
$phpcms_db->set_charset('utf8');
// 为了方便使用,可以将其设置为全局变量
global $db_PHPCMS;
$db_PHPCMS = $phpcms_db;
-
在模板或文件中使用
现在你可以在任何地方使用 $db_PHPCMS 这个全局变量了。
在 {dede:sql} 中使用:
{dede:sql sql="
$query = \"SELECT id, title FROM phpcms_content LIMIT 5\";
$result = \$db_PHPCMS->query(\$query);
while(\$row = \$result->fetch_assoc()){
echo \"<li>{$row['title']}</li>\";
}
"}
在自定义 PHP 文件中使用:
// 在你的自定义PHP文件中
global $db_PHPCMS;
$query = "SELECT id, title FROM phpcms_content LIMIT 5";
$result = $db_PHPCMS->query($query);
// ...处理结果...
为什么不推荐?
- 破坏性:直接修改核心文件,升级 DedeCMS 时会被覆盖,需要重新修改。
- 耦合度高:将两个本应独立的系统强耦合在一起,增加了维护难度。
- 安全性:如果数据库配置信息泄露,风险较大。
重要注意事项
- 数据库字符集:两个系统的数据库字符集(如
utf8 或 gbk)必须保持一致,否则会出现乱码,在连接数据库后,务必执行 $db->set_charset('utf8');。
- 数据库表前缀:PHPCMS 和 DedeCMS 都使用表前缀来避免表名冲突,在编写 SQL 时,一定要写对 PHPCMS 的表前缀(如
phpcms_)。
- 数据库权限:用于连接的数据库用户只需要对目标表有
SELECT 查询权限即可,不需要 INSERT, UPDATE, DELETE 等高权限,这更安全。
- 性能考虑:跨数据库查询会增加服务器负载,如果调用非常频繁,建议考虑数据同步或使用 API 等更优的方案,而不是每次都实时查询。
- 安全性:确保你的数据库配置信息(尤其是密码)安全,不要泄露给无关人员。
方法
优点
缺点
推荐度
{dede:sql}
灵活、非侵入性、易于维护
代码量稍多
★★★★★ (最推荐)
{dede:php}
逻辑处理能力强
代码耦合度高,不易复用
★★★☆☆
修改源码
全局可用,代码简洁
破坏性强、耦合度高、升级麻烦
★☆☆☆☆ (不推荐)
对于绝大多数情况,使用方法一 {dede:sql} 是最佳选择,它既满足了功能需求,又保持了 DedeCMS 系统的整洁和可维护性。
这个标签和 {dede:sql} 类似,但它更侧重于执行一段独立的 PHP 代码块,而不是直接返回一个查询结果集,它非常适合做更复杂的逻辑判断。

适用场景:当调用数据的同时,还需要在模板中进行复杂的 PHP 逻辑处理时。
操作步骤:
-
准备 PHP 代码:和方法一类似,准备好连接和查询 PHPCMS 数据库的 PHP 代码。
-
在模板中使用
{dede:php}{dede:php} // 1. 连接 PHPCMS 数据库 $phpcms_db = new mysqli('PHPCMS_DB_HOST', 'PHPCMS_DB_USER', 'PHPCMS_DB_PASS', 'PHPCMS_DB_NAME'); if ($phpcms_db->connect_error) { die('连接失败: ' . $phpcms_db->connect_error); } $phpcms_db->set_charset('utf8'); // 2. 执行查询 $query = \"SELECT id, title, inputtime FROM phpcms_content WHERE status=1 ORDER BY id DESC LIMIT 10\"; $result = $phpcms_db->query($query); // 3. 循环输出 while ($row = $result->fetch_assoc()) { // 在这里可以直接使用 echo 输出 // 也可以将数据存入一个数组,供后续标签使用(但相对复杂) echo \"<li><a href='show.php?id={$row['id']}'>{$row['title']}</a></li>\"; } // 4. 关闭连接 $phpcms_db->close(); {/dede:php}
与方法一的区别:
{dede:sql}更像一个“查询工具”,它把结果返回,由标签本身处理输出。{dede:php}更像一个“PHP 代码执行器”,你需要在代码块内部完成所有事情,包括echo输出。- 对于单纯的数据库查询和列表输出,
{dede:sql}通常更简洁。
修改 Dede 源码文件(不推荐,仅限高级用户)
这种方法通过修改 DedeCMS 的核心文件(如 include/common.inc.php),在全局初始化时就连接上 PHPCMS 的数据库,之后,你可以在任何 PHP 文件或标签中直接使用这个连接。
适用场景:网站中大量页面、模块都需要频繁调用 PHPCMS 数据,且不希望在每个模板里都重复写连接代码。
操作步骤:
-
打开 Dede 核心文件:
/include/common.inc.php -
在文件末尾添加数据库连接代码:
// ... common.inc.php 文件原有代码 ... // 在文件最后添加以下代码,连接 PHPCMS 数据库 $phpcms_db = new mysqli('PHPCMS_DB_HOST', 'PHPCMS_DB_USER', 'PHPCMS_DB_PASS', 'PHPCMS_DB_NAME'); if ($phpcms_db->connect_error) { // 在生产环境中,建议记录日志而不是直接显示错误 die('PHPCMS 数据库连接失败'); } $phpcms_db->set_charset('utf8'); // 为了方便使用,可以将其设置为全局变量 global $db_PHPCMS; $db_PHPCMS = $phpcms_db; -
在模板或文件中使用
现在你可以在任何地方使用
$db_PHPCMS这个全局变量了。在
{dede:sql}中使用:{dede:sql sql=" $query = \"SELECT id, title FROM phpcms_content LIMIT 5\"; $result = \$db_PHPCMS->query(\$query); while(\$row = \$result->fetch_assoc()){ echo \"<li>{$row['title']}</li>\"; } "}在自定义 PHP 文件中使用:
// 在你的自定义PHP文件中 global $db_PHPCMS; $query = "SELECT id, title FROM phpcms_content LIMIT 5"; $result = $db_PHPCMS->query($query); // ...处理结果...
为什么不推荐?
- 破坏性:直接修改核心文件,升级 DedeCMS 时会被覆盖,需要重新修改。
- 耦合度高:将两个本应独立的系统强耦合在一起,增加了维护难度。
- 安全性:如果数据库配置信息泄露,风险较大。
重要注意事项
- 数据库字符集:两个系统的数据库字符集(如
utf8或gbk)必须保持一致,否则会出现乱码,在连接数据库后,务必执行$db->set_charset('utf8');。 - 数据库表前缀:PHPCMS 和 DedeCMS 都使用表前缀来避免表名冲突,在编写 SQL 时,一定要写对 PHPCMS 的表前缀(如
phpcms_)。 - 数据库权限:用于连接的数据库用户只需要对目标表有
SELECT查询权限即可,不需要INSERT,UPDATE,DELETE等高权限,这更安全。 - 性能考虑:跨数据库查询会增加服务器负载,如果调用非常频繁,建议考虑数据同步或使用 API 等更优的方案,而不是每次都实时查询。
- 安全性:确保你的数据库配置信息(尤其是密码)安全,不要泄露给无关人员。
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
{dede:sql} |
灵活、非侵入性、易于维护 | 代码量稍多 | ★★★★★ (最推荐) |
{dede:php} |
逻辑处理能力强 | 代码耦合度高,不易复用 | ★★★☆☆ |
| 修改源码 | 全局可用,代码简洁 | 破坏性强、耦合度高、升级麻烦 | ★☆☆☆☆ (不推荐) |
对于绝大多数情况,使用方法一 {dede:sql} 是最佳选择,它既满足了功能需求,又保持了 DedeCMS 系统的整洁和可维护性。
