web-dev-qa-db-ja.com

Codeigniter / PHPはデータベースに接続できるかどうかをチェックします

読み取りレプリカ(つまり、スレーブ)データベースをマスターデータベースでバックアップしたいのですが、この単純なブール値は失敗しました:

$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でこれを行う方法を知っていますか?

5
tim peterson

私の質問は Codeigniterフォーラムのこのスレッド で回答されました。

重要なのは、データベースをnot自動初期化することです。

$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/374986

11
tim peterson

ここで言われたことに基づいて: プライマリがダウンしている場合、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);
}

これはうまくいくはずです。

3
Iberê

データベースに接続すると、成功した状態で接続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.';
}

他に問題がある場合は、これを試して、私に知らせてください。

3
Rajen K Bhagat
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('[email protected]', 'Database error message', $e->getMessage());

    // and finally... attempt your second DB connection.

   exit;

}
2
wesside

見つけたものをすべてテストしましたが、何も機能しません。データベースが存在するかどうかを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';
1
Sirius
$readReplica = @$CI->load->database($config, TRUE); // ommit the error
if ($readReplica->call_function('error') !== 0) {
    // Failed to connect
}

エラーコードについてはよくわかりません(int/stringかどうかはわかりません)。これをテストするためのCIが近くにありませんが、この原則は機能するはずです。

1
karka91
$this->load->database();

print_r($this->db);
0