CI提供了数据文件缓存功能,可在database.php中开启文件缓存,
$db['default']['cache_on'] = TRUE; $db['default']['cachedir'] = './cache/';
缓存的文件存放在APPPATH同级的目录cache下.当然,这可减少数据库查询次数。
当开启了缓存,在项目中使用CI自带的数据备份功能时,出现了此错误
将cache_on设置为FALSE时就没这个问题,所以可以得出,是缓存的问题,怎么处理呢?查看mysql_utility.php中的132行如下所示
$query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table));此query的方法在DB_Driver.php里面,往下阅读,你可以看到这二句
//第277行 if ($this->cache_on == TRUE AND stristr($sql, 'SELECT')){ if ($this->_cache_init()){ $this->load_rdriver(); if (FALSE !== ($cache = $this->CACHE->read($sql))){ return $cache; } } } //第290行 if ($this->cache_on == TRUE AND $this->_cache_init()) { // We'll create a new instance of the result object // only without the platform specific driver since // we can't use it with cached data (the query result // resource ID won't be any good once we've cached the // result object, so we'll have to compile the data // and save it) $CR = new CI_DB_result(); $CR->num_rows = $RES->num_rows(); $CR->result_object = $RES->result_object(); $CR->result_array = $RES->result_array(); // Reset these since cached objects can not utilize resource IDs. $CR->conn_id = NULL; $CR->result_id = NULL; $this->CACHE->write($sql, $CR); }
第一句是从缓存中读取数据,返回缓存数据,第二句自然是写入缓存,注意这里的 result_id,在_backup中使用到.而这里却把它置为了空值,所以当我们从缓存中读取的数据时,它的result_id为空, 就报了上面的异常.
好了,修复方法如下,我这里只是方便,直接在原代码上增加了一个boolean布尔值,当然还是推荐大家继承实现.
1、在DB_driver.php 中的query方法增加了一个boolean字段 ($bool_cache) function query($sql, $binds = FALSE, $return_object = TRUE,$bool_cache=TRUE) 2、将此字段放到读取与写入缓存处 if ($this->cache_on == TRUE AND stristr($sql, 'SELECT') AND $bool_cache==TRUE) if ($this->cache_on == TRUE AND $this->_cache_init() AND $bool_cache==TRUE) 这样我们就能控制是否从缓存中读取数据, 3、修改mysql_utility.php中的_backup的第133行,修改为 $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table),FALSE,TRUE,FALSE); 这里只是将FALSE传递过去,表明此处不用从缓存中读取.
-----------广告区
休闲豆,IT资讯,IT新闻资讯,电影BT下载,高清电影下载,电影下载,单机游戏下载,游戏下载,电子书下载,电子书PDF下载