You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:35:16