WordPress自定义PHP页面从外部数据库获取内容示例求助
嘿,我明白你的需求了——已经搞定WordPress自定义页面的PHP编写,也有了外部数据库的连接代码,但卡在怎么查询并获取内容对吧?别着急,我给你一套完整的可复用示例,连安全细节都给你考虑到了:
在WordPress自定义页面中从外部数据库查询内容的实现示例
1. 规范的外部数据库连接代码
首先给你一个安全且贴合WordPress环境的连接写法(用mysqli,和WordPress默认数据库驱动一致,减少兼容性问题):
// 从wp-config.php读取配置(推荐把敏感信息存在这里,不要硬编码在页面里) $external_db_host = EXTERNAL_DB_HOST; $external_db_user = EXTERNAL_DB_USER; $external_db_pass = EXTERNAL_DB_PASS; $external_db_name = EXTERNAL_DB_NAME; // 创建外部数据库连接 $external_conn = new mysqli($external_db_host, $external_db_user, $external_db_pass, $external_db_name); // 检查连接状态 if ($external_conn->connect_error) { // 生产环境建议不要直接输出错误信息,可改成记录到日志 die('外部数据库连接失败: ' . $external_conn->connect_error); }
小贴士:你可以在WordPress的
wp-config.php末尾添加以下常量定义,把敏感信息统一管理:// 外部数据库配置 define('EXTERNAL_DB_HOST', 'localhost'); define('EXTERNAL_DB_USER', '你的数据库用户名'); define('EXTERNAL_DB_PASS', '你的数据库密码'); define('EXTERNAL_DB_NAME', '目标数据库名');
2. 安全查询并获取内容的核心代码
这里用预处理语句来防止SQL注入(非常重要!),同时用WordPress的安全函数处理输出,避免XSS攻击:
// 准备查询语句(用?作为占位符,避免直接拼接用户输入) $query = "SELECT id, post_title, post_content FROM external_posts WHERE post_status = ? LIMIT 10"; // 初始化预处理语句 $stmt = $external_conn->prepare($query); if (!$stmt) { die('预处理语句创建失败: ' . $external_conn->error); } // 绑定参数("s"表示参数为字符串类型,其他类型对应i=整数、d=浮点数、b=二进制) $target_status = 'publish'; $stmt->bind_param("s", $target_status); // 执行查询 $stmt->execute(); // 获取结果集 $result = $stmt->get_result(); // 遍历并输出内容 if ($result->num_rows > 0) { echo '<div class="external-posts">'; while ($row = $result->fetch_assoc()) { echo '<article class="post-item">'; // 用esc_html()转义输出,防止XSS echo '<h2>' . esc_html($row['post_title']) . '</h2>'; // 如果内容带HTML,可用wp_kses()允许指定标签,比strip_tags更灵活 echo '<div class="post-content">' . wp_kses($row['post_content'], wp_kses_allowed_html('post')) . '</div>'; echo '</article>'; } echo '</div>'; } else { echo '<p>暂无符合条件的内容</p>'; } // 清理资源(好习惯,避免内存泄漏) $stmt->close(); $external_conn->close();
3. 关键注意事项
- 安全优先:永远不要直接把用户输入(比如GET/POST参数)拼进SQL语句里,一定要用预处理语句
- 输出安全:所有从数据库取出的内容,输出前都要用
esc_html()、wp_kses()等WordPress安全函数处理 - 性能优化:如果需要多次查询,尽量合并成一个查询;查询时只获取需要的字段,不要用
SELECT * - 错误处理:生产环境不要直接输出数据库错误信息,可改用
error_log()把错误记录到服务器日志里
内容的提问来源于stack exchange,提问作者user2070417
相关产品推荐
相关产品推荐

