2

我有一个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文件放入每个其他文件中,我不知道它是否会将自己覆盖回默认值,有谁知道我该如何更改它并使其保持不变?

编辑

我在代码中更改requirerequire_once

4

3 回答 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);
于 2012-07-24T17:08:16.873 回答
2

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

您的解决方案是正确的依赖注入。

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

于 2012-07-24T17:24:01.630 回答
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在需要的地方切换你的变量。

于 2012-07-24T17:18:24.677 回答