You need to enable JavaScript to run this app. CodeIgniter分类分页显示跨分类混合数据问题排查求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 15:39:03