如何在MySQL数据库中按分页获取指定数量记录?CodeIgniter项目优化需求
嘿,这个场景我太熟了!在CodeIgniter里实现分页其实很简单,官方自带的分页类就能搞定大部分需求,当然也可以手动实现来满足自定义场景,我给你两种方案参考:
方案一:使用CodeIgniter官方分页类(推荐)
CodeIgniter自带的分页类已经封装好了大部分逻辑,不用自己造轮子,效率还高。步骤如下:
1. 控制器代码
首先在你的控制器方法里加载必要的类,配置分页参数,查询数据:
public function record_list() { // 加载数据库和分页类 $this->load->database(); $this->load->library('pagination'); // 分页配置 $config = array( 'base_url' => site_url('your_controller/record_list'), // 分页链接的基础URL 'total_rows' => $this->record_model->get_total_records(), // 总记录数 'per_page' => 100, // 每页显示100条 'num_links' => 5, // 当前页码前后显示的页码数 'use_page_numbers' => TRUE, // 使用页码而不是偏移量作为URL参数 'full_tag_open' => '<div class="pagination">', // 分页链接的外层容器开始标签 'full_tag_close' => '</div>', // 外层容器结束标签 'cur_tag_open' => '<span class="current-page">', // 当前页码的开始标签 'cur_tag_close' => '</span>', // 当前页码的结束标签 'prev_link' => '上一页', 'next_link' => '下一页' ); // 初始化分页类 $this->pagination->initialize($config); // 获取当前页码(从URL的第3段获取,比如your_controller/record_list/2 就是第2页) $current_page = $this->uri->segment(3) ? $this->uri->segment(3) : 1; // 计算偏移量:(当前页-1)*每页条数 $offset = ($current_page - 1) * $config['per_page']; // 获取分页数据 $data['records'] = $this->record_model->get_paginated_records($config['per_page'], $offset); // 生成分页链接HTML $data['pagination_links'] = $this->pagination->create_links(); // 加载视图 $this->load->view('record_list_view', $data); }
2. 模型代码
在对应的模型里实现获取总记录数和分页数据的方法:
class Record_model extends CI_Model { // 获取总记录数 public function get_total_records() { // 如果有查询条件,记得在这里加上,比如 $this->db->where('status', 1); return $this->db->count_all('your_table_name'); } // 获取分页数据 public function get_paginated_records($limit, $offset) { // 可以根据需求添加排序、筛选条件,比如 $this->db->order_by('created_at', 'DESC'); return $this->db->limit($limit, $offset)->get('your_table_name')->result(); } }
3. 视图代码
在视图里展示数据列表和分页链接:
<div class="record-list"> <?php foreach($records as $record): ?> <div class="record-item"> <!-- 展示你的记录内容,比如 <?php echo $record->title; ?> --> </div> <?php endforeach; ?> </div> <!-- 显示分页链接 --> <?php echo $pagination_links; ?>
方案二:手动实现分页(适合自定义需求)
如果官方分页类的样式或逻辑不符合你的需求,也可以手动实现:
1. 控制器代码
public function record_list() { $this->load->database(); $per_page = 100; // 获取总记录数 $total_records = $this->db->count_all('your_table_name'); // 计算总页数 $total_pages = ceil($total_records / $per_page); // 获取当前页码,确保在1到总页数之间 $current_page = $this->uri->segment(3) ? (int)$this->uri->segment(3) : 1; $current_page = max(1, min($current_page, $total_pages)); // 计算偏移量 $offset = ($current_page - 1) * $per_page; // 获取分页数据 $data['records'] = $this->db->limit($per_page, $offset)->get('your_table_name')->result(); // 手动生成分页链接HTML $pagination_html = '<div class="pagination">'; // 上一页链接 if ($current_page > 1) { $pagination_html .= '<a href="' . site_url('your_controller/record_list/' . ($current_page - 1)) . '">上一页</a>'; } // 显示当前页前后的页码(比如当前页是5,显示3、4、5、6、7) $start_page = max(1, $current_page - 2); $end_page = min($total_pages, $current_page + 2); for ($i = $start_page; $i <= $end_page; $i++) { if ($i == $current_page) { $pagination_html .= '<span class="current-page">' . $i . '</span>'; } else { $pagination_html .= '<a href="' . site_url('your_controller/record_list/' . $i) . '">' . $i . '</a>'; } } // 下一页链接 if ($current_page < $total_pages) { $pagination_html .= '<a href="' . site_url('your_controller/record_list/' . ($current_page + 1)) . '">下一页</a>'; } $pagination_html .= '</div>'; $data['pagination_html'] = $pagination_html; $this->load->view('record_list_view', $data); }
2. 视图代码
视图里直接输出手动生成的分页HTML即可:
<div class="record-list"> <?php foreach($records as $record): ?> <div class="record-item"> <!-- 展示记录内容 --> </div> <?php endforeach; ?> </div> <?php echo $pagination_html; ?>
性能优化提示
- 加索引:如果你的查询有WHERE或ORDER BY条件,给对应的字段加索引,避免全表扫描,提升查询速度。
- 高效统计总记录数:如果是带条件的查询,用
$this->db->where(...)->count_all_results('your_table'),而不是先查所有数据再count,后者性能差很多。 - 避免循环查库:不要在视图的foreach循环里做数据库查询,把所有需要的关联数据一次性查出来(比如用JOIN)。
内容的提问来源于stack exchange,提问作者Shimul
相关产品推荐
相关产品推荐

