單一應用需連接多個資料庫:主庫、訂單庫、查詢庫、日誌庫等,需在執行期動態切換。
所有資料庫群組將 pconnect 設為 FALSE,避免連線衝突:
$db['default']['pconnect'] = FALSE; $db['bbs']['pconnect'] = FALSE; // ... 其他群組同理
// 預設群組
$db['default'] = [
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'main_db',
'dbdriver' => 'mysqli',
'dbprefix' => 'cg_',
'pconnect' => FALSE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'autoinit' => TRUE,
'stricton' => FALSE,
];
// 第二群組:論壇/訂單資料庫
$db['bbs'] = [
'hostname' => '192.168.1.100',
'username' => 'bbs_user',
'password' => 'bbs_pass',
'database' => 'bbs_db',
'dbdriver' => 'mysqli',
'dbprefix' => 'bbs_',
'pconnect' => FALSE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'autoinit' => TRUE,
'stricton' => FALSE,
];
// 可繼續新增 db_query、db_log 等群組...
class Order extends CI_Controller {
public function __construct() {
parent::__construct();
// 載入 'bbs' 群組,第二參數 TRUE 回傳 DB 物件實例
$this->bbs = $this->load->database('bbs', TRUE);
}
public function index() {
// 使用 $this->bbs 操作
$query = $this->bbs->query("SELECT * FROM orders WHERE user_id = 123");
$orders = $query->result();
$this->load->view('order_list', ['orders' => $orders]);
}
}
class Order_model extends CI_Model {
public function __construct() {
parent::__construct();
$this->bbs_db = $this->load->database('bbs', TRUE);
}
public function getUserOrders($userId) {
return $this->bbs_db
->select('id, amount, status, created_at')
->from('orders')
->where('user_id', $userId)
->get()
->result();
}
}
public function switchDb($group) {
// 手動切換預設連線
$this->db = $this->load->database($group, TRUE);
// 後續 $this->db 操作即為新連線
}
| 問題 | 原因 | 解決 |
|---|---|---|
| 多資料庫查詢報錯 | pconnect=TRUE 導致連線共用衝突 | 全部設為 FALSE |
| 模型無法存取 $this->db | 模型預設使用 default 群組 | 建構函數載入需求群組賦值給屬性 |
| 跨資料庫交易 | CI 不支援跨連線交易 | 業務層面補償交易、或合併至同一資料庫 |
| 字元編碼亂碼 | 各群組 char_set 不一致 | 統一設定 utf8/utf8mb4 |
// app/Config/Database.php
public $default = [ ... ];
public $bbs = [
'hostname' => '192.168.1.100',
'database' => 'bbs_db',
'username' => 'bbs_user',
'password' => 'bbs_pass',
'DBDriver' => 'MySQLi',
'DBPrefix' => 'bbs_',
// ...
];
// 控制器使用
$db = \Config\Database::connect('bbs');
$orders = $db->table('orders')->where('user_id', 123)->get()->getResult();
default、orders、logs、analytics。getenv('DB_ORDERS_PASS')。autoinit=FALSE 按需連線。CodeIgniter 透過 database.php 多群組配置與 $this->load->database('group', TRUE) 即可輕鬆實現多資料庫切換,關鍵在於關閉持久連線並妥善管理連線實例。