it-swarm.com.de

Codeigniter - mehrere Datenbankverbindungen

Ich muss eine MySQL-Datenbankinformation von der Master-Datenbank abrufen, mich mit dieser Datenbank verbinden und einige Datensätze abrufen.

Ich meine, dass ich eine andere Datenbank haben möchte.

Ist es mit Codeigniter möglich? Im Moment verwende ich folgende Codezeilen in meinem Modell.

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

}

es funktioniert nicht, gibt es einen anderen Weg?

46
S.Sid

Sie sollten die zweite Datenbankinformation in "application/config/database.php" angeben

Normalerweise würden Sie die Datenbankgruppe default wie folgt festlegen:

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

Beachten Sie, dass die Anmeldeinformationen und -einstellungen im Array $db['default'] bereitgestellt werden.

Sie können dann eine weitere Datenbank in einem neuen Array hinzufügen - nennen wir es "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;

Um die zweite Datenbank tatsächlich verwenden zu können, müssen Sie die Verbindung an eine andere Variable senden, die Sie in Ihrem Modell verwenden können:

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);
}

Das sollte es tun ... Die Dokumentation zum Verbinden mit mehreren Datenbanken finden Sie hier: http://codeigniter.com/user_guide/database/connecting.html

72
Repox

Am besten verwenden Sie verschiedene Datenbankgruppen. Wenn Sie die Master-Datenbank wie gewohnt verwenden möchten ($ this-> db), deaktivieren Sie einfach die Option permanente Verbindung Konfiguration für Ihre sekundären Datenbanken. Nur die Master-Datenbank sollte mit einer dauerhaften Verbindung arbeiten:

Master-Datenbank

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

Sekundäre Datenbank (Hinweis pconnect ist auf false gesetzt)

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

Dann können Sie sekundäre Datenbanken als Datenbankobjekte verwenden, während Sie wie gewohnt die Master-Datenbank verwenden:

// 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());
14
Simmoniz

Benutze das.

$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);   

Verwendungszweck

$this->db1 ->insert('tablename', $insert_array);
$this->db2->insert('tablename', $insert_array);
$this->db3->insert('tablename', $insert_array);
13
Rayiez
This is default database :

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'mydatabase',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => TRUE,
    '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
);

Add another database at the bottom of database.php file
$db['second'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'mysecond',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => TRUE,
    '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
);

In autoload.php config file
$autoload['libraries'] = array('database', 'email', 'session');


The default database is worked fine by autoload the database library but second database load and connect by using constructor in model and controller...
<?php
    class Seconddb_model extends CI_Model {
        function __construct(){
            parent::__construct();
            //load our second db and put in $db2
            $this->db2 = $this->load->database('second', TRUE);
        }

        public function getsecondUsers(){
            $query = $this->db2->get('members');
            return $query->result(); 
        }

    }
?>
6
Mani

Das einzige, was ich falsch sehe, ist, wenn Sie versuchen, die zweite Datenbank zu laden:

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

Wenn Sie das Datenbankobjekt abrufen möchten, müssen Sie im zweiten Argument TRUE übergeben.

Aus dem Codeigniter-Benutzerhandbuch :

Wenn Sie den zweiten Parameter auf TRUE (boolean) setzen, wird die Funktion Das Datenbankobjekt zurückgeben.

Ihr Code sollte also Folgendes sein:

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

Das wird funktionieren.

6
Quetzy Garcia
If you need to connect to more than one database simultaneously you can do so as follows:

$DB1 = $this->load->database('group_one', TRUE);
$DB2 = $this->load->database('group_two', TRUE);

Hinweis: Ändern Sie die Wörter "group_one" und "group_two" in die Gruppennamen, mit denen Sie sich verbinden (oder Sie können die Verbindungswerte wie oben angegeben übergeben).

Wenn Sie den zweiten Parameter auf TRUE (boolean) setzen, gibt die Funktion das Datenbankobjekt zurück.

Besuchen Sie https://www.codeigniter.com/userguide3/database/connecting.html für weitere Informationen.

0
Dhiraj Shrestha