【问题标题】:PHP single method for connecting to multiple databasesPHP连接多个数据库的单一方法
【发布时间】:2015-04-20 16:48:35
【问题描述】:

我的问题是下面的代码如何使用单一方法连接到多个数据库?

配置设置数组:

$GLOBALS['config'] = array(
'mysql' => array(
    'host' => '127.0.0.1',
    'username' => 'root',
    'password' => '',
    'db' => array(
        'db1' => 'database1',
        'db2' => 'database2'
    )
)

连接数据库:

private function __construct() {
    try {
        $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db/db1'), Config::get('mysql/username'), Config::get('mysql/password'));
    } catch(PDOException $e) {
        die($e->getMessage());
    }
}

所以不要将 db1 硬编码到连接中:

dbname=' . Config::get('mysql/db/db1')

如何在此处不指定特定数据库,但允许稍后调用?我正在尝试创建一个可重用的类,该类可以连接到添加到配置数组中的任何数据库。

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

您可以创建多个 pdo 连接:

private function __construct() {
    try {
        $this->_pdo1 = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db/db1'), Config::get('mysql/username'), Config::get('mysql/password'));
        $this->_pdo2 = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db/db2'), Config::get('mysql/username'), Config::get('mysql/password'));
    } catch(PDOException $e) {
        die($e->getMessage());
    }
}

这对于分片非常有用,因为不同的架构可能会变成不同的服务器。

【讨论】:

  • 您好,感谢您的回复。我认为您的回答是最接近我所寻找的答案。我只是想知道这种方法是否会有问题是如果有很多数据库:
  • 大概您需要管理哪些连接指向哪些模式。您可以为单个 PDO 管理器创建一个抽象,将其扩展为每个 DB 的单例,然后使用静态工厂来创建或检索单例。
【解决方案2】:

PDO 不提供切换数据库的功能。

您仍然可以通过将数据库添加到表名的前缀来对另一个数据库运行查询,假设同一个用户可以访问它。

$pdo->query('SELECT * FROM database2.table');

您也可以执行此处确认的使用语句:Switch between multiple database in PDO

$pdo->exec('USE database2');
$pdo->query('SELECT * FROM table');

【讨论】:

  • 我建议不要使用USE,因为您最终需要每次都使用它,以确保您使用的是正确的。您还可以创建多个 PDO 对象。
  • 我同意这一点。前缀(或多个对象)绝对是更好的解决方案。如果您有一个跨越两个数据库的查询,这也是唯一的方法。
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多