核心思路
整个过程可以分为三个主要步骤:

(图片来源网络,侵删)
- 连接数据库:使用PHP代码建立与外部数据库服务器的连接。
- 执行查询:编写SQL语句,从外部数据库表中获取所需数据。
- 循环输出:在织梦模板文件中,使用PHP的循环语句(如
foreach)遍历查询结果,并将其格式化输出。
详细步骤与代码示例
第一步:获取外部数据库信息
在开始之前,你需要从外部数据库管理员那里获取以下信息:
- 数据库主机名:通常是
localhost或一个IP地址。 - 数据库用户名:有权限访问该数据库的用户名。
- 数据库密码:对应用户的密码。
- 数据库名称:你要连接的具体数据库的名字。
- 表名:你要查询的表的名字。
第二步:在织梦模板文件中编写PHP代码
织梦的模板文件(.htm)默认不支持直接写复杂的PHP代码,最安全、最推荐的方法是使用织梦的自定义标签功能,但为了简单直接,我们可以在模板文件中开启PHP支持。
直接在模板文件中写PHP(简单直接)
- 打开你想要显示外部数据的织梦模板文件,
index.htm、article_list.htm等。 - 在你需要显示数据的位置,插入以下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);
?>
通过自定义函数/标签(更规范、可复用)
如果你需要在多个地方调用这个外部数据库,或者想让代码更整洁,推荐使用织梦的自定义标签功能。
-
创建自定义函数文件: 在你的织梦程序根目录下找到
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; } -
在模板中调用自定义函数: 现在你可以直接在任何模板文件中调用这个函数了,代码会非常简洁。
(图片来源网络,侵删)<div class="external-news-section"> <h2>外部资讯</h2> {dede:global name='GetExternalNews'/} <!-- 调用函数,默认获取10条 --> <!-- 或者带参数调用 --> {dede:global name='GetExternalNews(5)'/} <!-- 获取5条 --> </div>
重要注意事项与最佳实践
-
安全性:
- SQL注入:上面的示例使用了
mysqli_query,它本身有一定的防注入能力,但最佳实践是使用 预处理语句,尤其是在处理用户输入时,对于固定SQL,直接写问题不大。 - XSS攻击:在输出数据到HTML时,务必使用
htmlspecialchars()函数对内容进行转义,防止恶意脚本注入。 - 不要硬编码密码:将数据库密码等敏感信息直接写在模板或函数里是不安全的,更好的做法是放在织梦的配置文件
data/common.inc.php中,或者使用环境变量。
- SQL注入:上面的示例使用了
-
性能:
- 及时关闭连接:每次查询完成后,使用
mysqli_close()关闭数据库连接,释放服务器资源。 - 避免频繁连接:如果页面需要多次查询同一个外部数据库,可以考虑在页面顶部只连接一次,然后在后续操作中复用
$conn变量(注意作用域)。 - 查询效率:确保你的SQL查询是高效的,为
ORDER BY和WHERE涉及的字段建立索引。
- 及时关闭连接:每次查询完成后,使用
-
编码问题:
- 字符集统一:确保织梦数据库、外部数据库、网页文件(HTML head中的charset)以及PHP代码中设置的字符集(
mysqli_set_charset)全部统一为utf8或utf8mb4,否则会出现乱码。
- 字符集统一:确保织梦数据库、外部数据库、网页文件(HTML head中的charset)以及PHP代码中设置的字符集(
-
织梦版本兼容性:
- 上述代码基于PHP的MySQLi扩展,这是目前的主流,如果你的服务器环境非常老旧,还在使用
mysql_系列函数,请立即升级,因为mysql_函数在PHP 7.0+中已被完全移除。
- 上述代码基于PHP的MySQLi扩展,这是目前的主流,如果你的服务器环境非常老旧,还在使用
通过以上步骤和注意事项,你就可以安全、高效地在织梦CMS中调用外部数据库了,对于复杂的交互,建议采用“方法二”,通过自定义函数来组织代码,这样更具可维护性。
