2016-08-12 5 views
0

Ich möchte dynamisch von einer Datenbank auf eine andere wechseln, deren Name dynamisch vom Benutzer angegeben wurde.DB Forge, Code Igniter und dynamische Datenbankauswahl

Hier sind einige significative Fragmente meines Codes:

//database.php 

$active_group = 'default'; 
$query_builder = TRUE; 

$db['default'] = array(
    'dsn' => '', 
    'hostname' => 'localhost', 
    'username' => 'root', 
    'password' => '', 
    'database' => 'firstbase', 
    'dbdriver' => 'mysqli', 
    'dbprefix' => '', 
    'pconnect' => FALSE, 
    'db_debug' => (ENVIRONMENT !== 'production'), 
    'cache_on' => FALSE, 
    'cachedir' => '', 
    'char_set' => 'utf8', 
    'dbcollat' => 'utf8_general_ci', 
    'swap_pre' => '', 
    'encrypt' => FALSE, 
    'compress' => FALSE, 
    'stricton' => FALSE, 
    'failover' => array(), 
    'save_queries' => TRUE 
); 

$db['newbase'] = $db['default']; 

Wie Sie sehen können, ‚NEWBASE‘ ist eine einfache Kopie der Standardkonfiguration

//Install_model Model 
    echo "<BR>Active db :".$this->db->database; 
    $this->createDB($database); 
    $this->db->close(); 

    //now $database is created 

    //load the 'newbase' group and assign it to $this->newDb 
    $this->newDb = $this->load->database('newbase', TRUE); 

    //this will output 'firstbase' 
    echo "<BR>so far, the active db is :".$this->newDb->database; 
    $this->newDb->database=$database; 
    //now this will output the $database string 
    echo "<BR>and now the active db is :".$this->newDb->database; 

Nun, ich dbForge sein wollen in dieser neuen Datenbank verwendet.

Das funktioniert aber ... die Tabelle wird in 'firstbase' erstellt! Und obwohl die geladene Datenbank die zweite ist. Wie kann ich das lösen?

EDIT # 1

Offenbar ist $this->newDb->database=$database; nicht persistent. Wenn die Verbindung geschlossen und dann wieder geöffnet wird, hat $this->newDb->database den Wert, der ursprünglich in der Datenbankkonfigurationsdatei angegeben wurde. Aber das erklärt nicht, warum ich diese Ergebnisse bekomme, da ich die Verbindung nicht schließe.

Wenn ich dies der Konfigurationsdatei hinzufügen: $db['newbase']['database'] = ''; dann bekomme ich eine # 1046 Fehler: Keine Datenbank ausgewählt. Dies bestätigt die Tatsache, dass $this->newDb->database nicht von dbforge verwendet wird, das stattdessen lieber den hartcodierten Wert verwendet.

Antwort

0

Für diejenigen, die an der Antwort interessiert sind, hier ist es.

Der Trick ist ganz einfach: Da ich meine 2 dbs nicht gleichzeitig geöffnet habe, habe ich einfach das $ this verwendet, als würde ich die Standard-db verarbeiten. Nehmen wir an, dass ich in der Konfigurationsdatei eine zweite Gruppe namens 'newbase' mit einem leeren Feld 'Datenbank' habe.

Der Benutzer gibt diesen Namen während des Einrichtungsvorgangs an.

Also, wenn die DB erstellt und die Verbindung geschlossen:

$this->load->database('newbase', True);  
$this->db->database = '$database'; 

Verwenden $this->db->database, um zu wissen, welche db behandelt wird.

dann die $ Linkfields erklären, wie oben, und einfach die dbForge Klasse aufrufen:

$this->load->dbforge(); 
$this->dbforge->add_field($linkfields); 
$this->dbforge->add_key('table_id', TRUE); 
$this->dbforge->create_table('Link'); 
Verwandte Themen