【问题标题】:Select multiple databases with PDO使用 PDO 选择多个数据库
【发布时间】:2012-07-23 01:27:40
【问题描述】:

我有一个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 文档说如果该文件已经是 必需 它不会再次添加它,你认为这会解决问题?

【问题讨论】:

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

标签: php mysql database pdo


【解决方案1】:

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

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

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

【讨论】:

  • 我希望我在开始我的项目之前对此有所了解,无论如何都非常感谢
【解决方案2】:

根据您对漂亮代码的分析程度,它可能会变得很丑,但是如果 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 语句
【解决方案3】:

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

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

【讨论】:

  • 既然系统会被很多用户使用,不觉得这是个好主意
  • 如果连接是持久的,我认为这不会增加太多开销 - 您测量过性能影响吗? (如果不是,那么只要您的方法是模块化的,以后就很容易调整)。
  • @IsaacGonzalez:嗯,这是一个足够大的话题,可以单独提出一个问题。但是 (a) 使用 ab 或一些类似的测试工具,并且 (b) 如果您还没有将有能力的服务器最大化,那么不要担心。
猜你喜欢
  • 2014-03-18
  • 2014-02-14
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多