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 相关文章推荐
MySQL相关说明
Jan 15 PHP
PHP学习之字符串比较和查找
Apr 17 PHP
rephactor 优秀的PHP的重构工具
Jun 09 PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
PHP读取PPT文件的方法
Dec 10 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
PHP插件PHPMailer发送邮件功能
Feb 28 PHP
Laravel框架用户登陆身份验证实现方法详解
Sep 14 PHP
Yii框架页面渲染操作实例详解
Jul 19 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
第七节--类的静态成员
2006/11/16 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
python实现二维插值的三维显示
2018/12/17 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
基于python监控程序是否关闭
2020/01/14 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
Noon埃及:埃及在线购物
2019/11/26 全球购物
会议邀请函范文
2014/01/09 职场文书
先进事迹报告会感言
2014/01/24 职场文书
中英文求职信范文
2014/01/27 职场文书
安全协议书
2014/04/23 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
高中社区服务活动报告
2015/02/05 职场文书
教师辞职信范文
2015/02/28 职场文书
Python实现机器学习算法的分类
2021/06/03 Python
php实现自动生成验证码的实例讲解
2021/11/17 PHP