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

      

      

  • 相关阅读:
    2016年开源软件评选(截图备份)
    牛逼的思维方式都是倒逼出来的(摘)
    3-22 多态
    3 -20 类
    3 -19标准库
    3 -16 json序列化
    3 -16 内置方法
    迭代对象 和 迭代器
    3 -14 迭代 和列表 生成器
    3-13 装饰器
  • 原文地址:https://www.cnblogs.com/-beyond/p/8677264.html
Copyright © 2020-2023  润新知