CI框架在控制器中切换读写库和读写库

  CodeIgniter框架版本:3.1.7 ,php版本:5.6.* ,mysql版本:5.6

  在Ci框架中,可以在application/config/database.php中配置多个group,比如:

  下面的代码分别定义了3个group,两个线上group分别是write和read,另外一个是offline的group,注意offline的group的ip和前两个group的ip是不一样的。

<?php
$active_group = 'write';
$query_builder = TRUE;

$db['write'] = array(
	'hostname' => '127.0.0.1',
	'username' => 'root',
	'password' => '123456',
	'database' => 'test',
	'dbdriver' => 'mysqli',
	#......
);

$db['read'] = array(
	'hostname' => '127.0.0.1',
	'username' => 'root',
	'password' => '123456',
	'database' => 'exam',
	'dbdriver' => 'mysqli',
	#.......
);

$db['offline'] = array(
	'hostname' => '192.168.32.91',
	'username' => 'root',
	'password' => 'root',
	'database' => 'demo',
	'dbdriver' => 'mysqli',
	#.......
);

  下面所有实验的前提:已经开启自动载入database。

 Case1: 开启自动载入database,即加载write group

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
class Hello extends CI_Controller {
	public function index(){
		$res = $this->db->query("select * from t1");
		print_r($res->result_array());

	}
}

  访问Hello控制器的index方法,会读数据库配置中的write group中的test.t1表。

 

  Case 2:  不切换数据库连接(连接的仍然是同一台主机上的数据库服务器,只切换数据库)

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
class Hello extends CI_Controller {
	public function index(){
		$this->db->db_select("exam");
		$res = $this->db->query("select * from tt");
		print_r($res->result_array());

	}
}

  上面的代码虽然切换到了exam数据库,但是使用的还是write group的连接,并且$this->db->db_select()的源码中也是使用的mysqli内置的select_db()方法。所以这次读的是 exam.tt表,使用的组是write。

  注意:如果使用db_select切换数据库之后,如果切换的数据库未找到,那么框架仍会使用切换数据库之前的数据库,这里指的是test数据库。

 

  Case 3: 通过切换group来实现切换数据库,注意连接的仍然是同一台主机上的数据库服务器

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
class Hello extends CI_Controller {
	public function index(){
		$this->db = null;
		$this->load->database("read");
		$res = $this->db->query("select * from tt");
		print_r($res->result_array());

	}
}

  上面的代码中先将$this->db设为null,然后在手动载入database。然后访问hello控制器的index方法,最终程序访问的是数据库配置文件中的read group,读取的是exam.tt表。

  注意:如果没有手动将$this->db设为null,那么即使后面手动载入了read group,访问的仍然是 write group,也就是说,程序仍然会去查 test库的tt表,然而我们想要的是去查exam库的tt表。

 

  Case 4:通过切换group实现切换数据库,同时切换了另外一台主机上的数据库服务器:

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
class Hello extends CI_Controller {
	public function index(){
		$this->db = null;
		$this->load->database("offline");
		$res = $this->db->query("select * from off_t");
		print_r($res->result_array());

	}
}

  和上面的一个实验类似,先将$this->db = null,然后选择offline组,所以最终查询的是 offline组的demo库中的off_t表。

  

  

posted @ 2018-03-30 16:56  寻觅beyond  阅读(418)  评论(0编辑  收藏  举报
返回顶部