Codeigniter - Использование нескольких баз данных - PullRequest
32 голосов
/ 11 марта 2009

database.php

$db['default']['hostname'] = "192.168.2.104";
$db['default']['username'] = "webuser";
$db['default']['password'] = "----";
$db['default']['database'] = "vad";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

$db['stats']['hostname'] = "192.168.2.104";
$db['stats']['username'] = "webuser";
$db['stats']['password'] = "---";
$db['stats']['database'] = "vad_stats";
$db['stats']['dbdriver'] = "mysql";
$db['stats']['dbprefix'] = "";
$db['stats']['pconnect'] = TRUE;
$db['stats']['db_debug'] = TRUE;
$db['stats']['cache_on'] = FALSE;
$db['stats']['cachedir'] = "";
$db['stats']['char_set'] = "utf8";
$db['stats']['dbcollat'] = "utf8_general_ci";

Проблема в том, что я могу определить только в конфигурации $active_group, по умолчанию или статистика. Я следовал документации по CodeIgniter и добавил следующее:

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

Таким образом, я подключаюсь ко второй базе данных, но теряю связь с первой. Кто-нибудь есть какие-либо идеи о том, как я могу загрузить две базы данных без необходимости делать следующее во всех моделях конструкторов?

$database1 = $this->load->database('database1', TRUE);
$database2 = $this->load->database('database2', TRUE); 

С уважением,

Pedro

Ответы [ 6 ]

29 голосов
/ 13 января 2011

В codeigniter есть ошибка. Вставка одной строки в класс все исправит. Вот оригинальный источник: http://koorb.wordpress.com/2007/11/16/codeigniter-connect-to-multiple-databases/

** Это исправление не относится к PostgreSQL

Вот копия на случай, если сайт отключится.

Номер строки изменился. Вот исправление ошибки из codeigniter:

начать исправление

Описание

все вызовы базы данных отправляются в одну и ту же базу данных (последний инициализирован)

Чтобы исправить проблему, измените функцию simple_query в /system/database/DB_driver.php:

function simple_query($sql)
{
    if ( ! $this->conn_id)
    {
        $this->initialize();
    }

    $this->db_select(); //<-----------------  Added this line
    return $this->_execute($sql);
}

Это полностью решает проблему, поэтому вы можете делать подобные вещи в модели

$this->legacy_db = $this->load->database('legacy', true);
24 голосов
/ 03 июня 2009

Вместо применения хака, упомянутого Camacho, вы также можете установить флаг 'pconnect' в файле database.php на FALSE для всех соединений.

5 голосов
/ 06 июля 2010

В настоящее время codeigniter не может подключиться к нескольким базам данных при постоянном соединении. Итак, вы должны отказаться от постоянства ваших связей. Вы можете сделать это ..

$db['default']['pconnect'] = FALSE;

$db['stats']['pconnect'] = FALSE;
4 голосов
/ 13 марта 2009

Я исправляю проблему, изменяя DB_driver.php на платформе.

В этой функции я добавляю $this->db_select();, и вы больше никогда не потеряете соединение при работе с 2 базами данных.

function simple_query($sql)
{
    if ( ! $this->conn_id)
    {
        $this->initialize();
    }

    $this->db_select();

    return $this->_execute($sql);
}
3 голосов
/ 14 октября 2010

Вы можете попробовать изменить функцию CI_Session () в файле session.php.

Заменить

$this->CI->load->database();

с этим

$this->CI->db1 = $this->CI->load->database('default', TRUE);
$this->CI->db2 = $this->CI->load->database('db2', TRUE);

Таким образом, вам не нужно загружать 2 дБ во всех файлах модели, но вы должны использовать их напрямую, используя объекты.

$ this-> db1 будет обращаться к группе db по умолчанию, а $ this-> db2 будет обращаться к группе db2. (обе группы БД должны были быть определены в database.php)


Сундара

1 голос
/ 24 ноября 2016

Вам не нужно создавать отдельные конфигурации базы данных, если вам нужно использовать другую базу данных только для одного и того же соединения. При необходимости вы можете переключиться на другую базу данных, например:

$ this-> db-> db_select ($ database2_name);

CodeIgbiter Руководство пользователя

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