织梦如何调用外部数据库?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 织梦建站 正文

核心思路

整个过程可以分为三个主要步骤:

织梦调用外部数据库
(图片来源网络,侵删)
  1. 连接数据库:使用PHP代码建立与外部数据库服务器的连接。
  2. 执行查询:编写SQL语句,从外部数据库表中获取所需数据。
  3. 循环输出:在织梦模板文件中,使用PHP的循环语句(如 foreach)遍历查询结果,并将其格式化输出。

详细步骤与代码示例

第一步:获取外部数据库信息

在开始之前,你需要从外部数据库管理员那里获取以下信息:

  • 数据库主机名:通常是 localhost 或一个IP地址。
  • 数据库用户名:有权限访问该数据库的用户名。
  • 数据库密码:对应用户的密码。
  • 数据库名称:你要连接的具体数据库的名字。
  • 表名:你要查询的表的名字。

第二步:在织梦模板文件中编写PHP代码

织梦的模板文件(.htm)默认不支持直接写复杂的PHP代码,最安全、最推荐的方法是使用织梦的自定义标签功能,但为了简单直接,我们可以在模板文件中开启PHP支持。

直接在模板文件中写PHP(简单直接)

  1. 打开你想要显示外部数据的织梦模板文件,index.htmarticle_list.htm 等。
  2. 在你需要显示数据的位置,插入以下PHP代码。

示例代码:

织梦调用外部数据库
(图片来源网络,侵删)
{dede:config name='cfg_phpurl'/}/  <!-- 这句可以不要,直接写PHP -->
<?php
// 1. 数据库配置信息
$external_db_host = '外部数据库主机';
$external_db_user = '外部数据库用户名';
$external_db_pass = '外部数据库密码';
$external_db_name = '外部数据库名';
$external_db_charset = 'utf8'; // 确保编码一致,通常是utf8或utf8mb4
// 2. 创建数据库连接
$conn = mysqli_connect($external_db_host, $external_db_user, $external_db_pass, $external_db_name);
// 检查连接是否成功
if (!$conn) {
    die("连接外部数据库失败: " . mysqli_connect_error());
}
// 设置字符集
mysqli_set_charset($conn, $external_db_charset);
// 3. 编写SQL查询语句
$sql = "SELECT id, title, content, pubdate FROM external_news ORDER BY pubdate DESC LIMIT 10"; // 示例:查询外部新闻表的前10条
// 4. 执行查询
$result = mysqli_query($conn, $sql);
// 5. 循环输出结果
if (mysqli_num_rows($result) > 0) {
    // 开始输出HTML结构
    echo '<ul class="external-news-list">';
    while($row = mysqli_fetch_assoc($result)) {
        // $row 是一个关联数组,包含了当前行的所有字段
        // $row['id'], $row['title']
        $title = htmlspecialchars($row['title']); // 对输出内容进行HTML转义,防止XSS攻击
        $short_content = mb_substr(strip_tags($row['content']), 0, 100, 'utf8') . '...'; // 截取摘要
        $pubdate = date('Y-m-d', strtotime($row['pubdate'])); // 格式化日期
        echo '<li>';
        echo '<h3><a href="#">' . $title . '</a></h3>';
        echo '<p class="summary">' . $short_content . '</p>';
        echo '<span class="date">' . $pubdate . '</span>';
        echo '</li>';
    }
    echo '</ul>';
} else {
    echo "暂无外部数据";
}
// 6. 关闭数据库连接(非常重要!)
mysqli_close($conn);
?>

通过自定义函数/标签(更规范、可复用)

