Home  >  Article  >  Backend Development  >  Problem with count_all_results() in codeigniter

Problem with count_all_results() in codeigniter

WBOY
WBOYOriginal
2016-08-08 09:26:502535browse

SQL语句是这样的:

<span>    $this</span><span>-></span><span>db</span><span>-></span><span>select</span><span>(</span><span>'*'</span><span>)-></span><span>from</span><span>(</span><span>'mytable'</span><span>)</span><span>; </span>

<span>    $count </span><span>= </span><span>$this</span><span>-></span><span>db</span><span>-></span><span>count_all_results</span><span>() ;</span>

       $config = array(<br>            'base_url' => '/financing/dayconsumption',<br>            'total_items' => $count,<br>            'current_page' => $page,<br>            'items_per_page' => $this->pagesize,<br>        );<br>        $this->pagination2->init($config);<br>        $this->db->limit($this->pagesize, $this->pagination2->sql_offset);<br>        $query = $this->db->get();

      。。。。。。

运行后报错:

A Database Error Occurred

Error Number: 1096

No tables used

SELECT *   LIMIT 20

Line Number: 330

调试后发现问题出在:<span>$count </span><span>= </span><span>$this</span><span>-></span><span>db</span><span>-></span><span>count_all_results</span><span>() ;</span>这,查看一下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教程有兴趣的朋友有所帮助。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn