You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP项目中如何连接多个数据库?现有代码改造问询

多数据库连接改造方案

1. 更新config.php配置

将多个数据库的连接信息定义为独立常量,避免混淆:

// 数据库1配置
define("DB1_HOST", "localhost");
define("DB1_USER", "user1");
define("DB1_PASS", "pass1");
define("DB1_NAME", "db1");

// 数据库2配置
define("DB2_HOST", "localhost");
define("DB2_USER", "user2");
define("DB2_PASS", "pass2");
define("DB2_NAME", "db2");

// 数据库3配置(可选)
define("DB3_HOST", "localhost");
define("DB3_USER", "user3");
define("DB3_PASS", "pass3");
define("DB3_NAME", "db3");

2. 修改Database类,支持动态切换数据库

改造原类的构造逻辑,让它可以根据参数连接指定数据库,同时兼容原有默认连接逻辑:

include_once(dirname(__FILE__) . '/config.php');

Class Database{
    public $link;
    public $error;

    // 构造函数:支持传入数据库标识(如'1'对应DB1_*)或自定义连接参数
    public function __construct($dbConfig = null){
        if(is_array($dbConfig)){
            // 使用自定义参数连接
            $this->connectDB($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['dbname']);
        } elseif(is_string($dbConfig)){
            // 根据标识加载对应常量配置
            $host = constant("DB{$dbConfig}_HOST");
            $user = constant("DB{$dbConfig}_USER");
            $pass = constant("DB{$dbConfig}_PASS");
            $dbname = constant("DB{$dbConfig}_NAME");
            $this->connectDB($host, $user, $pass, $dbname);
        } else {
            // 默认连接数据库1,兼容原有代码逻辑
            $this->connectDB(DB1_HOST, DB1_USER, DB1_PASS, DB1_NAME);
        }
    }

    private function connectDB($host, $user, $pass, $dbname){
        $this->link = new mysqli($host, $user, $pass, $dbname);
        if(!$this->link){
            $this->error = "连接失败:" . $this->link->connect_error;
            return false;
        }
    }
}

3. 修改Model类,适配多数据库操作

在Model中初始化多个数据库连接,或者在需要的方法中动态创建连接:

include_once(dirname(__FILE__) . '/database.php');

class Model
{
    private $db1; // 数据库1连接实例
    private $db2; // 数据库2连接实例

    public function __construct()
    {
        // 初始化常用数据库连接
        $this->db1 = new Database('1');
        $this->db2 = new Database('2');
        // 如需数据库3,可添加:$this->db3 = new Database('3');
    }

    // 原有操作数据库1的方法,逻辑保持不变
    public function employee_list()
    {
        $query = "SELECT * FROM emp_list ORDER BY emp_id DESC";
        return mysqli_query($this->db1->link, $query);
    }

    // 新增操作数据库2的方法示例
    public function product_list()
    {
        $query = "SELECT * FROM product_list ORDER BY product_id DESC";
        return mysqli_query($this->db2->link, $query);
    }

    // 动态连接数据库3的方法示例
    public function get_third_db_data()
    {
        $db3 = new Database('3');
        if($db3->error){
            echo $db3->error;
            return false;
        }
        $query = "SELECT * FROM third_table";
        return mysqli_query($db3->link, $query);
    }
}

额外优化提示

  • 如果多个数据库共享主机、用户名、密码,可抽离公共常量减少重复配置:
    define("DB_COMMON_HOST", "localhost");
    define("DB_COMMON_USER", "shared_user");
    define("DB_COMMON_PASS", "shared_pass");
    
    define("DB1_NAME", "db1");
    define("DB2_NAME", "db2");
    
  • 脚本结束时mysqli会自动关闭连接,也可在方法中手动调用$this->link->close()释放资源;
  • 建议在所有查询方法中增加连接错误检查,避免执行无效查询。

内容的提问来源于stack exchange,提问作者Liton Mazumder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:47:38