Codeigniter(CI)框架分页函数及相关知识


Posted in PHP onNovember 03, 2014

一般在数据分页的时候需要获取当前页的数据和总条数,一般人是在model中封装两个函数分别获取当前页的数据和数据总条数,业务逻辑类似,感觉有点冗余,可以封装在一起:

/**

     * 获取分页数据及总条数

     * @param string @tablename 表名

     * @param mixed $where 条件

     * @param int $limit 每页条数

     * @param int $offset 当前页

     */

    public function get_page_data($tablename, $where, $limit, $offset, $order_by, $db)

    {

        if(empty($tablename))

        {

            return FALSE;

        }

        

        $dbhandle = empty($db) ? $this->db : $db;

        

        if($where)

        {

            if(is_array($where))

            {

                $dbhandle->where($where);

            }

            else

            {

                $dbhandle->where($where, NULL, false);

            }

        }

        

        $db = clone($dbhandle);

        $total = $dbhandle->count_all_results($tablename);

        

        if($limit)

        {

            $db->limit($limit);

        }

        

        if($offset)

        {

            $db->offset($offset);

        }

        

        if($order_by)

        {

            $db->order_by($order_by);

        }

        

        $data = $db->get($tablename)->result_array();

        

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

    }

CI框架分页类使用心得

CI分页的url地址有四种方式
a) locahost/news/page/2 这个2表示第二页
b) localhost/news/page/20 这个20表示从第20条记录开始分页,即页面的第一条记录,是数据库中的第20条记录。
c) localhost/news?per_page=2 第二页
d) localhost/news?per_page=20 同b)

首先我们先看一下CI分页的参数:

$config['base_url'] = $url;   

/* 分页的基础 URL

如果你想用a、b的链接形式,则该url应该形式如/news/page/  

如果链接是c、d的形式,则url应该如/news?  

*/  

$config['total_rows'] = $total;//记录总数,这个没什么好说的了,就是你从数据库取得记录总数   

$config['per_page'] = $pagesize; //每页条数。额,这个也没什么好说的。。自己设定。默认为10好像。   

$config['page_query_string'] = TRUE;   

/*传参形式。开启true则会自动在你的url后面加上&per_page=3。(这个per_page是默认的查询字符,当然你也可以用$config['query_string_segment']来自己设定)

因此c、d中的形式一般是为localhost/news?&per_page=2不过都一样,没什么影响。get的per_page还是3  

*/  

$config['first_link'] = '首页'; // 第一页显示   

$config['last_link'] = '末页'; // 最后一页显示   

$config['next_link'] = '下一页 >'; // 下一页显示   

$config['prev_link'] = '< 上一页'; // 上一页显示   

$config['cur_tag_open'] = ' <a class="current">'; // 当前页开始样式   

$config['cur_tag_close'] = '</a>';   

/*当前页结束样式。这些你可以自己尝试一下。

比如说我想让当前页的分页数字样式好看一点,红色字体等。你就可以在current上加上css代码  

*/  

$config['num_links'] = 2;// 当前连接前后显示页码个数。意思就是说你当前页是第5页,那么你可以看到3、4、5、6、7页。   

$config['uri_segment'] = 4;   

/*这个是你在用a)、b)链接样式的时候,用来判断页页数。

比如localhost/news/page/3  这个uri_segment就要设定为3。localhost/news/title/page/3这个就要设定为4  

*/  

$config['use_page_numbers'] = TRUE;   

/*这个就是a)、b)的差别了。开启了,page就会表示页数。false就会表示记录数

*/ 

刚开始在网上查资料的时候,有很多这种写法。

$this->model->get_news($config['per_page'],$this->uri->segment(3)); 

其实这种写法就是针对b)这种连接形式的。这里的$this->uri->segment(3)就是取到page/20中的记录数20。$config['per_page']就是限制输出多少条。
有很大的局限性和误导性。我开始就是死都不知道为什么这么写。。后来才发现,手册才是最好的老师。

当我们把CI分页类的一些参数都配置好了之后,$this->pagination->initialize($config);//配置分页

$page = $this->pagination->create_links();  //我们就得到了分页了 

直接传递到视图页,即可。

至于怎么加载模型,怎么存取数据记录,怎么传递变量到视图,这里就不说了,看手册好了。

忘记说了,带查询参数的分页,我是这么做的。视图中将查询参数get提交到控制器的search方法。在search中,用$get = $this->input->get();去获取到查询参数。
然后加载model,用带查询参数和分页参数去读取记录,将结果显示到视图。。

另外还发现个小bug,比如/news/page/-1000这样的时候,下面的分页链接将会出现负值
发现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;   

} 

才对吧,经过修改后,这个问题没有了。

PHP 相关文章推荐
PHP生成带有雪花背景的验证码
Oct 09 PHP
快速配置PHPMyAdmin方法
Jun 05 PHP
php Xdebug 调试扩展的安装与使用.
Mar 13 PHP
php Rename 更改文件、文件夹名称
May 24 PHP
php 生成唯一id的几种解决方法
Mar 08 PHP
PHP session_start()问题解疑(详细介绍)
Jul 05 PHP
php fsockopen解决办法 php实现多线程
Jan 20 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 #PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
Nov 01 #PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 #PHP
ThinkPHP分组下自定义标签库实例
Nov 01 #PHP
PHP根据两点间的经纬度计算距离
Oct 31 #PHP
ThinkPHP在新浪SAE平台的部署实例
Oct 31 #PHP
封装ThinkPHP的一个文件上传方法实例
Oct 31 #PHP
You might like
各种咖啡的英文名子是什么
2021/03/03 新手入门
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
简介JavaScript错误处理机制
2020/08/04 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
舞蹈比赛获奖感言
2014/02/04 职场文书
大型晚会策划方案
2014/02/06 职场文书
音乐教学随笔感言
2014/02/19 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
教导处教学工作总结
2015/08/12 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers
MySQL时区造成时差问题
2022/04/13 MySQL
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js