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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
php 代码优化之经典示例
Mar 24 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
Jul 20 PHP
PHP中函数rand和mt_rand的区别比较
Dec 26 PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
Oct 26 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php解析字符串里所有URL地址的方法
Apr 03 PHP
PHP无限极分类函数的实现方法详解
Apr 15 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
解决php extension 加载顺序问题
Aug 16 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
php自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
JS解析XML的实现代码
2009/11/12 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
深入探讨javascript函数式编程
2015/10/11 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
详解appium+python 启动一个app步骤
2017/12/20 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
pytorch实现线性拟合方式
2020/01/15 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
基于python3的socket聊天编程
2020/02/17 Python
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
办理生育手续介绍信
2014/01/14 职场文书
护理中职生求职信范文
2014/02/24 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
预备党员介绍人意见
2015/06/01 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL