Codeigniter переключение между базами данных

Я работаю над платформой Codeigniter, и мне нужно переключаться между различными базами данных для выполнения запросов.

Согласно Codeigniter 3.0.6, я могу использовать $ This-> db-> db_select ( ‘db_name’) динамически менять БД. Но это, похоже, не работает вообще.

Я создал песочницу, как это:

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

br('========Start========');

$dbs = $this->dbutil->list_databases();

foreach ($dbs as $db)
{
if ($db == 'information_schema')
continue;

br($db);

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

if ($this->db->table_exists('users'))
br('Yes');
else
br('No');

echo $this->db->last_query();

//$tables = $this->db->list_tables();
//pp($tables);

br('-----------------------');
}

br('========End========');

Результат: он печатает разные имена БД, но все YES / NO и last_query одинаковы, и он всегда выполняется на первой БД.

Поэтому я создаю еще один тест для ручного переключения БД, и результат тот же.

Я также пытаюсь удалить имя БД в конфиг / database.php и установить $ This-> db-> db_select ( ‘my_third_db_name’) и он всегда запускает запрос на этой третьей БД.

Я что-то пропустил в коде? или здесь есть ошибка?

Спасибо

P / S: Я подключаюсь только к 1 хосту, и на этом хосте много баз данных. И связь работает нормально

1

Решение

Что я делаю:

конфиг / database.php

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'user';
$db['default']['password'] = 'pass';
$db['default']['database'] = 'database1';
$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['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

$db['database2']['hostname'] = "localhost";
$db['database2']['username'] = "user";
$db['database2']['password'] = "pass";
$db['database2']['database'] = "database2";
$db['database2']['dbdriver'] = "mysql";
$db['database2']['dbprefix'] = "";
$db['database2']['pconnect'] = TRUE;
$db['database2']['db_debug'] = TRUE;
$db['database2']['cache_on'] = FALSE;
$db['database2']['cachedir'] = "";
$db['database2']['char_set'] = "utf8";
$db['database2']['dbcollat'] = "utf8_general_ci";

контроллер

$this->load->model('second_model');
$this->second_model->insert("tablename", array("id"=>$value_id, "foo"=>$bar));

second_model.php

function __construct() {
parent::__construct();
//$this->output->enable_profiler(TRUE);
$this->db_2= $this->load->database('database2', TRUE);
}
function insert($table, $data)
{
$this->db_2->insert($table, $data);
if ($this->db_2->affected_rows() == '1')    return TRUE;
else                                    return FALSE;
}
//More functions

Проблема в этом случае в том, что вам нужен файл для каждой базы данных … но, возможно, вы можете изменить … что-то вроде:

function __construct() {
parent::__construct();
}
function insert($table, $data, $db="default")
{
$this->$db = $this->load->database($db, TRUE);
$this->$db->insert($table, $data);
if ($this->$db->affected_rows() == '1')     return TRUE;
else                                    return FALSE;
}
/all CRUD functions you need

И затем, когда вы пытаетесь получить доступ к определенной базе данных, вам нужно только отправить индексное имя файла database.php.

Я надеюсь, что это может помочь вам.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]