web-dev-qa-db-ja.com

Codeigniter-複数のデータベースの使用

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

問題は、構成で定義できるのは$active_group、デフォルト、または統計。 CodeIgniterのドキュメントに従い、以下を追加しました。

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

この方法で2番目のデータベースに接続しますが、最初のデータベースへの接続は失われます。すべてのモデルコンストラクターで次の操作を行わずに、2つのデータベースをロードする方法について誰か考えがありますか?

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

よろしく、

ペドロ

32
Pedro

Camachoが述べたようにハックを適用する代わりに、すべての接続に対してdatabase.phpファイルの「pconnect」フラグをFALSEに設定することもできます。

24

Codeigniterにバグがあります。クラスに1行挿入すると、全体が修正されます。元のソースは次のとおりです。 http://koorb.wordpress.com/2007/11/16/codeigniter-connect-to-multiple-databases/

**この修正はPostgreSQLには適用されません

そのサイトがダウンした場合に備えて、コピーを次に示します。

行番号が変更されました。 codeigniterからのバグ修正は次のとおりです。

説明

すべてのデータベース呼び出しが同じデータベースに送信されます(最後の1つが初期化されます)

問題を修正するには、/ system/database/DB_driver.phpのsimple_query関数を変更します。

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

    $this->db_select(); //<-----------------  Added this line
    return $this->_execute($sql);
}

これにより問題が完全に修正されるため、モデルで次のようなことができます

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

現在、codeigniterは持続接続で複数のデータベースに接続できません。そのため、接続の永続化をオフにする必要があります。これを行うことができます。

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

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

フレームワークのDB_driver.phpを変更する問題を修正します。

この関数に$this->db_select();を追加すると、2つのデータベースを操作するときに接続が失われることはありません。

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

    $this->db_select();

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

Session.phpファイルのCI_Session()関数を変更してみてください。

交換

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

これとともに

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

この方法では、すべてのモデルファイルに2つのdbをロードする必要はありませんが、オブジェクトを使用して直接使用します。

$ this-> db1はデフォルトのグループdbにアクセスし、$ this-> db2はdb2グループdbにアクセスします。 (両方のdbグループがdatabase.phpで定義されている必要があります)


スンダ

3
Sundar

同じ接続で異なるデータベースのみを使用する必要がある場合、個別のデータベース構成を作成する必要はありません。必要に応じて、次のように別のデータベースに切り替えることができます。

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

CodeIgbiterユーザーガイド

1
jnermano