[英]Codeigniter/PHP check if can connect to database
我想用我的主數據庫備份我的只讀副本(即奴隸)數據庫但這個簡單的布爾我失敗了:
$config['hostname'] = "myReadReplicaDatabase.com";
//...$config['other_stuff']; other config stuff...
$db_obj=$CI->load->database($config, TRUE);
if(!$db_obj){
$config['hostname'] = "myMasterDatabase.com";
$db_obj=$CI->load->database($config, TRUE);
}
在終止我的只讀副本數據庫后,我希望布爾值計算為FALSE
,然后腳本使用我的主數據庫。 不幸的是,我收到了以下PHP錯誤:
Unable to connect to your database server using the provided settings.
Filename: core/Loader.php
我想要的只是連接返回true或false,有人知道如何在Codeigniter中執行此操作嗎?
Codeigniter論壇上的這個帖子回答了我的問題。
關鍵是不要自動初始化數據庫:
$db['xxx']['autoinit'] = FALSE;
要抑制錯誤,您可以設置此項
$db['xxx']['db_debug'] = FALSE;
然后在檢查db狀態的代碼中,檢查initialize()函數的TRUE / FALSE:
$db_obj = $this->database->load('xxx',TRUE);
$connected = $db_obj->initialize();
if (!$connected) {
$db_obj = $this->database->load('yyy',TRUE);
}
這是我的整個配置文件以供將來參考: https : //gist.github.com/3749863 。
基於此處所述: 如果主服務器關閉,Codeigniter將切換到輔助數據庫
您可以檢查conn_id
在$db_obj
if ($db_obj->conn_id === false) {
$config['db_debug'] = true;
$config['hostname'] = "myMasterDatabase.com";
$db_obj=$CI->load->database($config, TRUE);
}
這應該工作。
當您連接到數據庫時,它會在成功條件下返回具有連接ID的連接對象,否則返回false。
您可以檢查它以確保數據庫連接完成。
$db_obj=$CI->load->database($config, TRUE);
if($db_obj->conn_id) {
//do something
} else {
echo 'Unable to connect with database with given db details.';
}
如果您有任何其他問題,試試這個並告訴我。
try {
// do database connection
} catch (Exception $e) {
// DO whatever you want with the $e data, it has a default __toString() so just echo $e if you want errors or default it to connect another db, etc.
echo $e->getMessage();
// Connect to secondary DB.
}
對於那些貶低我的人,你可以做到這一點。 異常將捕獲PDOException。
try {
$pdo = new PDO($dsn, $username, $password);
} catch(PDOException $e) {
mail('webmaster@example.com', 'Database error message', $e->getMessage());
// and finally... attempt your second DB connection.
exit;
}
$readReplica = @$CI->load->database($config, TRUE); // ommit the error
if ($readReplica->call_function('error') !== 0) {
// Failed to connect
}
我不確定錯誤代碼(不確定它的int /字符串)並且附近沒有CI來測試它,但這個原則應該有效
我測試了所有我發現的東西,沒有任何東西,我找到的唯一方法是使用dbutil檢查數據庫是否存在,如下所示:
$this->load->database();
$this->load->dbutil();
// check connection details
if( !$this->dbutil->database_exists('myDatabase'))
echo 'Not connected to a database, or database not exists';
$this->load->database();
print_r($this->db);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.