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 06 PHP
php设计模式之单例、多例设计模式的应用分析
Jun 30 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
php输出指定时间以前时间格式的方法
Mar 21 PHP
使用xampp搭建运行php虚拟主机的详细步骤
Oct 21 PHP
PHP读取PPT文件的方法
Dec 10 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 PHP
PHP如何防止用户重复提交表单
Dec 09 PHP
phpquery中文手册
Mar 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
菜鸟修复电子管记
2021/03/02 无线电
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
2011/05/04 PHP
php session的应用详细介绍
2017/03/22 PHP
PHP中cookie知识点学习
2018/05/06 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
JavaScript 基础篇(一)
2012/03/30 Javascript
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
JQuery下拉框应用示例介绍
2014/04/23 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
keras topN显示,自编写代码案例
2020/07/03 Python
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
模具设计与制造专业推荐信
2014/02/16 职场文书
个人安全生产责任书
2014/07/28 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
中学生思想品德评语
2014/12/31 职场文书
医生个人年终总结
2015/02/28 职场文书
《小小的船》教学反思
2016/02/18 职场文书
Go语言设计模式之结构型模式
2021/06/22 Golang
使用nginx配置访问wgcloud的方法
2021/06/26 Servers