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 和 COM
Oct 09 PHP
打造超酷的PHP数据饼图效果实现代码
Nov 23 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 PHP
PHP7之Mongodb API使用详解
Dec 26 PHP
php实现在站点里面添加邮件发送的功能
Apr 28 PHP
PHP 实现页面静态化的几种方法
Jul 23 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
May 30 PHP
php扩展开发入门demo示例
Sep 23 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 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中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
YII框架常用技巧总结
2019/04/27 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
Python解析xml中dom元素的方法
2015/03/12 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
发布你的Python模块详解
2016/09/15 Python
python机器学习实战之K均值聚类
2017/12/20 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
优秀导游先进事迹材料
2014/01/25 职场文书
九年级政治教学反思
2014/02/06 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
pycharm无法导入lxml的解决办法
2021/03/31 Python
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python