6

我想用我的主数据库备份我的只读副本(即从属)数据库,但是我做的这个简单的布尔值失败了:

$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

我想要的只是连接返回真或假,有人知道如何在 Codeigniter 中执行此操作吗?

4

8 回答 8

12

我的问题在 Codeigniter 论坛上的这个线程上得到了回答。

关键是不要自动初始化数据库:

$db['xxx']['autoinit'] = FALSE; 

要抑制错误,您可以设置此

$db['xxx']['db_debug'] = FALSE; 

然后在检查数据库状态的代码中,检查 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 。

于 2012-09-20T17:42:48.563 回答
3

根据这里所说的: Codeigniter switch to secondary database if primary is down

您可以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);
}

这应该有效。

于 2012-09-19T15:44:36.513 回答
3

当您连接到数据库时,它在成功的情况下返回带有连接 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.';
}

试试这个,让我知道,如果你有任何其他问题。

于 2013-11-28T13:15:58.473 回答
2
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;

}
于 2012-09-18T19:57:11.820 回答
2

我测试了我发现的所有东西,没有任何东西,我发现的唯一方法是使用 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';
于 2017-02-21T20:11:01.470 回答
1
$readReplica = @$CI->load->database($config, TRUE); // ommit the error
if ($readReplica->call_function('error') !== 0) {
    // Failed to connect
}

我不确定错误代码(不确定它是否是 int/string)并且附近没有 CI 来测试它,但这个原则应该有效

于 2012-09-18T19:58:01.187 回答
1
$this->load->database();

print_r($this->db);
于 2019-08-28T11:12:33.140 回答
0

它为我工作

$config['xxx'] = xx;
        ...    
$config['db_debug'] = false;
$db_obj = @$this->load->database($config,true);
if(!@$db_obj->initialize()){
    echo "Unable to connect database";
    die;
}
于 2021-09-24T13:41:24.427 回答