当前位置:Gxlcms > PHP教程 > codeigniter中count_all_results()问题

codeigniter中count_all_results()问题

时间:2021-07-01 10:21:17 帮助过:85人阅读

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教程有兴趣的朋友有所帮助。

人气教程排行