同一服務器多數據庫可用 $trueTableName = 'db_name.table_name' 簡單解決。但當數據庫分佈在不同服務器時,必須使用 ThinkPHP 的多數據庫連接特性。
return array(
// 默認數據庫
'DB_TYPE' => 'mysql',
'DB_HOST' => 'localhost',
'DB_NAME' => 'news',
'DB_USER' => 'root',
'DB_PWD' => '123',
'DB_PORT' => '3306',
'DB_PREFIX' => 'news_',
// 額外連接 1:BBS 數據庫
'DB_BBS' => array(
'dbms' => 'mysql',
'username' => 'discuz',
'password' => '123',
'hostname' => 'localhost',
'hostport' => '3306',
'database' => 'discuz'
),
// 額外連接 2:NEWS 數據庫
'DB_NEWS' => array(
'dbms' => 'mysql',
'username' => 'root',
'password' => '123',
'hostname' => 'localhost',
'hostport' => '3306',
'database' => 'news'
)
);
隨後可用 C('DB_BBS')、C('DB_NEWS') 獲取配置數組。
避免默認數據庫無表報錯,使用空模型:
$dao = D(); // 或 new Model();
$dao->addConnect(C('DB_BBS'), 1, true); // 連接編號 1
$dao->addConnect(C('DB_NEWS'), 2, true); // 連接編號 2
關鍵參數說明:
true 表示同為 MySQL注意:ThinkPHP 1.0.3 與 1.0.4 版本 addConnect 參數不同,舊版有三個參數,新版去掉第三個,請根據版本調整。
// 切換到 NEWS 數據庫(編號 2)
$dao->switchConnect(2);
// 必須指定完整表名(含前綴,因連接配置未含前綴)
$dao->table('cdb_members');
// 正常查詢
$map = array('id' => $_GET['id']);
$res = $dao->find($map);
dump($res);
重要: 每次 switchConnect 後必須重新 table() 指定表,否則會出錯。
$dao->switchConnect(1);
$dao->table('another_table');
// 繼續操作...
D(),非空模型易報錯addConnect 參數隨版本變化,手冊未及時更新table() 選表,手冊鮮少提及掌握「配置 → 空模型 → 添加連接 → 切換 → 選表 → 操作」流程,即可靈活應對跨服務器多數據庫場景。根據實際版本微調參數即可。