*

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

お問い合わせはこちら!

関連記事

【Codeigniter】$this->db->where() の第3引数にfalseを指定した時の解説

photo credit: trekkyandy via photopin cc PHPに

記事を読む

PHP初心者はまず関数die()と、print_r()を覚えよう!

photo credit: drewm via photopin cc PHPを触り始めて

記事を読む

PHPカンファレンス2015参加後記(PHP7は何が変わったか?)

PHPカンファレンス2015に行ってきましたので、後記を作成してみました。発表内容についての説明より

記事を読む

codeigniterはセッション情報をクッキー保持するので、複数台構成でもセッション保持してくれる

サービスが拡大していくと、いずれサーバの複数台構成にしなければならなくなる状況になります。

記事を読む

PHP初心者は特に必見!CodeIgniter勉強するなら参考になるサイトまとめ

今でもメインで使っているし、使っていて気持ちのよいPHPフレームワークはCodeIgnite

記事を読む

Laravel 5.1でLaravel Mixを使ってみた

本投稿の目的は、Laravel 5.1でLaravel Mixを利用してSassをCSSへコンパイル

記事を読む

codeigniterでselect文にunionを使いたい

select文でunionを使いたいが、調べてみてると普通にできなさそうなので、librar

記事を読む

codeigniterで、PC版とスマフォ版のテンプレートを自動で振分ける方法

  スマフォ版とPC版のテンプレートを切り替えるために、毎回コントローラでユ

記事を読む

Laravel 5.1 プロジェクト作成(インストール)

本記事ではLaravel 5.1 LTSを利用して開発するためにLaravelをインストールする手順

記事を読む

第104回 PHP勉強会に参加しました!

昨日「第104回 PHP勉強会@東京」に参加し、メイン発表をしました。 本当は発表を聞きに行く

記事を読む

お問い合わせはこちら!

Comment

  1. […] codeigniterで複数データベース切替方法について […]

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

お問い合わせはこちら!

Laravel 5.X Queryログ出力例

Laravel 5.1でQueryログを出力する際のメモです。

no image
Laravelで複数実行したいとき

マルチプロセスで複数に実行してほしい場合は、JOBクラスを利用します。

Laravel5.1 ModelのCollectionからデーターを取得

ModelのCollectionからidのみを取得 <?p

Laravel 5.1でLaravel Mixを使ってみた

本投稿の目的は、Laravel 5.1でLaravel Mixを利用し

Laravel 5.1の自動ログインのお試し!

セッションの保持時間を1分にする 単位:分 デフォルト

→もっと見る

PAGE TOP ↑