我有一个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";
,我知道我可以只用一个二传手
$connection->setDatabase("anotherdb");
但是,由于我require
functions.php
文件到其他所有文件中,我不知道它是否会将自身重写为默认值,是否有人知道如何更改它并使其保留?< BR />
修改
我已在代码中将require
更改为require_once
,因为PHP文档说如果文件已经需要,它将不再添加它,你认为吗?这会解决问题吗?
答案 0 :(得分: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);
答案 1 :(得分:2)
这是全局变量的经典问题。您的程序状态是不可预测的。您无法知道您所指的是哪个数据库。
您的解决方案是正确的依赖注入。
实现工厂类以按需生成正确的数据库连接,并且不使用全局变量。这是正确的解决方案。
答案 2 :(得分: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
变量。