Codeigniter - несколько соединений с базой данных - PullRequest
48 голосов
/ 25 ноября 2011

Мне нужно получить информацию о базе данных 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);

}

это не работает, есть ли другой способ?

Ответы [ 6 ]

75 голосов
/ 25 ноября 2011

Вы должны предоставить вторую информацию о базе данных в `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

15 голосов
/ 30 ноября 2016

Лучший способ - использовать разные группы баз данных.Если вы хотите продолжать использовать основную базу данных как обычно ($ this-> db), просто отключите опцию конфигурации persistent connectionxion для вашей вторичной базы данных.Только постоянная база данных должна работать с постоянным подключением:

Основная база данных

$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());
13 голосов
/ 01 сентября 2013

Используйте это.

$dsn1 = 'mysql://user:password@localhost/db1';
$this->db1 = $this->load->database($dsn1, true);     

$dsn2 = 'mysql://user:password@localhost/db2';
$this->db2= $this->load->database($dsn2, true);     

$dsn3 = 'mysql://user:password@localhost/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);
7 голосов
/ 09 апреля 2018

У меня нормально работает ...

Это база данных по умолчанию:

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

$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(); 
        }

    }
?>
6 голосов
/ 25 ноября 2011

Когда вы смотрите на ваш код, единственное, что я вижу неправильно, это когда вы пытаетесь загрузить вторую базу данных:

$DB2=$this->load->database($config);

Когда вы хотите получить объект базы данных, вы должны передать TRUE во втором аргументе.

Из Codeigniter: руководство пользователя :

При установке второго параметра в TRUE (логическое значение) функция будетвернуть объект базы данных.

Итак, вместо этого ваш код должен быть:

$DB2=$this->load->database($config, TRUE);

Это заставит его работать.

0 голосов
/ 25 июля 2018
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 для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...