CodeIgniter分页类配置与Model封装实战

星野
星野
发布时间:2026-10-15| 5人浏览过
原创

在使用 CodeIgniter (CI) 进行 Web 开发时,高效的分页处理是提升用户体验的关键。本文将介绍如何配置 CI 的 Pagination 库以支持多种 URL 风格,并提供一个通用的 Model 层方法,用于在单次数据库查询中同时获取记录总数和分页后的数据列表,从而减少冗余代码。

CodeIgniter 分页类核心配置

CI 的分页功能高度依赖于控制器中的配置数组。理解不同的 URL 结构有助于正确设置参数,避免页面跳转或数据加载错误。

第1步:确定 URL 结构类型

CI 分页通常支持两种主要的 URL 模式,其底层逻辑有所不同:

  • URI 段模式(默认): 如 localhost/news/page/2。数字 2 代表第几页;若未开启特定选项,也可能代表从第几条记录开始。
  • 查询字符串模式: 如 localhost/news?per_page=20。数字 20 通常代表每页显示条数或起始偏移量。

第2步:配置关键参数

在控制器的方法中初始化分页库时,需构建如下配置数组。这些参数直接决定了分页链接的生成逻辑和前端展示效果。

$config['base_url'] = 'http://example.com/index.php/news/'; // 基础 URL
$config['total_rows'] = $total_rows;      // 数据库中符合条件的总记录数
$config['per_page'] = 10;                 // 每页显示的记录条数

// URI 段模式下的索引位置(视路由规则而定)
$config['uri_segment'] = 3;

// 是否使用页码代替偏移量
// TRUE: page/2 表示第2页
// FALSE: page/10 表示从第10条记录开始
$config['use_page_numbers'] = TRUE;

// 开启后使用 ?per_page=xx 而非 URI 段
$config['page_query_string'] = FALSE;

// 自定义分页按钮文字
$config['first_link'] = '首页';
$config['last_link'] = '末页';
$config['next_link'] = '下一页 >';
$config['prev_link'] = '< 上一页';
$config['cur_tag_open'] = ' <a class="current">';
$config['cur_tag_close'] = '</a>';
$config['num_links'] = 2; // 当前页前后显示的页码数量

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

Model 层通用分页查询封装

为了减少 Controller 和 View 之间重复编写 SQL 查询的次数,建议在 Model 中封装一个统一的方法。该方法通过克隆数据库对象,一次性执行计数查询和数据列表查询,并合并返回值。

第3步:实现 get_page_data 方法

以下是标准的 CI3 Model 封装实现。注意使用 clone 复制查询构造器对象,以确保统计总数的操作不会影响后续获取数据列表的限制条件。

class News_model extends CI_Model {

    /**
     * 获取分页数据及总条数
     *
     * @param string $tablename 表名
     * @param mixed $where WHERE 条件 (array 或 string)
     * @param int $limit 每页条数
     * @param int $offset 偏移量 (已应用 per_page)
     * @param string $order_by 排序字段
     * @param CI_DB_query_builder $db 指定使用的数据库连接
     * @return array ['total' => int, 'data' => array]
     */
    public function get_page_data($tablename, $where, $limit, $offset, $order_by, $db = NULL) 
    {
        if (empty($tablename)) {
            return FALSE;
        }

        // 获取数据库实例
        $dbhandle = empty($db) ? $this->db : $db;

        // 处理 WHERE 条件
        if ($where) {
            if (is_array($where)) {
                $dbhandle->where($where);
            } else {
                // 使用 false 防止自动转义导致的安全问题或格式错误
                $dbhandle->where($where, NULL, false);
            }
        }

        // 克隆对象,用于单独执行 count 查询
        $db_count = clone($dbhandle);
        $total = $db_count->count_all_results($tablename);

        // 重新构建查询以获取实际数据
        $db_data = clone($dbhandle);

        // 应用限制和偏移
        if ($limit) {
            $db_data->limit($limit);
        }
        if ($offset) {
            $db_data->offset($offset);
        }

        // 应用排序
        if ($order_by) {
            $db_data->order_by($order_by);
        }

        // 执行查询并返回结果
        $data = $db_data->get($tablename)->result_array();

        return array('total' => $total, 'data' => $data);
    }
}

进阶技巧:带参数的分页与缺陷修复

第4步:处理混合查询参数分页

当分页同时需要支持搜索筛选(GET参数)和页码切换时,建议流程如下:

  1. 在 Controller 的搜索方法中,使用 $this->input->get() 获取所有查询参数。
  2. 将查询参数传递给 Model 进行过滤和分页计算。
  3. 保留 GET 参数到分页链接中,确保翻页不丢失搜索条件。

第5步:修复负值页码 Bug

在 CI 原生的 system/libraries/Pagination.php 文件中,当用户手动输入负数的页码时(例如访问 /news/page/-1000),可能会导致生成的分页链接出现负值异常。官方部分版本仅在页码为 0 时重置,建议检查并修改判断逻辑以兼容负数情况。

找到 system/libraries/Pagination.php 中的类似以下代码块:

if ($this->use_page_numbers AND $this->cur_page == 0) {
    $this->cur_page = $base_page;
}

将其修改为更严谨的判断,涵盖负数情况:

// 推荐修正写法
if ($this->use_page_numbers AND $this->cur_page <= 0) {
    $this->cur_page = $base_page;
}

此修正能确保无论用户尝试访问第几页的错误地址,系统都会安全地重定向至第一页或基础页码,避免前端渲染出错。

总结

合理配置 Pagination 库并配合 Model 层的逻辑封装,可以显著降低 CodeIgniter 项目中列表页的开发复杂度。通过统一的数据返回结构和完善的边界条件处理,能够构建出稳定且易于维护的分页模块。

以上就是 CodeIgniter 框架分页函数及相关知识的详细内容,更多关于 CodeIgniter 开发技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。