魏长东

weichangdong

东邪

修复了CI框架STBLOG的一个BUG

前好一阵子,发现了我的这个博客的【日志分类】浏览有问题。每次点击之后,然后分页显示,但是点击第二页就,显示的内容就重复了,简单的说就是【http://swordman.sinaapp.com/index.php/category/php/4】的内容和【http://swordman.sinaapp.com/index.php/category/php/3】内容一样。开始以为是我加了SAE的kvdb缓存的问题,但是吧缓存给关掉了,问题依旧。困扰了我好久,今天龙颜大怒,铁腕杀之。

public function category($slug, $page = 1)
	{
		if(empty($slug) || !is_numeric($page))
		{
			redirect(site_url());
		}
		
		$category = $this->metas_mdl->get_meta_by_slug(trim($slug));
		if(!$category)
		{
			show_error('分类不存在或已被管理员删除');
			exit();
		}
				
		/** 分页参数 */
		$this->_init_pagination($page);
	//	echo $this->_limit, $this->_offset;die('here');在这里调试,打印出来的没看出啥问题
		$this->_posts = $this->posts_mdl->get_posts_by_meta
($slug, 'category', 'post', 'publish', 'posts.*', $this->_limit, $this->_offset)->result();
		$this->_total_count = $this->posts_mdl->get_posts_by_meta
($slug, 'category', 'post', 'publish', 'posts.*', 10000, 0)->num_rows();
	//	print_r($this->_posts);die('--------');在这打印,看出来了是原始数据就有问题,
不是页面显示的问题。然后就定位问题到数据库取数据的。

		if(!empty($this->_posts))
		{
			$this->_prepare_posts();
			
			$this->_apply_pagination(site_url('category/' . $slug) . '/%');
		}

找到了这个函数get_posts_by_meta,然后在找到了./system/database/DB_active_rec.php这个文件的get函数,我把每次的请求的sql语句给打印出来了。然后发现,不管页面传递的是3,还是4,sql是一样的,

public function get($table = '', $limit = null, $offset = null)
	{
		if ($table != '')
		{
			$this->_track_aliases($table);
			$this->from($table);
		}

		if ( ! is_null($limit))
		{
			$this->limit($limit, $offset);
		}

		$sql = $this->_compile_select();
        //echo $sql;在次处打印执行的sql。
		$result = $this->query($sql);
		$this->_reset_select();
		return $result;
	}

难怪出来的内容是一样的呢。到此,问题已经解决了一大半了。

然后在去./application/models/posts_mdl.php这个文件找调用sql执行的函数,get_posts_by_meta。

	public function get_posts_by_meta($meta_slug, $meta_type = 'category',
 $post_type = 'post', $post_status = 'publish', $fields = 'posts.*', $limit = NULL,
 $offset = NULL, $feed_filter = FALSE)
	{
		
//此处省略。。。。。。。
		
		if($limit && is_numeric($limit))
		{
			$this->db->limit(intval($limit));
		}
		
		if($offset && is_numeric($offset))
		{
			$this->db->offset(intval($limit));
//【终于找到问题的所在了,原来在这里传值,写错了!!然后吧$limit改成$offset,大功告成】!
		}
		
		return $this->db->get();
	}

然后问题就解决了。