2011-11-25 7 views
34

Tengo que recuperar una información de la base de datos MySQL de la base de datos master y luego conectarme a esa base de datos y buscar algunos registros.Codeigniter - conexiones múltiples a la base de datos

Quiero decir que sosteniendo una base de datos quiero cargar otra base de datos.

¿Es posible con Codeigniter? En este momento estoy usando las siguientes líneas de código en mi modelo.

function connectDb($credential) 
{ 

    $config['hostname'] = $credential['server']; 
    $config['username'] = $credential['username']; 
    $config['password'] = $credential['password']; 
    $config['database'] = $credential['database']; 
    $config['dbdriver'] = "mysql"; 
    $config['dbprefix'] = ""; 
    $config['pconnect'] = FALSE; 
    $config['db_debug'] = TRUE; 
    $config['cache_on'] = FALSE; 
    $config['cachedir'] = ""; 
    $config['char_set'] = "utf8"; 
    $config['dbcollat'] = "utf8_general_ci"; 

    $DB2=$this->load->database($config); 

    $DB2->db->select('first_name,last_name'); 
    $query = $DB2->db->get('person'); 
    print_r($query); 

} 

no funciona ¿hay alguna otra manera?

+0

Definir "no funciona" –

Respuesta

60

Debe proporcionar la segunda información de la base de datos en `

Normalmente, se debe establecer el grupo application/config/database.php' default base de datos, así:

$db['default']['hostname'] = "localhost"; 
$db['default']['username'] = "root"; 
$db['default']['password'] = ""; 
$db['default']['database'] = "database_name"; 
$db['default']['dbdriver'] = "mysql"; 
$db['default']['dbprefix'] = ""; 
$db['default']['pconnect'] = TRUE; 
$db['default']['db_debug'] = FALSE; 
$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; 

en cuenta que la información de inicio de sesión y la configuración se proporciona en la matriz denominada $db['default'].

A continuación, puede agregar otra base de datos en una nueva matriz, llamémosla 'otherdb'.

$db['otherdb']['hostname'] = "localhost"; 
$db['otherdb']['username'] = "root"; 
$db['otherdb']['password'] = ""; 
$db['otherdb']['database'] = "other_database_name"; 
$db['otherdb']['dbdriver'] = "mysql"; 
$db['otherdb']['dbprefix'] = ""; 
$db['otherdb']['pconnect'] = TRUE; 
$db['otherdb']['db_debug'] = FALSE; 
$db['otherdb']['cache_on'] = FALSE; 
$db['otherdb']['cachedir'] = ""; 
$db['otherdb']['char_set'] = "utf8"; 
$db['otherdb']['dbcollat'] = "utf8_general_ci"; 
$db['otherdb']['swap_pre'] = ""; 
$db['otherdb']['autoinit'] = TRUE; 
$db['otherdb']['stricton'] = FALSE; 

Ahora, para utilizar en realidad la segunda base de datos, usted tiene que enviar la conexión a otro variabel que se puede utilizar en su modelo:

function my_model_method() 
{ 
    $otherdb = $this->load->database('otherdb', TRUE); // the TRUE paramater tells CI that you'd like to return the database object. 

    $query = $otherdb->select('first_name, last_name')->get('person'); 
    var_dump($query); 
} 

Eso debería hacerlo. La documentación para la conexión a múltiples bases de datos se puede encontrar aquí: http://codeigniter.com/user_guide/database/connecting.html

+0

Lo intentaré, gracias – zamebit

6

Mientras busca a su código, lo único que veo mal, es cuando intenta cargar la segunda base de datos:

$DB2=$this->load->database($config); 

Cuando desea recuperar el objeto de la base de datos, debe pasar TRUE en el segundo argumento.

Desde el Codeigniter User Guide:

Al establecer el segundo parámetro a TRUE (booleano) la función se devolver el objeto base de datos.

lo tanto, su código en su lugar debería ser:

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

Eso hará que funcione.

+1

probé lo mismo pero no funcionó :( –

8

Utilice esto.

$dsn1 = 'mysql://user:[email protected]/db1'; 
$this->db1 = $this->load->database($dsn1, true);  

$dsn2 = 'mysql://user:[email protected]/db2'; 
$this->db2= $this->load->database($dsn2, true);  

$dsn3 = 'mysql://user:[email protected]/db3'; 
$this->db3= $this->load->database($dsn3, true); 

Uso

$this->db1 ->insert('tablename', $insert_array); 
$this->db2->insert('tablename', $insert_array); 
$this->db3->insert('tablename', $insert_array); 
+0

Hola señor, ¿podría explicar dónde hemos dado nombre de usuario, contraseña, nombre de la base de datos con un simple ejemplo, podemos dar esta conexión en el modelo contruct. – whoami

+0

user = username, password = contraseña, db1 = databasename, localhost = hostname – Rayiez

9

La mejor manera es utilizar diferentes grupos de base de datos. Si desea seguir usando la base de datos maestra como de costumbre ($ this-> db) simplemente desactive opción de configuración de conexión persistente a su (s) base (s) de datos secundaria (s).base de datos maestra sólo debe trabajar con conexión persistente:

base de datos principal

$db['default']['hostname'] = "localhost"; 
$db['default']['username'] = "root"; 
$db['default']['password'] = ""; 
$db['default']['database'] = "database_name"; 
$db['default']['dbdriver'] = "mysql"; 
$db['default']['dbprefix'] = ""; 
$db['default']['pconnect'] = TRUE; 
$db['default']['db_debug'] = FALSE; 
$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; 

base de datos secundaria (aviso pconnect se establece en false)

$db['otherdb']['hostname'] = "localhost"; 
$db['otherdb']['username'] = "root"; 
$db['otherdb']['password'] = ""; 
$db['otherdb']['database'] = "other_database_name"; 
$db['otherdb']['dbdriver'] = "mysql"; 
$db['otherdb']['dbprefix'] = ""; 
$db['otherdb']['pconnect'] = FALSE; 
$db['otherdb']['db_debug'] = FALSE; 
$db['otherdb']['cache_on'] = FALSE; 
$db['otherdb']['cachedir'] = ""; 
$db['otherdb']['char_set'] = "utf8"; 
$db['otherdb']['dbcollat'] = "utf8_general_ci"; 
$db['otherdb']['swap_pre'] = ""; 
$db['otherdb']['autoinit'] = TRUE; 
$db['otherdb']['stricton'] = FALSE; 

continuación, puede utilizar bases de datos secundarias como objetos base de datos durante el uso de la base de datos master como de costumbre:

// use master dataabse 
$users = $this->db->get('users'); 

// connect to secondary database 
$otherdb = $this->load->database('otherdb', TRUE); 
$stuff = $otherdb->get('struff'); 
$otherdb->insert_batch('users', $users->result_array()); 

// keep using master database as usual, for example insert stuff from other database 
$this->db->insert_batch('stuff', $stuff->result_array()); 
+0

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

Cuestiones relacionadas