2009-03-11 17 views
31

database.php:CodeIgniter - El uso de varias bases de datos

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

La cuestión es que sólo puedo definir en la configuración de uno $active_group, por defecto, o las estadísticas. Seguí la documentación CodeIgniter y añadí lo siguiente:

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

De esta manera conecto a la segunda base de datos, pero que pierda la conexión con la primera. ¿Alguien tiene alguna idea sobre cómo puedo cargar las dos bases de datos sin tener que hacer lo siguiente en todos los constructores de modelos?

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

Saludos,

Pedro

Respuesta

24

En lugar de aplicar el hack como se ha mencionado por Camacho también se puede establecer el 'pconnect'-indicador en el archivo database.php a FALSO para todas las conexiones.

+0

Tengo artículo de escritura sobre crear conexiones de base de datos Diversas aplicaciones de CodeIgniter. Eche un vistazo y proporcione sus sugerencias https://www.cloudways.com/blog/connect-multiple-databases-codeigniter/ –

4

puedo solucionar el problema cambiando el DB_driver.php en el marco.

En esta función agrego $this->db_select(); y nunca pierde su conexión nuevamente cuando trabaja con 2 bases de datos.

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

    $this->db_select(); 

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

Actualmente, codeigniter no se puede conectar a varias bases de datos en una conexión persistente. por lo tanto, debe cambiar la persistencia de sus conexiones. es posible que puede hacer esto ..

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

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

para que podamos mencionar el nombre de la base de datos en la función db_select? –

3

Puede intentar modificar la función CI_Session() en el archivo session.php.

Reemplazar

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

con este

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

De esta manera, no es necesario cargar 2 DBS en todos los archivos de modelo pero no podrán emplear directamente el uso de objetos.

$ this-> DB1 estaría accediendo db grupo predeterminado y $ this-> DB2 estaría accediendo grupo DB DB2. (Db ambos grupos deberían haberse definido en database.php)


Sundar

29

hay un error en CodeIgniter. Insertar una línea en una clase arreglará todo. Aquí está la fuente original: http://koorb.wordpress.com/2007/11/16/codeigniter-connect-to-multiple-databases/

** Esta corrección no se aplica a PostgreSQL

Aquí está una copia por si acaso ese sitio va hacia abajo.

El número de línea ha cambiado.Esta es la corrección de errores de CodeIgniter:

empezar corrección de errores

Descripción

todas las llamadas bases de datos van a la misma base de datos (la última inicializado)

Para solucionar el problema de cambiar la función simple_query en/sistema de base de datos// DB_driver.php:

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

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

esto soluciona por completo el problema, por lo que puede hacer cosas como esta en un modelo

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

CodeIgniter todavía exhibe este error inexcusable en octubre de 2013, y esta solución no funciona. –

+0

Si está comenzando un nuevo proyecto, le sugiero que use FuelPHP. Muchas de las mismas personas que escribieron CodeIgniter migraron a esta completa re-escritura y repensar CodeIgniter. Si está en un proyecto heredado, o su cliente requiere CodeIgniter, esta solución debería funcionar. Pero si encuentra otra forma de solucionarlo, por favor comparta aquí. ¡Gracias! – mrbinky3000

+0

Esto sigue siendo aplicable para CI (versión 2.1.3) y mucho mejor que llamar manualmente a db_select() todo el tiempo. –

1

No necesita crear configuraciones de base de datos separadas si solo necesita usar una base de datos diferente en la misma conexión. Puede cambiar a una base de datos diferente cuando lo necesite, de esta manera:

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

CodeIgbiter User Guide

Cuestiones relacionadas