我有一个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");
但是,由于我require
将functions.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
变量。