【问题标题】:Codeigniter pagination with filters and performance带有过滤器和性能的 Codeigniter 分页
【发布时间】:2012-10-23 20:00:33
【问题描述】:

CI 分页有问题,这是我的代码。

控制器:

$per_page = 20;
$offset = $this->uri->segment(2); 
$results = $this->model_users->search($keywords,$limit = $per_page,$offset,$order_by,$expire,$type = $q_type);

$pagination['per_page'] = $per_page;
$pagination['base_url'] = site_url('users');
$pagination['first_url'] = site_url('users');
$pagination['total_rows'] = $this->db->count_all_results('ci_users');
$pagination['uri_segment'] = 2;
$pagination['first_link'] = 'First';
$pagination['last_link'] = 'Last';
$pagination['next_link']  = false;
$pagination['prev_link']  = false;
$pagination['num_links'] = 6;

$this->pagination->initialize($pagination);


$view['users'] = $results;

型号:

function search($keywords = false,$limit = false,$offset=false,$order_by = false,$expire = false,$type = 'get'){

 if($keywords){
   $this->db->select("*,
           MATCH(".$type.") 
           AGAINST ('".$keywords."' IN BOOLEAN MODE)
            AS _score",false /*important*/);
   $this->db->having('_score > 0');
   $this->db->from('ci_users');
  $this->db->order_by('_score','DESC');
}else{
  $this->db->select('*');
  $this->db->from('ci_users');
}
  if($expire){

  $this->db->order_by('expire_datetime',$expire);
  }
  if($order_by){
  $this->db->order_by("id",$order_by);
 }

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

 $query = $this->db->get();

  return $query->result();

}

当我点击链接 1 或链接 2 时一切正常,当我点击链接 3 时没有返回结果,不明白为什么。

使用此代码进行修复,但对网站性能不利,因为我同时运行 2 个搜索查询:

 $pagination['total_rows'] = count($this->model_propos->search($keywords,false,false,false ,false,$type = $q_type));

感谢谁会帮助我!

【问题讨论】:

  • 因为你正在服用 $pagination['total_rows'] = $this->db->count_all_results('ci_users');这是表格的所有记录,但它应该只根据您的搜索记录匹配关键字的总记录。
  • site_url('users/') 试试 > 并使用 uri_segment= 3
  • 是的。 2 次....你已经在做 2 次查询了。它不会在次数上产生任何影响。
  • 首先,如果网站有数百万用户,那么 CI 不是一个好的选择。第二,学习缓存。
  • 因为涉及很多变量,所以无法直接回答。什么类型的缓存,你将如何缓存,缓存的数量,缓存的设计,你期望有多少用户.... ist 继续。这是一个完全不同的话题。

标签: php codeigniter pagination limit offset


【解决方案1】:

好的,正如已经解释的那样,您正在计算所有记录,然后返回过滤的结果集。您需要做的是只计算过滤后的结果。这很容易通过简单地更改 total_rows 来完成,幸好您的查询已经设置为通过在函数本身中设置默认值来执行此操作。

$pagination['total_rows'] = $this->db->count($this->model_users->search($keywords));

这将只返回结果集的计数,包括您的关键字,这是您希望分页正常工作的实际计数。

您可能需要更改模型中的 if 语句以将完整记录集返回到:

if($keywords && keywords != '')

但你必须测试那个。

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 2019-11-06
    • 2021-02-28
    • 2018-06-02
    • 2018-07-10
    • 2013-06-28
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多