Codeigniter / PHP проверить, можете ли подключиться к базе данных

Я хотел бы сделать резервную копию моей прочитанной базы данных реплики (т. Е. Slave) с моей основной базой данных, но это простое логическое значение:

$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, проверьте TRUE / FALSE функции initialize ():

 $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 .

 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; } 

На основании сказанного здесь: 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); } 

Это должно сработать.

когда вы подключаетесь к базе данных, он возвращает объект соединения с идентификатором соединения в успешном состоянии, в противном случае возвращает 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.'; } 

попробуйте это и сообщите мне, если у вас есть другая проблема.

 $readReplica = @$CI->load->database($config, TRUE); // ommit the error if ($readReplica->call_function('error') !== 0) { // Failed to connect } 

Я не уверен относительно кода ошибки (не уверен, что его int / string) и не имеет 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';