Codeigniter - множественные подключения к базе данных
Мне нужно получить информацию базы данных MySQL из основной базы данных, а затем подключиться к этой базе данных и получить некоторые записи.
Я имею в виду, что для хранения одной базы данных я хочу загрузить другую базу данных.
Возможно ли это с помощью Codeigniter? Сейчас я использую следующие строки кода в своей модели.
function connectDb($credential)
{
$config['hostname'] = $credential['server'];
$config['username'] = $credential['username'];
$config['password'] = $credential['password'];
$config['database'] = $credential['database'];
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
$config['cache_on'] = FALSE;
$config['cachedir'] = "";
$config['char_set'] = "utf8";
$config['dbcollat'] = "utf8_general_ci";
$DB2=$this->load->database($config);
$DB2->db->select('first_name,last_name');
$query = $DB2->db->get('person');
print_r($query);
}
его не работает, есть ли другой способ?
Ответы
Ответ 1
Вы должны предоставить вторую информацию базы данных в `application/config/database.php'
Обычно вы должны установить группу базы данных default
, например:
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
$db['default']['swap_pre'] = "";
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
Обратите внимание, что данные и настройки входа указаны в массиве с именем $db['default']
.
Затем вы можете добавить другую базу данных в новый массив - пусть назовите ее "otherdb".
$db['otherdb']['hostname'] = "localhost";
$db['otherdb']['username'] = "root";
$db['otherdb']['password'] = "";
$db['otherdb']['database'] = "other_database_name";
$db['otherdb']['dbdriver'] = "mysql";
$db['otherdb']['dbprefix'] = "";
$db['otherdb']['pconnect'] = TRUE;
$db['otherdb']['db_debug'] = FALSE;
$db['otherdb']['cache_on'] = FALSE;
$db['otherdb']['cachedir'] = "";
$db['otherdb']['char_set'] = "utf8";
$db['otherdb']['dbcollat'] = "utf8_general_ci";
$db['otherdb']['swap_pre'] = "";
$db['otherdb']['autoinit'] = TRUE;
$db['otherdb']['stricton'] = FALSE;
Теперь, чтобы фактически использовать вторую базу данных, вам нужно отправить соединение на другую переменную, которую вы можете использовать в своей модели:
function my_model_method()
{
$otherdb = $this->load->database('otherdb', TRUE); // the TRUE paramater tells CI that you'd like to return the database object.
$query = $otherdb->select('first_name, last_name')->get('person');
var_dump($query);
}
Это должно сделать это.
Документацию для подключения к нескольким базам данных можно найти здесь: http://codeigniter.com/user_guide/database/connecting.html
Ответ 2
Лучший способ - использовать разные группы баз данных. Если вы хотите продолжать использовать основную базу данных, как обычно ($ this- > db), просто отключите опцию конфигурации постоянная связь для вашей вторичной базы (ов). Только основная база данных должна работать с постоянной связью:
Основная база данных
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
$db['default']['swap_pre'] = "";
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
Вторичная база данных (уведомление pconnect установлено на false)
$db['otherdb']['hostname'] = "localhost";
$db['otherdb']['username'] = "root";
$db['otherdb']['password'] = "";
$db['otherdb']['database'] = "other_database_name";
$db['otherdb']['dbdriver'] = "mysql";
$db['otherdb']['dbprefix'] = "";
$db['otherdb']['pconnect'] = FALSE;
$db['otherdb']['db_debug'] = FALSE;
$db['otherdb']['cache_on'] = FALSE;
$db['otherdb']['cachedir'] = "";
$db['otherdb']['char_set'] = "utf8";
$db['otherdb']['dbcollat'] = "utf8_general_ci";
$db['otherdb']['swap_pre'] = "";
$db['otherdb']['autoinit'] = TRUE;
$db['otherdb']['stricton'] = FALSE;
Затем вы можете использовать вторичные базы данных как объекты базы данных при использовании основной базы данных, как обычно:
// use master dataabse
$users = $this->db->get('users');
// connect to secondary database
$otherdb = $this->load->database('otherdb', TRUE);
$stuff = $otherdb->get('struff');
$otherdb->insert_batch('users', $users->result_array());
// keep using master database as usual, for example insert stuff from other database
$this->db->insert_batch('stuff', $stuff->result_array());
Ответ 3
Используйте это.
$dsn1 = 'mysql://user:[email protected]/db1';
$this->db1 = $this->load->database($dsn1, true);
$dsn2 = 'mysql://user:[email protected]/db2';
$this->db2= $this->load->database($dsn2, true);
$dsn3 = 'mysql://user:[email protected]/db3';
$this->db3= $this->load->database($dsn3, true);
Использование
$this->db1 ->insert('tablename', $insert_array);
$this->db2->insert('tablename', $insert_array);
$this->db3->insert('tablename', $insert_array);
Ответ 4
Он отлично работает для меня...
Это база данных по умолчанию:
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'mydatabase',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => TRUE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
Добавьте другую базу данных внизу файла database.php
$db['second'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'mysecond',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => TRUE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
В конфигурационном файле autoload.php
$autoload['libraries'] = array('database', 'email', 'session');
База данных по умолчанию работает нормально, автоматически загружая библиотеку базы данных, но загружая вторую базу данных и подключаясь, используя конструктор в модели и контроллере...
<?php
class Seconddb_model extends CI_Model {
function __construct(){
parent::__construct();
//load our second db and put in $db2
$this->db2 = $this->load->database('second', TRUE);
}
public function getsecondUsers(){
$query = $this->db2->get('members');
return $query->result();
}
}
?>
Ответ 5
Когда вы смотрите на свой код, единственное, что я вижу неправильно, - это когда вы пытаетесь загрузить вторую базу данных:
$DB2=$this->load->database($config);
Если вы хотите получить объект базы данных, вы должны передать TRUE во втором аргументе.
Из Руководство пользователя Codeigniter:
Установив второй параметр в TRUE (boolean), функция будет вернуть объект базы данных.
Итак, ваш код должен быть:
$DB2=$this->load->database($config, TRUE);
Это заставило бы его работать.
Ответ 6
If you need to connect to more than one database simultaneously you can do so as follows:
$DB1 = $this->load->database('group_one', TRUE);
$DB2 = $this->load->database('group_two', TRUE);
Примечание. Измените слова "group_one" и "group_two" на конкретные имена групп, к которым вы подключаетесь (или вы можете передать значения подключения, как указано выше).
Установив для второго параметра значение TRUE (логическое значение), функция вернет объект базы данных.
Посетите https://www.codeigniter.com/userguide3/database/connecting.html для получения дополнительной информации.