选择多个具有PDO的数据库


Select multiple databases with PDO

我有一个functions.php文件,它有一个我用来访问数据库的PDO连接,还有所有好东西,就是这个:

$host = "localhost";
$db = "maindatabase";
$adminuser = "admin";
$adminpw = "123456";
global $connection;
$connection = new Connection($host,$adminuser,$adminpw,$db);

我在每个需要访问数据库的文件上require这个脚本,在某些情况下,我想从$db = "maindatabase";更改为$db = "anotherdb";,我知道我只需要一个setter就可以完成

$connection->setDatabase("anotherdb");

但是,由于我requirefunctions.php文件复制到其他所有文件中,我不知道它是否会将自己覆盖回默认值,有人知道我如何更改它并使它保持不变吗

编辑

我在代码中已经将require更改为require_once,因为PHP文档中说,如果文件已经是必需的,它将不会再添加它,你认为这能解决问题吗?

这是带有全局变量的经典问题。您的程序状态不可预测。你不知道你指的是哪个数据库。

您的解决方案是适当的依赖项注入。

实现一个工厂类以根据需要生成正确的数据库连接,并且不使用全局变量。这是正确的解决方案。

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

$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);

当涉及到漂亮的代码时,它可能会变得很难看,这取决于你的分析水平,但如果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变量。