核心原理
PHPCMS和DedeCMS都是用PHP编写的,它们都使用MySQL(或MariaDB)数据库,只要你知道DedeCMS数据库的连接信息(主机名、数据库名、用户名、密码),你就可以在任何PHP脚本中建立连接,并像操作自己的数据库一样去读取或写入DedeCMS的数据。

(图片来源网络,侵删)
第一步:获取DedeCMS数据库连接信息
这是最关键的一步,你需要从DedeCMS的配置文件中找到数据库连接的详细信息。
- 登录你的服务器,找到DedeCMS的安装目录。
- 在该目录下,找到
data文件夹。 - 在
data文件夹中,找到common.inc.php文件,这个文件是DedeCMS的核心配置文件,包含了所有数据库连接信息。
打开 common.inc.php 文件,你会看到类似下面的代码:
//数据库连接信息 $cfg_dbhost = 'localhost'; // 数据库服务器 $cfg_dbname = 'dedecms_v57'; // 数据库名 $cfg_dbuser = 'root'; // 数据库用户名 $cfg_dbpwd = 'your_password'; // 数据库密码 $cfg_dbprefix = 'dede_'; // 数据库表前缀,非常重要! $cfg_db_language = 'gbk'; // 数据库编码,通常是 gbk 或 utf8
请务必记录下以下四个信息:
$cfg_dbhost: 数据库主机地址,通常是localhost。$cfg_dbname: DedeCMS使用的数据库名称。$cfg_dbuser: 连接数据库的用户名。$cfg_dbpwd: 连接数据库的密码。$cfg_dbprefix: 数据库表前缀,dede_,在后续查询中,你必须带上这个前缀,如SELECT * FROM dede_archives。$cfg_db_language: 数据库字符集,如utf8或gbk,确保你的PHP脚本连接时使用正确的字符集,否则会出现乱码。
第二步:在PHPCMS中编写连接和查询代码
你需要在PHPCMS的某个PHP文件中编写代码来连接DedeCMS的数据库,我们会创建一个新的PHP文件来测试,或者集成到某个模块中。

(图片来源网络,侵删)
假设你的PHPCMS安装在 /var/www/phpcms/,DedeCMS安装在 /var/www/dede/。
直接在PHP文件中编写(简单直接)
你可以创建一个测试文件,比如在PHPCMS根目录下创建 dede_test.php。
<?php
// 1. 引入PHPCMS的数据库连接类(可选,但推荐以保持风格一致)
// define('PHPCMS_PATH', dirname(__FILE__).'/');
// require PHPCMS_PATH.'phpcms/base.php';
// 2. 设置DedeCMS的数据库连接信息(从第一步获取)
$dede_dbhost = 'localhost';
$dede_dbname = 'dedecms_v57';
$dede_dbuser = 'root';
$dede_dbpwd = 'your_password';
$dede_dbprefix = 'dede_';
$dede_dbcharset = 'utf8'; // 或 'gbk'
// 3. 创建数据库连接
// 使用 mysqli 扩展
$conn = new mysqli($dede_dbhost, $dede_dbuser, $dede_dbpwd, $dede_dbname);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接DedeCMS数据库失败: " . $conn->connect_error);
}
// 设置字符集,防止乱码
$conn->set_charset($dede_dbcharset);
echo "成功连接到DedeCMS数据库!<br>";
// 4. 执行查询(示例:查询DedeCMS中的文章)
$sql = "SELECT id, title, typeid FROM {$dede_dbprefix}archives ORDER BY id DESC LIMIT 10";
$result = $conn->query($sql);
// 5. 处理查询结果
if ($result->num_rows > 0) {
echo "<h2>最新的10篇文章:</h2>";
echo "<ul>";
// 输出数据
while($row = $result->fetch_assoc()) {
// $row 是一个关联数组,包含了查询结果
// 注意:typeid是栏目ID,要获取栏目名称需要再去查询 dede_arctype 表
echo "<li>文章ID: " . $row["id"]. " - 标题: " . $row["title"]. " - 栏目ID: " . $row["typeid"]. "</li>";
}
echo "</ul>";
} else {
echo "没有查询到任何文章。";
}
// 6. 关闭连接
$conn->close();
?>
封装成PHPCMS风格的函数(更规范)
为了更好地集成到PHPCMS中,你可以将连接和查询逻辑封装成一个函数。
- 在PHPCMS中,通常模块的函数放在
phpcms/modules/你的模块名/目录下,假设我们创建一个common模块来存放公共函数。 - 在
phpcms/modules/common/目录下创建一个文件,dede.func.php。
phpcms/modules/common/dede.func.php 文件内容:

