2009-03-11 22 views
31

database.php:CodeIgniter - Korzystanie z wielu baz danych

$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"; 

Zagadnienie to można określić tylko w konfiguracji jeden $active_group Domyślne lub statystyk. Postępowałem zgodnie z dokumentacją CodeIgniter i dodałem:

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

W ten sposób łączę się z drugą bazą danych, ale utracę połączenie z pierwszą. Czy ktoś ma jakieś pomysły na temat, w jaki sposób można załadować dwie bazy danych, bez konieczności wykonywania następujących czynności we wszystkich konstruktorach modeli?

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

Pozdrawiam,

Pedro

Odpowiedz

24

Zamiast stosowania siekać jak wspomniano przez Camacho można również ustawić „pconnect' flagą w pliku database.php FAŁSZ dla wszystkich połączeń.

+0

mam napisać artykuł o Tworzenie wielu połączeń bazy danych w CodeIgniter Applications. Proszę spojrzeć i podać swoje sugestie https://www.cloudways.com/blog/connect-multiple-databases-codeigniter/ –

4

naprawić zmieniającą DB_driver.php sprawie ram problem.

W tej funkcji dodaję $this->db_select(); i już nigdy nie stracisz połączenia podczas pracy z 2 bazami danych.

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

    $this->db_select(); 

    return $this->_execute($sql); 
} 
5

obecnie koderiter nie może połączyć się z wieloma bazami danych w utrwalonym połączeniu. , więc powinieneś włączyć uporczywe połączenia. może można to zrobić ..

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

$db['stats']['pconnect'] = FALSE; 
+0

, abyśmy mogli wymienić nazwę bazy danych w db_select funtion? –

3

Możesz spróbować modyfikacji funkcji CI_Session() w pliku session.php.

Wymień

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

z tym

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

W ten sposób, nie trzeba ładować 2 DBS we wszystkich plikach modelu, ale stosuje je bezpośrednio za pomocą obiektów.

$ this-> db1 byłyby dostępu domyślne grupy db i $ this-> db2 byłyby dostępu grupy DB2 db. (Obie grupy db powinny były zostać określone w database.php)


Sundar

29

Jest to błąd w CodeIgniter. Wstawienie jednej linii do klasy naprawi całość. Oto oryginalne źródło: http://koorb.wordpress.com/2007/11/16/codeigniter-connect-to-multiple-databases/

** Ta poprawka nie ma zastosowania w przypadku PostgreSQL

Oto kopia tylko w przypadku, gdy strona idzie w dół.

Numer linii został zmieniony.Oto fix bug z CodeIgniter:

rozpocząć bugfix

Opis

wszystkich połączeń bazy trafiają do tej samej bazy danych (ostatni zainicjowany)

Aby rozwiązać problem zmienić funkcję simple_query w/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); 
} 

Ten całkowicie rozwiązuje ten problem, dzięki czemu można zrobić rzeczy jak ten w modelu

$this->legacy_db = $this->load->database('legacy', true); 
+0

CodeIgniter nadal wykazuje ten niewybaczalny błąd w październiku 2013 r., A ta poprawka nie działa. –

+0

Jeśli rozpoczynasz nowy projekt, możesz zasugerować użycie FuelPHP. Wielu tych samych ludzi, którzy napisali CodeIgniter, migrowało do tego pełnego ponownego napisania i ponownego przemyślenia CodeIgniter. Jeśli korzystasz ze starszego projektu lub twój klient wymaga CodeIgniter, poprawka ta powinna działać. Ale jeśli znajdziesz inny sposób, aby to naprawić, udostępnij tutaj. Dzięki! – mrbinky3000

+0

Jest to wciąż możliwe dla CI (wersja 2.1.3) i znacznie lepsze niż ręczne wywoływanie db_select() za każdym razem. –

1

Nie trzeba tworzyć osobnych konfiguracji bazy danych, jeśli potrzebna jest tylko inna baza danych dla tego samego połączenia. W razie potrzeby możesz przejść do innej bazy danych:

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

CodeIgbiter User Guide

Powiązane problemy