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代码
Jun 08 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
PHP时间戳 strtotime()使用方法和技巧
Oct 29 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 PHP
详解PHP中的Traits
Jul 29 PHP
php实现json编码的方法
Jul 30 PHP
php删除数组中重复元素的方法
Dec 22 PHP
Yii2创建多界面主题(Theme)的方法
Oct 08 PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
php菜单/评论数据递归分级算法的实现方法
Aug 01 PHP
Laravel 数据库加密及数据库表前缀配置方法
Oct 10 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数据库操作Helper类完整实例
2016/05/11 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
Angular4 中内置指令的基本用法
2017/07/31 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
pyqt和pyside开发图形化界面
2014/01/22 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
Python中属性和描述符的正确使用
2016/08/23 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
python实现停车管理系统
2018/11/30 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
python双向链表原理与实现方法详解
2019/12/03 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
应届大专毕业生个人自荐信
2013/09/22 职场文书
会议接待欢迎词
2014/01/12 职场文书
幼儿园毕业教师感言
2014/02/21 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
深度学习小工程练习之垃圾分类详解
2021/04/14 Python
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js
Java设计模式中的命令模式
2022/04/28 Java/Android