2016-05-11 4 views
0

Я работаю над каркасом 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========'); 

Результат: он печатает разные имена БД, но ДА/НЕТ и last_query все то же самое, и он всегда работает на первой БД.

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

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

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

Благодаря

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

+0

Имеются ли те же учетные данные (идентификатор пользователя/пароль) для обеих баз данных? – RiggsFolly

+0

Этот вопрос, как ответить на [эта ссылка] (http://stackoverflow.com/questions/36742213/can-we-use-two-database-in-same-view-in-codeigniter/36746362#36746362) – elddenmedio

+0

@ RiggsFolly Im подключается только к 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.

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

+0

Спасибо , потому что моя ситуация в том, что мне нужно запустить отчет, и данные поступают от 100 + dbs в 1 хосте, поэтому я не могу кодировать более 100 имен db следующим образом: D –

+0

Но последний код может решить вашу проблему .... функция insert ($ table, $ data, $ db = "default"); функция getData ($ table, $ fields, $ where, $ db = "default"); etc ... все функции должны иметь $ db ... –

+0

Yup спасибо за это. Тем не менее, я все еще удивляюсь, почему db_select() здесь не работает. Короче говоря, каково фактическое использование этой функции? –

Смежные вопросы