跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

codeigniter中count_all_results()问题

sql语句是这样的:
    $this->db->select('*')->from('mytable'); 
    $count = $this->db->count_all_results() ;
       $config = array(
            'base_url' => '/financing/dayconsumption',
            'total_items' => $count,
            'current_page' => $page,
            'items_per_page' => $this->pagesize,
        );
        $this->pagination2->init($config);
        $this->db->limit($this->pagesize, $this->pagination2->sql_offset);
        $query = $this->db->get();
。。。。。。 运行后报错: A Database Error Occurred Error Number: 1096 No tables used SELECT *   LIMIT 20 Line Number: 330 调试后发现问题出在:
$count = $this->db->count_all_results() ;
这,查看一下count_all_results()的源码:
/** * "Count All Results" query * * Generates a platform-specific query string that counts all records * returned by an Active Record query. * * @param string * @return string */ public function count_all_results($table = '') { if ($table != '') { $this->_track_aliases($table); $this->from($table); } $sql = $this->_compile_select($this->_count_string . $this->_protect_identifiers('numrows')); $query = $this->query($sql); $this->_reset_select(); //注意这里 if ($query->num_rows() == 0) { return 0; } $row = $query->row(); return (int) $row->numrows; }
方法中调用了_reset_select()方法,继续追踪_reset_select()方法:
/** * Resets the active record values. Called by the get() function * * @return void */ protected function _reset_select() { $ar_reset_items = array( 'ar_select' => array(), 'ar_from' => array(), 'ar_join' => array(), 'ar_where' => array(), 'ar_like' => array(), 'ar_groupby' => array(), 'ar_having' => array(), 'ar_orderby' => array(), 'ar_wherein' => array(), 'ar_aliased_tables' => array(), 'ar_no_escape' => array(), 'ar_distinct' => FALSE, 'ar_limit' => FALSE, 'ar_offset' => FALSE, 'ar_order' => FALSE, ); $this->_reset_run($ar_reset_items); }
其实到这里,看注释就能猜到了,active record被重置了。为了确认一下,继续追踪_reset_run(),就在_reset_select()上面:
/** * Resets the active record values. Called by the get() function * * @param array An array of fields to reset * @return void */ protected function _reset_run($ar_reset_items) { foreach ($ar_reset_items as $item => $default_value) { if ( ! in_array($item, $this->ar_store_array)) { $this->$item = $default_value; } } }
果然,active record被重置了!!知道原因了,调用count_all_results()后,会将active record重置,后面的$query就获取不到数据了,解决办法:
$this->db->start_cache(); $this->db->select('*')->from('mytable'); $this->db->stop_cache(); ...... $query = $this->db->get(); $items = $query->result(); $this->db->flush_cache();
以上就介绍了codeigniter中count_all_results()问题,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

相关文章