php - español - Codeigniter: uso de múltiples bases de datos
uri segment codeigniter 3 (6)
No necesita crear configuraciones de bases 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);
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";
El problema es que solo puedo definir en la configuración $active_group
, default o stats. Seguí la documentación de CodeIgniter y agregué lo siguiente:
$DB2 = $this->load->database(''stats'', TRUE);
De esta manera me conecto a la segunda base de datos, pero pierdo 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
Arreglo 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);
}
En lugar de aplicar el truco como lo menciona Camacho, también puede establecer el indicador ''pconnect'' en el archivo database.php en FALSE para todas las conexiones.
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 solución no se aplica a PostgreSQL
Aquí hay una copia en caso de que el sitio se caiga.
El número de línea ha cambiado. Aquí está la corrección de errores de codeigniter:
iniciar corrección de erroresDescripción
todas las llamadas a la base de datos van a la misma base de datos (la última inicializada)
Para solucionar el problema, cambie la función simple_query en /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);
}
Esto soluciona completamente el problema, por lo que puede hacer cosas como esta en un modelo
$this->legacy_db = $this->load->database(''legacy'', true);
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 forma, no necesita cargar 2 db en todos los archivos de modelo, sino que debe usarlos directamente utilizando objetos.
$ this-> db1 estaría accediendo al grupo predeterminado db y $ this-> db2 estaría accediendo a db2 group db. (ambos grupos db deberían haberse definido en database.php)
Sundar
actualmente, codeigniter no puede conectarse a múltiples bases de datos en una conexión persistente. por lo tanto, debe pasar de la persistencia de sus conexiones. usted puede hacer esto ...
$db[''default''][''pconnect''] = FALSE;
$db[''stats''][''pconnect''] = FALSE;