如何跨子域名连接多数据库并通过mysqli执行联合SELECT查询
问题解答
首先明确:你没法直接用单条mysqli_query执行这条跨不同子域名数据库的UNION查询,原因很简单:你创建的$connect1和$connect2是两个完全独立的数据库连接,分别对应不同的MySQL服务器(不同子域名一般指向不同的数据库实例)。mysqli_query只能绑定一个连接上下文执行,它没办法同时操作两个独立的连接,而且单个MySQL连接只能访问当前服务器上的数据库,跨服务器的表是没法直接在同一条SQL里引用的。
可行的解决办法
1. 分别查询后在PHP中合并结果
这是最直接也最常用的方案:分别用两个连接执行各自的查询,再把结果在PHP代码里合并。
注意:一定要用预处理语句避免SQL注入,别直接拼接变量到SQL里,你的原始代码存在严重的注入风险。示例代码如下:
// 处理第一个连接的查询 $stmt1 = mysqli_prepare($connect1, "SELECT `Id` FROM `users` WHERE `name` LIKE ?"); $like_str1 = "%{$string_1}%"; mysqli_stmt_bind_param($stmt1, "s", $like_str1); mysqli_stmt_execute($stmt1); $result1 = mysqli_stmt_get_result($stmt1); $ids1 = []; while ($row = mysqli_fetch_assoc($result1)) { $ids1[] = $row['Id']; } // 处理第二个连接的查询 $stmt2 = mysqli_prepare($connect2, "SELECT `Id` FROM `masters` WHERE `name` LIKE ?"); $like_str2 = "%{$string_2}%"; mysqli_stmt_bind_param($stmt2, "s", $like_str2); mysqli_stmt_execute($stmt2); $result2 = mysqli_stmt_get_result($stmt2); $ids2 = []; while ($row = mysqli_fetch_assoc($result2)) { $ids2[] = $row['Id']; } // 合并结果 $all_ids = array_merge($ids1, $ids2);
2. 用Federated引擎映射远程表(可选,有局限性)
如果你的两个MySQL服务器都允许配置,可以把其中一个服务器的表映射成另一个服务器的Federated表,这样就能在单个连接里写UNION查询了。比如在$database1所在的服务器上创建一个映射到$database2.masters的Federated表,之后就能直接在$connect1的上下文里执行跨表的UNION查询。
但这个方案有不少限制:比如Federated引擎默认可能没启用,对表结构有要求,性能也不如本地表,所以一般只在特定场景下使用。
内容的提问来源于stack exchange,提问作者Grvito
相关产品推荐
相关产品推荐

