CodeIgniter分类分页显示跨分类混合数据问题排查求助
问题排查结果
核心原因
分类页对应的get_posts_by_category模型方法逻辑缺失:你已经将分类名$category_name作为参数传入方法,但在查询分类下的全量文章列表时,没有添加对应的分类筛选条件,$this->db->get_where('blogs')没有传入筛选参数,实际执行的是全表博客查询,所以才会出现总条数统计正确(控制器统计总数时加了分类筛选)但列表展示跨分类数据的问题。
修复方案
修改get_posts_by_category模型方法,在列表查询时添加分类筛选条件,同时修正单篇slug查询的字段错误(blogs表不存在category_name字段),修改后的代码如下:
public function get_posts_by_category($category_name, $slug = FALSE, $limit = TRUE, $offset = FALSE){ if($limit){ $this->db->limit($limit, $offset); } if($slug === FALSE){ $this->db->order_by('blogs.post_id', 'DESC'); $this->db->join('category', 'category.category_name = blogs.category'); // 新增分类筛选条件 $query = $this->db->get_where('blogs', ['blogs.category' => $category_name]); return $query->result_array(); } // 修正筛选字段为blogs表的category字段 $query = $this->db->get_where('blogs', array('category' => $category_name,'post_slug' => $slug)); return $query->row_array(); }
额外优化建议
- 分类页统计总条数时,补充
post_active=1的筛选条件,和首页逻辑保持一致,避免统计到未激活的文章:
$rows = $this->db->where(['category'=>$category_name, 'post_active' => 1])->from("blogs")->count_all_results();
- 首页分页逻辑修正:你开启了
$config['use_page_numbers'] = TRUE,uri段取到的是实际页码,需要减去1再计算偏移,否则第一页会跳过前3条数据:
// 原首页page计算逻辑 $page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0; // 修改为 $page = ($this->uri->segment(2)) ? ($this->uri->segment(2) - 1) : 0;
内容的提问来源于stack exchange,提问作者Maruf Sheikh
相关产品推荐
相关产品推荐

