2011-09-29 5 views
1

Désolé si cela est une vraie question de débutant (également un débutant php), mais je ne peux pas le comprendre à partir de la documentation:bases de données de commutation dans CodeIgniter

Je veux être en mesure d'utiliser une base de données par défaut, si Je ne rien d'autre Indique combien, et fonctionne très bien en $ this-> db avec la configuration suivante:

$active_group = 'default'; 
$active_record = TRUE; 

$db['default']['hostname'] = 'localhost'; 
$db['default']['username'] = 'root'; 
$db['default']['password'] = 'root'; 
$db['default']['database'] = 'ion_auth'; 
$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['default']['swap_pre'] = ''; 
$db['default']['autoinit'] = TRUE; 
$db['default']['stricton'] = FALSE; 

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

Mais je veux utiliser la deuxième base de données dans l'un de mes modèles, j'ai donc essayé ceci:

function __contruct() { 
     parent::__construct(); 
     $this->db = $this->load->database('visitorsDB', TRUE); 
    } 

    public function getAllVisitors($paramArr) { 
     //$this->db = $this->load->database('visitorsDB', TRUE); 

Mais ça ne marche pas. Seulement si je décommente la dernière ligne pour que je charge la base de données dans la méthode elle-même fonctionnera. Je ne comprends pas pourquoi. J'ai également essayé de déclarer une nouvelle variable de classe au début de la classe - private $ myDB; - puis en l'instanciant dans le constructeur - $ myDB = $ this-> load-> database ('visitorsDB', TRUE);

Mais cela n'a pas fonctionné non plus. Alors, comment puis-je changer de base de données pour l'ensemble du modèle?

+0

Lorsque vous avez créé une nouvelle propriété dans votre modèle ('myDB' privé $) et a essayé de le mettre de votre constructeur avez-vous fait' $ myDB = ... 'ou' $ this-> myDB = ... '? – birderic

Répondre

1

Je ne recommanderais pas de sélectionner une seconde base de données en écrasant $this->db. Ajoutez simplement une propriété pour votre autre base de données dans le modèle dont vous avez besoin et accédez-y par le biais de ce modèle. Dans votre modèle faire:

private $myDB; 

function __construct() { 
    parent::__construct(); 
    $this->myDB = $this->load->database('visitorsDB', TRUE); 
} 

function getAllVisitors() { 
    return $this->myDB->someMethod(); // Or use active record, etc... 
} 

Je sais que dans votre question, vous avez dit que vous avez fait quelque chose de semblable, mais je ne sais pas si vous l'avez fait correctement. Ce serait la bonne façon de le faire et je ne vois pas pourquoi cela ne fonctionnerait pas si cela était fait de cette façon.

+0

Salut, merci, mais c'est exactement comment je l'ai essayé. Je l'ai même encore essayé, en copiant ton code, juste au cas où j'aurais fait une petite erreur, mais non ... Ça ne marche pas. Dès que j'ai mis l'instruction de chargement dans la fonction, cela fonctionne très bien. C'est comme si la fonction n'a pas accès à la base de données si elle est chargée dans le constructeur, même si j'ai déclaré une variable membre, et j'essaie d'y accéder en utilisant $ this, comme dans votre exemple ... – Anders

+0

le problème était une simple faute de frappe ... construct au lieu de construire dans le constructeur ... Donc même si je l'avais déjà essayé, votre réponse n'a pas eu la faute de frappe donc je créditerai votre réponse :-) – Anders

2

lorsque l'utilisateur de connexion avec la base de données a changé

private $db; 

function __construct() { 
    parent::__construct(); 

    if($this->session->userdata('username') == "swaroop") 
     $this->db = $this->load->database('visitorsDB', TRUE); 
    else 
     $this->db = $this->load->database('default', TRUE); 
} 
Questions connexes