(图片来源网络,侵删)
<?php
/**
* 连接并查询DedeCMS数据库
* @param string $sql SQL查询语句
* @param string $type 查询类型 'select' 或 'execute'
* @return array|bool 查询返回数组或执行结果
*/
function query_dede($sql, $type = 'select') {
// 从DedeCMS配置文件获取信息(如果DedeCMS和PHPCMS在同一服务器,可以直接引入)
// 或者直接在这里硬编码(不推荐,但简单)
$dede_dbhost = 'localhost';
$dede_dbname = 'dedecms_v57';
$dede_dbuser = 'root';
$dede_dbpwd = 'your_password';
$dede_dbprefix = 'dede_';
$dede_dbcharset = 'utf8';
static $conn = null; // 使用静态变量,避免重复连接
if ($conn === null) {
$conn = new mysqli($dede_dbhost, $dede_dbuser, $dede_dbpwd, $dede_dbname);
if ($conn->connect_error) {
// 在实际项目中,应该记录日志而不是直接输出
die("连接DedeCMS数据库失败: " . $conn->connect_error);
}
$conn->set_charset($dede_dbcharset);
}
// 替换SQL中的表前缀
$sql = str_replace('#@__', $dede_dbprefix, $sql);
$result = $conn->query($sql);
if ($type == 'select') {
$data = [];
if ($result && $result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$data[] = $row;
}
}
return $data;
} else {
// 'execute' 类型,用于插入、更新、删除
return $result;
}
}
如何在PHPCMS的其他文件中使用这个函数:
<?php
// 引入PHPCMS框架
define('PHPCMS_PATH', dirname(__FILE__).'/');
require PHPCMS_PATH.'phpcms/base.php';
// 引入我们刚刚封装的函数
require PHPCMS_PATH.'modules/common/dede.func.php';
// 使用函数查询DedeCMS的文章
$articles = query_dede("SELECT id, title FROM #@__archives ORDER BY id DESC LIMIT 5");
if ($articles) {
echo "<h2>从DedeCMS获取的文章:</h2>";
foreach ($articles as $article) {
echo "ID: {$article['id']}, 标题: {$article['title']}<br>";
}
}
?>
第三步:重要注意事项和最佳实践
-
安全性(最重要!)
- 不要硬编码密码:将数据库密码直接写在PHP文件中是非常危险的,最好的做法是使用环境变量(
getenv())或一个独立的、权限受限的配置文件,并且确保这个文件不能被Web直接访问(放在Web根目录之外)。 - SQL注入:当查询语句包含来自用户输入的数据时,必须进行过滤或使用预处理语句(Prepared Statements)来防止SQL注入,上面的例子是静态查询,相对安全,但一旦涉及动态数据,请务必注意。
- 不要硬编码密码:将数据库密码直接写在PHP文件中是非常危险的,最好的做法是使用环境变量(
-
性能
- 复用连接:数据库连接是昂贵的资源,不要在每次需要查询时都新建一个连接,像方式二那样使用静态变量或单例模式来保持连接,是很好的实践。
- 查询效率:确保你的SQL查询是高效的,避免使用
SELECT *,并为WHERE和ORDER BY的字段建立索引。
-
字符集
- 编码一致:PHPCMS和DedeCMS的数据库编码(
utf8,gbk)必须一致,或者在连接时正确设置。$conn->set_charset($dede_dbcharset);这行代码至关重要,可以避免大部分乱码问题。
- 编码一致:PHPCMS和DedeCMS的数据库编码(
-
表前缀
- 不要忘记:DedeCMS的默认表前缀是
dede_,但很多用户会修改它,在写SQL时,务必使用正确的表前缀,或者像方式二那样用#@__作为占位符,然后在函数中统一替换。
- 不要忘记:DedeCMS的默认表前缀是
-
错误处理
- 在生产环境中,不要使用
die()来终止程序并显示错误信息,这会给黑客提供线索,应该将错误信息记录到服务器日志中,并向用户显示一个友好的错误页面。
- 在生产环境中,不要使用
将PHPCMS链接到DedeCMS数据库,本质上就是一个标准的PHP MySQL数据库连接和操作问题,关键在于:
- 正确获取 DedeCMS的数据库连接信息。
- 安全、高效地在PHPCMS中建立数据库连接。
- 注意细节,特别是字符集和表前缀问题。
- 遵循最佳实践,确保代码的安全性和可维护性。
通过以上步骤,你就可以成功地在PHPCMS中调用DedeCMS的数据了。
