Я хотел бы сделать резервную копию моей прочитанной базы данных реплики (т. Е. 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';