如果你需要在多个地方调用这个外部数据库,或者想让代码更整洁,推荐使用织梦的自定义标签功能。

  1. 创建自定义函数文件: 在你的织梦程序根目录下找到 include/extend.func.php 文件(如果不存在,请创建一个),在这个文件里添加你的函数。

    // 文件路径: /include/extend.func.php
    if(!defined('DEDEINC')) exit('dedecms');
    /**
     * 调用外部数据库的新闻列表
     * @param int $limit 获取条数
     * @return string 返回HTML列表字符串
     */
    function GetExternalNews($limit = 10)
    {
        // 1. 数据库配置信息
        $external_db_host = '外部数据库主机';
        $external_db_user = '外部数据库用户名';
        $external_db_pass = '外部数据库密码';
        $external_db_name = '外部数据库名';
        $external_db_charset = 'utf8';
        // 2. 创建数据库连接
        $conn = mysqli_connect($external_db_host, $external_db_user, $external_db_pass, $external_db_name);
        if (!$conn) {
            return "<div>连接外部数据库失败</div>";
        }
        mysqli_set_charset($conn, $external_db_charset);
        // 3. 编写SQL查询语句
        $sql = "SELECT id, title, content, pubdate FROM external_news ORDER BY pubdate DESC LIMIT " . (int)$limit;
        $result = mysqli_query($conn, $sql);
        // 4. 循环处理结果
        $html = '';
        if (mysqli_num_rows($result) > 0) {
            $html .= '<ul class="external-news-list">';
            while($row = mysqli_fetch_assoc($result)) {
                $title = htmlspecialchars($row['title']);
                $short_content = mb_substr(strip_tags($row['content']), 0, 100, 'utf8') . '...';
                $pubdate = date('Y-m-d', strtotime($row['pubdate']));
                $html .= '<li>';
                $html .= '<h3><a href="#">' . $title . '</a></h3>';
                $html .= '<p class="summary">' . $short_content . '</p>';
                $html .= '<span class="date">' . $pubdate . '</span>';
                $html .= '</li>';
            }
            $html .= '</ul>';
        } else {
            $html = "<div>暂无外部数据</div>";
        }
        // 5. 关闭数据库连接
        mysqli_close($conn);
        return $html;
    }
  2. 在模板中调用自定义函数: 现在你可以直接在任何模板文件中调用这个函数了,代码会非常简洁。

    织梦调用外部数据库
    (图片来源网络,侵删)
    <div class="external-news-section">
        <h2>外部资讯</h2>
        {dede:global name='GetExternalNews'/}  <!-- 调用函数,默认获取10条 -->
        <!-- 或者带参数调用 -->
        {dede:global name='GetExternalNews(5)'/} <!-- 获取5条 -->
    </div>

重要注意事项与最佳实践

  1. 安全性

    • SQL注入:上面的示例使用了 mysqli_query,它本身有一定的防注入能力,但最佳实践是使用 预处理语句,尤其是在处理用户输入时,对于固定SQL,直接写问题不大。
    • XSS攻击:在输出数据到HTML时,务必使用 htmlspecialchars() 函数对内容进行转义,防止恶意脚本注入。
    • 不要硬编码密码:将数据库密码等敏感信息直接写在模板或函数里是不安全的,更好的做法是放在织梦的配置文件 data/common.inc.php 中,或者使用环境变量。
  2. 性能

    • 及时关闭连接:每次查询完成后,使用 mysqli_close() 关闭数据库连接,释放服务器资源。
    • 避免频繁连接:如果页面需要多次查询同一个外部数据库,可以考虑在页面顶部只连接一次,然后在后续操作中复用 $conn 变量(注意作用域)。
    • 查询效率:确保你的SQL查询是高效的,为 ORDER BYWHERE 涉及的字段建立索引。
  3. 编码问题

    • 字符集统一:确保织梦数据库、外部数据库、网页文件(HTML head中的charset)以及PHP代码中设置的字符集(mysqli_set_charset)全部统一为 utf8utf8mb4,否则会出现乱码。
  4. 织梦版本兼容性

    • 上述代码基于PHP的MySQLi扩展,这是目前的主流,如果你的服务器环境非常老旧,还在使用 mysql_ 系列函数,请立即升级,因为 mysql_ 函数在PHP 7.0+中已被完全移除。

通过以上步骤和注意事项,你就可以安全、高效地在织梦CMS中调用外部数据库了,对于复杂的交互,建议采用“方法二”,通过自定义函数来组织代码,这样更具可维护性。

-- 展开阅读全文 --
头像
谁的织梦教程最实用高效?
« 上一篇 04-21
织梦编辑器为何显示空白?
下一篇 » 04-21

相关文章

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

目录[+]