zoukankan      html  css  js  c++  java
  • 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表。

      

      

  • 相关阅读:
    利用SqlBulkCopy快速大批量导入数据
    未能完成操作,无效的FormATETC结构
    JS编码和Asp.net编码
    Sql分页两种常用算法
    Subsonic.exe 生成数据访问层代码,报“从索引 0 处开始,初始化字符串的格式不符合规范”错误解决办法
    Asp.Net,代码实现页面输出缓存
    JS中all Collection 的几个方法
    注册、反注册dll,regsvr32命令详解
    ASP.NET页面传值汇总(Session/Server.Transfer/Query String/Cookie/Application)
    表格导出EXCEL
  • 原文地址:https://www.cnblogs.com/-beyond/p/8677264.html
Copyright © 2011-2022 走看看