PHPcms如何连接dedecms数据库?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 DEDE建站 正文

核心原理

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

phpcms链接dede数据库
(图片来源网络,侵删)

第一步:获取DedeCMS数据库连接信息

这是最关键的一步,你需要从DedeCMS的配置文件中找到数据库连接的详细信息。

  1. 登录你的服务器,找到DedeCMS的安装目录。
  2. 在该目录下,找到 data 文件夹。
  3. 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: 数据库字符集,如 utf8gbk,确保你的PHP脚本连接时使用正确的字符集,否则会出现乱码。

第二步:在PHPCMS中编写连接和查询代码

你需要在PHPCMS的某个PHP文件中编写代码来连接DedeCMS的数据库,我们会创建一个新的PHP文件来测试,或者集成到某个模块中。

phpcms链接dede数据库
(图片来源网络,侵删)

假设你的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中,你可以将连接和查询逻辑封装成一个函数。

  1. 在PHPCMS中,通常模块的函数放在 phpcms/modules/你的模块名/ 目录下,假设我们创建一个 common 模块来存放公共函数。
  2. phpcms/modules/common/ 目录下创建一个文件,dede.func.php

phpcms/modules/common/dede.func.php 文件内容:

phpcms链接dede数据库
(图片来源网络,侵删)
<?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>";
    }
}
?>

第三步:重要注意事项和最佳实践

  1. 安全性(最重要!)

    • 不要硬编码密码:将数据库密码直接写在PHP文件中是非常危险的,最好的做法是使用环境变量(getenv())或一个独立的、权限受限的配置文件,并且确保这个文件不能被Web直接访问(放在Web根目录之外)。
    • SQL注入:当查询语句包含来自用户输入的数据时,必须进行过滤或使用预处理语句(Prepared Statements)来防止SQL注入,上面的例子是静态查询,相对安全,但一旦涉及动态数据,请务必注意。
  2. 性能

    • 复用连接:数据库连接是昂贵的资源,不要在每次需要查询时都新建一个连接,像方式二那样使用静态变量或单例模式来保持连接,是很好的实践。
    • 查询效率:确保你的SQL查询是高效的,避免使用 SELECT *,并为 WHEREORDER BY 的字段建立索引。
  3. 字符集

    • 编码一致:PHPCMS和DedeCMS的数据库编码(utf8, gbk)必须一致,或者在连接时正确设置。$conn->set_charset($dede_dbcharset); 这行代码至关重要,可以避免大部分乱码问题。
  4. 表前缀

    • 不要忘记:DedeCMS的默认表前缀是 dede_,但很多用户会修改它,在写SQL时,务必使用正确的表前缀,或者像方式二那样用 #@__ 作为占位符,然后在函数中统一替换。
  5. 错误处理

    • 在生产环境中,不要使用 die() 来终止程序并显示错误信息,这会给黑客提供线索,应该将错误信息记录到服务器日志中,并向用户显示一个友好的错误页面。

将PHPCMS链接到DedeCMS数据库,本质上就是一个标准的PHP MySQL数据库连接和操作问题,关键在于:

  1. 正确获取 DedeCMS的数据库连接信息。
  2. 安全、高效地在PHPCMS中建立数据库连接。
  3. 注意细节,特别是字符集和表前缀问题。
  4. 遵循最佳实践,确保代码的安全性和可维护性。

通过以上步骤,你就可以成功地在PHPCMS中调用DedeCMS的数据了。

-- 展开阅读全文 --
头像
织梦上一篇下一篇 标题
« 上一篇 01-04
蓝色html5 dede 模板
下一篇 » 01-04

相关文章

取消
微信二维码
支付宝二维码

目录[+]