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表。