web-dev-qa-db-fra.com

Codeigniter - Utilisation de plusieurs bases de données

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

Le problème est que je ne peux définir que dans la configuration un $active_group, par défaut ou stats. J'ai suivi la documentation CodeIgniter et j'ai ajouté ce qui suit:

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

De cette façon, je me connecte à la deuxième base de données, mais je perds la connexion à la première. Quelqu'un a-t-il des idées sur la façon de charger les deux bases de données sans avoir à effectuer les opérations suivantes dans tous les constructeurs de modèles?

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

Cordialement,

Pedro

32
Pedro

Au lieu d'appliquer le hack comme mentionné par Camacho, vous pouvez également définir l'indicateur 'pconnect' dans le fichier database.php sur FALSE pour toutes les connexions.

24
Christian Studer

Il y a un bogue dans codeigniter. L'insertion d'une ligne dans une classe résoudra le tout. Voici la source originale: http://koorb.wordpress.com/2007/11/16/codeigniter-connect-to-multiple-databases/

** Ce correctif ne s'applique pas à PostgreSQL

Voici une copie juste au cas où ce site tomberait en panne.

Le numéro de ligne a changé. Voici la correction de bogue de codeigniter:

La description

tous les appels de base de données vont à la même base de données (le dernier initialisé)

Pour résoudre le problème, modifiez la fonction simple_query dans /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);
}

Cela résout complètement le problème, vous pouvez donc faire des choses comme ça dans un modèle

$this->legacy_db = $this->load->database('legacy', true);
29
mrbinky3000

actuellement, codeigniter ne peut pas se connecter à plusieurs bases de données en connexion persistante. vous devez donc désactiver la persistance de vos connexions. vous pouvez le faire ..

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

$db['stats']['pconnect'] = FALSE;
5
syabac

Je corrige le problème de modification du DB_driver.php sur le framework.

Dans cette fonction, j'ajoute $this->db_select(); et vous ne perdez plus jamais votre connexion lorsque vous travaillez avec 2 bases de données.

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

    $this->db_select();

    return $this->_execute($sql);
}
4
Pedro

Vous pouvez essayer de modifier la fonction CI_Session () dans le fichier session.php.

Remplacer

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

avec ça

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

De cette façon, vous n'avez pas besoin de charger 2 dbs dans tous les fichiers de modèle mais vous devez les utiliser directement à l'aide d'objets.

$ this-> db1 accèderait au groupe de base de données par défaut et $ this-> db2 accèderait au groupe de base de données db2. (les deux groupes de bases de données auraient dû être définis dans database.php)


Sundar

3
Sundar

Vous n'avez pas besoin de créer des configurations de base de données distinctes si vous avez uniquement besoin d'utiliser une base de données différente sur la même connexion. Vous pouvez basculer vers une autre base de données lorsque vous en avez besoin, comme ceci:

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

Guide de l'utilisateur CodeIgbiter

1
jnermano