CI框架在模型中切换读写库和读写库
如果你想在控制器中切换在application/config/database.php中配置好的数据库group,那么你可以参考这篇博客:CI框架在控制器中切换读写库和读写库
如果你是希望在模型中切换group,那么就不要像在控制器中那样做,比如这样:
<?php
class Hello_model extends CI_Model{
public function getInfo(){
$this->db = null;
$this->load->database("read");
$res = $this->db->query("select * from t1");
print_r($res->result_array());
}
}
?>
一旦调用Hello_model中的getInfo方法的话,程序就会出错,比如报如下信息的错误:
Message: Call to a member function query() on null
这个信息无非就是说$this->db是null,切换group失败了。
咱们来看一下源码是什么样的:位置在system/core/loader.php中,定位到database,如下:
<?php
class CI_Loader {
/**
* @param mixed $params 数据库配置选项
* @param bool $return 是否返回database对象
* @param bool $query_builder 是否开启query builder
*/
public function database($params = '', $return = FALSE, $query_builder = NULL)
{
// 获得CodeIgniter 对象
$CI =& get_instance();
// 检测是否需要加载database对象
if ($return===FALSE && $query_builder===NULL && isset($CI->db) && is_object($CI->db) && ! empty($CI->db->conn_id)){
return FALSE;
}
require_once(BASEPATH.'database/DB.php');
if ($return === TRUE){
return DB($params, $query_builder);
}
//初始化$CI->db,也就是$this->db,防止发生引用错误
$CI->db = '';
// 加载DB类
$CI->db =& DB($params, $query_builder);
return $this;
}
}
观察执行过程:
- Hello_model中的因为$this->db=null,那么执行$this->load->database("read")时,进行到上面的第13行,$CI指向了CodeIgniter对象,
- 但是进行if判断时,前面几个都为true,但是isset($CI->db)为false,因为前面已经设为null了,
- 所以继续下面的require_once,再进行判断,$return为fase,于是跳过,执行$CI->db = '';
- 然后又尝试进行创建db,返回一个引用,注意这里是一个对象实例的引用;而如果上一步的$return为true时,则返回一个db的对象示例。
- 最后返回CI_loader本身。也就是说,不管传不传参数$return,都会返回值。
这个时候,please在Hello_model中尝试打印一下load_database()的返回值
<?php
class Hello_model extends CI_Model{
public function getInfo(){
echo '不传$return,默认为false';
$this->db = null;
print_r($this->load->database("read"));//输出为空 echo '传$return=true';
$this->db = null;
print_r($this->load->database("read",true)); //输出CI_DB_mysqli_driver Object
}
}
上面代码有两次打印,但是只有第二次打印了一个CI_DB_mysqli_driver Object,至于第一次打印为什么是空,我也没搞明白,也没时间去看了。
但是查看打印出来的CI_DB_mysqli_driver Object,就会发现,切换到read group 成功了,也就是说,可以用一个值来接收$this->load->database("read",true)的返回值,
然后,没错,可以使用$this->db来接收,然后其他的和以前没两样。如下:
<?php
class Hello_model extends CI_Model{ public function getInfo(){
$this->db = null;
$this->db = $this->load->database("read",true); //输出CI_DB_mysqli_driver Object
//使用read group中 exam数据库的tt表
$res = $this->db->query("select * from tt");
print_r($res->result_array());
} public function otherInfo(){
//使用write group中 test数据库的t1表
$res = $this->db->query("select * from t1");
print_r($res->result_array());
}
}
CI框架在模型中切换读写库和读写库的更多相关文章
- CI框架在控制器中切换读写库和读写库
CodeIgniter框架版本:3.1.7 ,php版本:5.6.* ,mysql版本:5.6 在Ci框架中,可以在application/config/database.php中配置多个group, ...
- CI框架在辅助函数中使用配置文件中的变量
问题: 现有一个自定义的辅助函数,想要获取配置文件中的配置项(配置文件路径为application/config/config.php) 分析: 辅助函数并不是定义在一个class中,而是很多个可供外 ...
- 二十二、CI框架之模型别名
一.在控制器中调用模型时,可以给模型取别名,之后调用时,调用别名就可以了 二.界面显示如下: 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477 ...
- 去掉CI框架默认url中的index.php
1:.htaccess //放置在根目录下,和入口文件index.php的同级目录<IfModule mod_rewrite.c>RewriteEngine onRewriteCond % ...
- CI框架--数据库Query_Builder中的方法
下面是DB_Query_Builder.php中,各个方法的声明: 选择字段(select) public function select($select = '*', $escape = NULL) ...
- 用CI框架向数据库中实现简单的增删改查
以下代码基于CodeIgniter_2.1.3版 用PHP向数据库中实现简单的增删改查(纯代码)请戳 http://www.cnblogs.com/corvoh/p/4641476.html Code ...
- CI 框架去掉url 中index.php的方法
1 修改 apache 的 httpd.conf 文件 #LoadModule rewrite_module modules/mod_rewrite.so 去掉前面的# 2 找到 你程序目录下的 .h ...
- CI框架中,扩展验证码类。
使用CI框架的朋友,应该都知道CI框架的的验证码辅助函数,不太好用.它需要写入到数据库中,然后再进行比对. 大家在实际项目中,好像不会这样去使用,因为会对数据库造成一定的压力. 所以,我们还是利用se ...
- CI 框架中的自定义路由规则
在 CI 框架中,一个 URL 和它对应的控制器中的类以及类中的方法是一一对应的,如: www.test.com/user/info/zhaoyingnan 其中 user 对应的就是控制器中的 us ...
随机推荐
- Turtle绘制带颜色和字体的图形(Python3)
转载自https://blog.csdn.net/wumenglu1018/article/details/78184930 在Python中有很多编写图形程序的方法,一个简单的启动图形化程序设计的方 ...
- linux上部署SpringBoot项目及遇到的问题
打开sftp步骤, 在显示的已连接的窗口上右键, 选择connect SFTP Session就可以打开文件上传的窗口 从windows上传文件到linux, 首先linux需要先切换到想要保存文件的 ...
- 一个tomcat部署多个应用实例
安装JDK7sudo apt-get install java7-jdk 安装tomcat7 Tomcat7下载地址http://mirror.bjtu.edu.cn/apache/tomcat/to ...
- Windows10反安装报错error code 2502 2503
先找系统TEMP目录,一般为C:\windows\temp,打开这个目录的权限,为这个目录中的User用户添加权限为完全控制,现在再反安装就不会报错了. 注:原因就是因为系统运行时需要用到临时文件的目 ...
- (转)Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源
http://www.ityouknow.com/springboot/2018/05/03/spring-boot-commandLineRunner.html 在我们实际工作中,总会遇到这样需求, ...
- 【BZOJ4298】[ONTAK2015]Bajtocja
[BZOJ4298][ONTAK2015]Bajtocja Description 给定d张无向图,每张图都有n个点.一开始,在任何一张图中都没有任何边.接下来有m次操作,每次操作会给出a,b,k,意 ...
- chrome postman插件手动安装
注:转自 http://blog.csdn.net/u010246789/article/details/51481134 1.下载postman插件,可以自己到网上下载,也可以点击http://do ...
- 渐进式迭代教学法--PHP
渐进式迭代教学法--PHP 目前常见的课程体系大致情况如下: 阶段1:前端基础(html+css+js) 阶段2:PHP&MySQL基础 + 框架 (PHP基本语法,面向对象,mvc,sql基 ...
- ASP.Net Web API 输出缓存 转载 -- Output caching in ASP.NET Web API
一.Nuget安装相关dll Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package ...
- 【CTF杂项】常见文件文件头文件尾格式总结及各类文件头
文件头文件尾总结 JPEG (jpg), 文件头:FFD8FF 文件尾:FF D9PNG (png), 文件头:89504E47 文件尾:AE 42 60 82GIF (gif), 文件头:47494 ...