使用PDO选择多个数据库

3

我有一个functions.php文件,其中包含一个PDO连接,我用它来访问数据库和所有相关的好东西,就像这个:

$host = "localhost";
$db = "maindatabase";
$adminuser = "admin";
$adminpw = "123456";
global $connection;

$connection = new Connection($host,$adminuser,$adminpw,$db);

我希望你能够为我翻译与IT技术相关的内容。以下是需要翻译的内容:

我需要在每个需要访问数据库的文件中使用这个脚本,但有时我想从 $db = "maindatabase"; 更改为 $db = "anotherdb";。我知道可以通过设置器来实现。

$connection->setDatabase("anotherdb");

但是,由于我在每个文件中都要使用functions.php文件,我不知道它是否会被覆盖回默认值,有人知道如何更改并使其保留吗?
编辑 我已经在代码中将require更改为require_once,因为PHP文档说如果文件已经被required,它不会再次添加,你认为这会解决问题吗?

functions.php是否以任何方式封装了这段代码?如果它在一个类中,你可以在每个页面脚本中调用构造函数,在每种情况下提供数据库名称。无论如何:这就是使用某种框架的原因 - 你可以在父控制器中进行初始化操作,或者在其他初始化部分中进行,具体取决于路由变量或其他可测试条件。 - halfer
是的,实际上我创建了一个名为Connection的类,它就是functions.php所指的那个类。 - Isaac Gonzalez
那不是我的意思。我是说,如果你在其中包含函数并创建一个全局对象,那么你就创建了一个在某些情况下不会使用的连接。最好只运行一次创建连接的代码,具体取决于你要连接的数据库。 - halfer
我只在需要的文件中包含functions.php。此外,用户将在系统开始时选择数据库连接,并且系统将从那个数据库中进行操作。 - Isaac Gonzalez
用户将在系统启动时选择数据库连接,并且从那时起,系统将与该数据库进行交互。- 你的意思是将其存储在会话中?这没问题,但是这仍然没有回答如何安排某些页面访问一个数据库,而其他页面访问另一个数据库的问题。 - halfer
我只需要每个查询都指向系统开始时选择的同一个数据库。 - Isaac Gonzalez
3个回答

2

每个数据库可以建立两个连接

$host = "localhost";
$db1 = "maindatabase";
$db2 = "anotherdb";
$adminuser = "admin";
$adminpw = "123456";
global $connection1, $connection2;

$connection1 = new Connection($host,$adminuser,$adminpw,$db1);
$connection2 = new Connection($host,$adminuser,$adminpw,$db2);

由于系统将被许多用户使用,我不认为这是个好主意。 - Isaac Gonzalez
如果连接是持久的,我认为这不会增加太多额外开销 - 你有测量过性能影响吗?(如果没有,只要你的方法是模块化的,以后调整起来会很容易)。 - halfer
1
@IsaacGonzalez:嗯,这是一个足够大的主题,值得单独提问。但是(a)使用ab或类似的测试工具,以及(b)如果你还没有将能力强大的服务器推到极限,那就不用担心。 - halfer

2
这是全局变量的一个经典问题。程序状态是不可预测的。您无法知道正在引用哪个数据库。
解决方案是适当的依赖注入。
实现一个工厂类来根据需要生成正确的数据库连接,不要使用全局变量。这是正确的解决方案。

我真希望在开始我的项目之前就知道这个,不过还是非常感谢你。 - Isaac Gonzalez

1

如果你在编写漂亮的代码时非常注重细节,那么可能会变得有些混乱。但是,如果MySQL用户可以访问两个数据库,为什么不在查询中指定数据库前缀呢?

例如:

SELECT * FROM maindatabase.tablename WHERE this='that';

在您的其他功能中,请执行以下操作:
SELECT * FROM anotherdb.tablename WHERE this='that';

您也可以进行以下操作:

$database_name = 'maindatabase';
$query = "SELECT * FROM {$database_name}.table";

$database_name = 'anotherdb';
$query = "SELECT * FROM {$database_name}.table";

这样,您可以在需要的地方切换您的$database_name变量。


是的,我不认为这是一个好主意,我的代码中有很多查询,我觉得肯定有更简单的方法来解决这个问题,而不是在每个查询中添加if语句。 - Isaac Gonzalez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接