Maison >développement back-end >tutoriel php >codeigniter中count_all_results()问题

codeigniter中count_all_results()问题

WBOY
WBOYoriginal
2016-08-08 09:26:502579parcourir

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

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Laravel 5 基础(九)- 表单Article suivant:nginx 变量