2016-05-11 20 views
0

Ich arbeite an einem Codeigniterrahmen und ich muss zwischen verschiedenen Datenbanken wechseln, um Abfragen auszuführen.Codeigniter zwischen Datenbanken wechseln

Nach Codeigniter 3.0.6 Dokumentation kann ich $ this-> db-> db_select ('db_name') verwenden, um die DB dynamisch zu ändern. Aber es scheint überhaupt nicht zu funktionieren.

ich eine Sandbox wie diese erstellt habe:

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

    br('========Start========'); 

    $dbs = $this->dbutil->list_databases(); 

    foreach ($dbs as $db) 
    { 
     if ($db == 'information_schema') 
      continue; 

     br($db); 

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

     if ($this->db->table_exists('users')) 
      br('Yes'); 
     else 
      br('No'); 

     echo $this->db->last_query(); 

     //$tables = $this->db->list_tables(); 
     //pp($tables); 

     br('-----------------------'); 
    } 

    br('========End========'); 

Das Ergebnis ist: er druckt verschiedenen DB-Namen, aber die JA/NEIN und last_query sind alle gleich, und es ist immer am ersten DB laufen.

Also erstelle ich einen weiteren Test, um DB manuell zu wechseln und das Ergebnis ist das gleiche.

Ich versuche auch den DB-Namen in Config zu entfernen/database.php und setzten $ this-> db-> db_select ('my_third_db_name') und es immer die Abfrage auf dieser dritten DB laufen.

Habe ich etwas im Code übersehen? oder hier ist ein Fehler?

Dank

P/S: Im nur 1 Host-Anschluss, und es gibt in diesem Wirt viele Datenbanken. Und die Verbindung ist gut funktionieren

+0

Sind die gleichen Anmeldeinformationen (Benutzer-ID/Kennwort) für beide Datenbanken gültig? – RiggsFolly

+0

Diese Frage ist wie beantwortet in [dieser Link] (http://stackoverflow.com/questions/36742213/can-we-use-two-database-in-same-view-in-codeigner/36746362#36746362) – elddenmedio

+0

@ RiggsFolly Im Verbindung mit nur 1 Host und es funktioniert normal. Ich will nur die DB wechseln, nicht der Host –

Antwort

1

Was ich mache:

config/database.php

$db['default']['hostname'] = 'localhost'; 
$db['default']['username'] = 'user'; 
$db['default']['password'] = 'pass'; 
$db['default']['database'] = 'database1'; 
$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['database2']['hostname'] = "localhost"; 
$db['database2']['username'] = "user"; 
$db['database2']['password'] = "pass"; 
$db['database2']['database'] = "database2"; 
$db['database2']['dbdriver'] = "mysql"; 
$db['database2']['dbprefix'] = ""; 
$db['database2']['pconnect'] = TRUE; 
$db['database2']['db_debug'] = TRUE; 
$db['database2']['cache_on'] = FALSE; 
$db['database2']['cachedir'] = ""; 
$db['database2']['char_set'] = "utf8"; 
$db['database2']['dbcollat'] = "utf8_general_ci"; 

-Controller

$this->load->model('second_model'); 
$this->second_model->insert("tablename", array("id"=>$value_id, "foo"=>$bar)); 

second_model.php

function __construct() { 
    parent::__construct(); 
    //$this->output->enable_profiler(TRUE); 
    $this->db_2= $this->load->database('database2', TRUE); 
} 
function insert($table, $data) 
{ 
    $this->db_2->insert($table, $data); 
    if ($this->db_2->affected_rows() == '1') return TRUE; 
    else         return FALSE; 
} 
//More functions 

Das Problem in diesem Fall ist, dass Sie eine Datei für jede Datenbank benötigen ... aber vielleicht können Sie ändern ... so etwas wie:

function __construct() { 
    parent::__construct(); 
} 
function insert($table, $data, $db="default") 
{ 
    $this->$db = $this->load->database($db, TRUE); 
    $this->$db->insert($table, $data); 
    if ($this->$db->affected_rows() == '1')  return TRUE; 
    else         return FALSE; 
} 
/all CRUD functions you need 

Und dann, wenn Sie versuchen, den Zugriff auf Für eine bestimmte Datenbank müssen Sie nur den Indexnamen der Datei "datenbank.php" senden.

Ich hoffe, es kann Ihnen helfen.

+0

Danke , da meine Situation ist, dass ich einen Bericht ausführen muss und die Daten von 100+ dbs in 1 Host kommen, so kann ich nicht mehr als 100 db Namen wie folgt codieren: D –

+0

Aber der letzte Code kann Ihr Problem lösen .... Funktionseinfügung ($ table, $ data, $ db = "default"); Funktion getData ($ table, $ fields, $ wo, $ db = "default"); etc ... alle Funktion muss die $ db ... –

+0

Yup danke dafür haben. Ich frage mich jedoch immer noch, warum db_select() hier nicht funktioniert. Kurz gesagt, was ist die tatsächliche Nutzung dieser Funktion? –

Verwandte Themen