如何使用 SLIM 在 PHP PDO 中管理多个数据库连接


How to manage multiple database connections in PHP PDO with SLIM

我用 Slim Framework 在 PHP 中构建了一个简单的 RESTful API。我仍然是OOP的新手。我有一条使用 PDO 查询数据库的路由。现在我想用更多路由扩展 API,但我需要连接到不同的数据库。

路由示例:

$app->get('/usados/carrocarias', 'authenticate', function() {
        $response = array();
        $db = new DbHandler();
        // fetching all carrocarias
        $carrocarias = $db->getCarrocariasUsados();
        $response["error"] = false;
        $response["carrocarias"] = array();
        array_walk_recursive($carrocarias, function(&$val) {
            $val = utf8_encode((string)$val);
        });
        array_push($response["carrocarias"], $carrocarias);
        echoRespnse(200, $response, "carrocariasoutput");
    })->via('GET', 'POST');

我的数据库处理程序类:

class DbHandler {
private $conn;
function __construct() {
    require_once dirname(__FILE__) . '/DbConnect.php';
    // opening db connection
    $db = new DbConnect();
    $this->conn = $db->connect();
}
...
}

还有我的数据库连接文件:

class DbConnect {
private $conn;
function __construct() {        
}
/**
 * Establishing database connection
 * @return database connection handler
 */
function connect() {
    include_once dirname(__FILE__) . '/Config.php';
    // Connecting to mysql database
    $this->conn = new PDO("dblib:host=".DB_HOST.";dbname=".DB_NAME.";charset=UTF-8", DB_USERNAME, DB_PASSWORD);
    $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // returing connection resource
    return $this->conn;
}
}

DB_HOST、DB_NAME、DB_USERNAME 和DB_PASSWORD在配置.php中定义。我知道我需要为其他数据库向 Config.php 添加其他凭据。

如何修改我的类和路由,以便传递变量来决定要连接到哪个数据库?

编辑:我正在用我认为的解决方案完成我的问题。至少对我来说,我希望它可以帮助其他菜鸟,不知道这是否是最好的做法。

我的数据库.php

<?php
class DbConnect {
private $conn;
public $selDatabase;
function __construct($strServer) {
    $this->selDatabase = $strServer;
}
/**
 * Establishing database connection
 * @return database connection handler
 */
function connect() {
    include_once dirname(__FILE__) . '/Config.php';
    try {
        switch($this->selDatabase) {
            case 'mysql-localhost':
                $this->conn = new PDO('mysql:host=localhost;dbname=task_manager','root', 'mkecdapl');
                break;
            case 'sqlsrv-localhost':
                $this->conn = new PDO("sqlsrv:server=".DB_HOST.";Database=".DB_NAME_NOVOS.";charset=UTF-8", DB_USERNAME, DB_PASSWORD) or die("failed to connect");
                break;
            case 'dbusados-localhost':
                $this->conn = new PDO("sqlsrv:server=".DB_HOST.";Database=".DB_NAME_USADOS, DB_USERNAME, DB_PASSWORD) or die("failed to connect");
                break;
            case 'dbusados':
                $this->conn = new PDO("dblib:host=".DB_HOST.";dbname=".DB_NAME_USADOS, DB_USERNAME, DB_PASSWORD) or die('failed to connect');
                break;
            case 'dbnovos-localhost':
                $this->conn = new PDO("sqlsrv:server=".DB_HOST.";Database=".DB_NAME_NOVOS, DB_USERNAME, DB_PASSWORD) or die("failed to connect");
                break;
            case 'dbnovos':
                $this->conn = new PDO("dblib:host=".DB_HOST.";dbname=".DB_NAME_NOVOS, DB_USERNAME, DB_PASSWORD) or die('failed to connect');
                break;
            case 'dbnovas':
                $this->conn = new PDO("dblib:host=".DB_HOST.";dbname=".DB_NAME_NOVAS, DB_USERNAME, DB_PASSWORD) or die('failed to connect');
                break;
        }
        $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        // returing connection resource
        return $this->conn;
    } catch (PDOException $e) {
        echo "DataBase Error: ".$e->getCode()." ".$e->getMessage();
    }
}

}

?>

我的DBHandler是一样的。区别在于我的路线。而不是:

$db = new DbHandler();

我调用相同的方法,但使用适当的数据库名称:

$db = new DbHandler('dbusados');

将每个数据库连接添加为$app对象的一个属性。

您可以设置不同的静态方法来返回正确的 PDO 对象。

$app->db1 = DbConnect::getDatabase1;
class DbHandler {
private $conn;
public static function  getDatabase1() {
    require_once dirname(__FILE__) . '/DbConnect_Database1.php';
    // opening db connection
    $db = new DbConnect();
    $db->conn = $db->connect();
    return $db;
}
...
}