codeigniterで複数データベース切替方法について

CodeIgniter PHP

PAK12_10naname500

codeigniterでデータベース切替を行うためにはどうしたらよいかを試行錯誤してみました。こんな方法でいいんだとわかったことを記述します。

データベースの記述箇所は、application/config/database.php だと分かります。記述例は以下のようになります。

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

複数の場合は、以下のようにもうひとつの設定を書き込み、$this->load->database(‘db2’); を読み込むことで2つ目のDBに切り替えることが可能です。

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

ただ、それだと設定ファイルを記述する手間があり少し面倒です。
そこでフレームワーク内のクラスCI_DB_driverに以下の記述があり$this->db_select()の箇所で選択されたデータベースに接続していることが分かります。

function initialize()
{
	// If an existing connection resource is available
	// there is no need to connect and select the database
	if (is_resource($this->conn_id) OR is_object($this->conn_id))
	{
		return TRUE;
	}
	// ----------------------------------------------------------------

	// Connect to the database and set the connection ID
	$this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();

	// No connection resource?  Throw an error
	if ( ! $this->conn_id)
	{
		log_message('error', 'Unable to connect to the database');
		if ($this->db_debug)
		{
			$this->display_error('db_unable_to_connect');
		}
		return FALSE;
	}

	// ----------------------------------------------------------------

	// Select the DB... assuming a database name is specified in the config file
	if ($this->database != '')
	{
		if ( ! $this->db_select())
		{
			log_message('error', 'Unable to select database: '.$this->database);
			if ($this->db_debug)
			{
				$this->display_error('db_unable_to_select', $this->database);
			}
			return FALSE;
		}
		else
		{
			// We've selected the DB. Now we set the character set
			if ( ! $this->db_set_charset($this->char_set, $this->dbcollat))
			{
				return FALSE;
			}
			return TRUE;
		}
	}
	return TRUE;
}

上記のソースコードを参考にヘルパーにdatabase_helper.phpを作成して以下の様な切替関数を作ることでデータベース名を指定することで切り替えができました。

if ( ! function_exists('switch_company_database'))
{
	function switch_company_database($company_name) {
		$CI =& get_instance();
		$CI->db->database = $company_name;
		$CI->db->db_select();
	}
}

関連記事

コメント

カテゴリー

お問い合わせはコチラ!