当前位置: 首页 > 面试题库 >

如何在PHP中构造跨数据库查询?

涂泰平
2023-03-14
问题内容

在上一集中(如何在MySQL中构建跨数据库查询),我学习了如何在MySQL中构建跨数据库查询。这很好用,但是当我们的英雄尝试在PHP中使用这种新发现的知识时,他发现了他最好的朋友FAIL在等他。

我看了看mysql_select_dbPHP。这似乎暗示着,如果我想将MySQL与PHP结合使用,我有两种选择:

  1. 使用,mysql_select_db但是每次只能使用一个数据库。这是我们当前的设置,将数据库作为名称空间标识符似乎不起作用(它在MySQL Shell中运行良好,因此我知道这与我们的MySQL服务器设置无关)。

  2. 不要使用mysql_select_db。从我看到的一些示例中,这似乎意味着我必须为我进行的每个查询指定数据库。这是有道理的,因为我还不习惯mysql_select_db告诉PHP我想访问什么数据库。这也让我很难过,因为我不想遍历所有代码并为每个查询添加一个数据库名称。

有什么比这更好的了吗?有没有一种方法可以让我在PHP中执行跨数据库MySQL查询,而不必像(2)那样疯狂呢?

澄清
:提出的答案中没有一个实际上允许我执行跨数据库查询。相反,它们允许我分别访问两个不同的DB。我想要一个解决方案,使我能够做一些事情,而SELECT foreign_db.login.username, firstname, lastname from foreign_db.login, user where ...不仅仅是对不同的数据库进行不同的查询。对于它的价值,(2)对我不起作用。


问题答案:

您将需要数据库在同一主机上运行。

如果是这样,您应该能够在收藏夹/默认数据库上使用mysql_select_db并手动指定外部数据库。

$db = mysql_connect($hots, $user, $password);
mysql_select_db('my_most_used_db', $db);

$q = mysql_query("
    SELECT *
    FROM   table_on_default_db a, `another_db`.`table_on_another_db` b
    WHERE  a.id = b.fk_id
");

如果您的数据库在其他主机上运行,​​则将无法直接加入。但是您可以进行2个查询。

$db1 = mysql_connect($host1, $user1, $password1);
$db2 = mysql_connect($host2, $user2, $password2);

$q1 = mysql_query("
    SELECT id
    FROM   table
    WHERE  [..your criteria for db1 here..]
", $db1);
$tmp = array();
while($val = mysql_fetch_array($q1))
    $tmp[] = $val['id'];

$q2 = mysql_query("
    SELECT *
    FROM   table2
    WHERE  fk_id in (".implode(', ', $tmp).")
", $db2);


 类似资料:
  • 问题内容: 我在同一台服务器上有两个数据库。Google给了我一些提示,但是我找不到任何“官方”信息。有人可以指出我的文档来说明如何执行此操作吗?使用PHP的说明也将很有用。谢谢! 问题答案: 我在同一台服务器上有两个数据库。…如何在MySQL中构建跨数据库查询? 通过在表的前面加上适当的数据库名称,可以访问同一MySQL实例上的其他数据库。IE: 记住 查询将使用用于建立连接的身份验证凭据来执行

  • 简介 Laravel 的数据库查询构造器为创建和运行数据库查询提供了一个方便的接口。它能用来执行应用程序中的大部分数据库操作,且可在所有支持的数据库系统上运行。 Laravel 的查询构造器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。因此没有必要清理作为绑定传递的字符串。 获取结果 从数据表中获取所有行 你可以 DB facade 上使用 table 方法来开始查询。该 tab

  • 问题内容: 我在SQLAlchemy中找不到此简单查询的解决方案示例。SQLAlchemy可以替换T-SQL ETL数据吗? 我将此连接用于Windows身份验证: 问题答案: 您需要的是多部分架构名称。如果您使用的是声明式,则可以使用并使用它来执行查询。由于您省略了表或模型定义,因此我将根据您的查询示例生成示例:

  • 问题内容: 可以说我在同一台物理服务器上有两个独立的数据库X和Y。 我的所有查询当前都用完了X。 我发现YI中有一张表想供X使用JOINS。 所以…现在,我在X和Y中都保留了同时需要X和Y的一个表的副本,但是Y中的数据一直在变化,因此该副本很快就过时了。对于这个应用程序来说并不重要,但是对于我现在正在设计的另一个应用程序来说,它根本就行不通。 X现在只需要对Y中的表的读访问权限。 有没有一种有效的

  • 问题内容: 我试图将数据插入到具有表列 (名称,值) 与 并得到以下异常: 另外,我也不能使用本机查询插入记录: 抛出另一个异常: 问题是: 查询字符串有什么问题? 非常感谢。 问题答案: 我解决了这个问题。 根据此, JPA中没有INSERT语句。 但是我可以用本机查询解决这个问题:我错误地放置了一个多余的;在查询末尾,因此可以通过将其删除来解决问题。

  • 问题内容: 如何使用call_user_func_array调用类的构造函数 这是不可能的: 因为如果构造函数具有参数,则 新的 将失败。 约束:我不控制必须实例化的类,也不能修改它们。 不要问我为什么要做这个疯狂的事情,这是一个疯狂的考验。 问题答案: 您可以像这样使用反射: 从PHP 5.6.0起,也可以将运算符用于此目的。