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
相关产品推荐
相关产品推荐

