分页原理简介

33 篇文章 0 订阅

刚完成一个分页的功能,在这里记述一下,顺便理一理自己的思路。把最后演示的结果上传到优酷了,还在审核,稍后会加超链接的。

Part1 分页原理

这里我不打算直接贴代码,因为当我火急火燎的找原理的时候,你居然给我看代码,我只能说一句:妈卖批。。。。。。

1.1 原理

其实从本质上来讲分页的原理就是:

  • 当前页数:$currentPage
  • 每页显示的数据条数:$count

这两个数字是我们唯一需要知道的,接着就是借助数据库的limit了,看下面的页数对应数据库中记录数的表。

假设每页显示5条记录

页数($currentPage)记录数(假设id为主键,自增,起始为1)
11,2,3,4,5
26,7,8,9,10
311,12,13,14,15

假设我现在要查询某一页的数据(对应于其中的一行记录),那么我设置sql的limit(‘偏移量’,’查询条数’),中的偏移量和查询条数怎么设置?

  • 偏移量:($currentPage-1)*$count
  • 查询条数:$count

按照这条规律再来看上面的表:

$currentPage偏移量查询条数结果
1051,2,3,4,5
2556,7,8,9,10
310511,12,13,14,15

所以我们只需要从前端得到当前的页数,也就是我们最下面看见的那一排数字。再来结合上面的公式,从数据库中使用limit就可以得出所有所需的数据了。


1.2 优化页数显示(可选页面数确定)

了解上面的分页原理之后,接着就是稍微麻烦一点的,怎么确定显示哪几个页?如果一个数据需要100页显示,那么怎么显示呢?我不可能把1-100的超链接全部放在页面中,这样很占空间,而且显示很丑,所以我们需要先显示一些备选项,再加一个下拉菜单,在这个下拉菜单中显示全部可选值。那么现在的问题就是怎么确定这些备选项??

下面是我从别人那里借鉴的一种解决办法,虽然他严正声明了转载他的内容要声明,但是我关掉页面后就找不到了,所以只能叫他雷锋了。。。。。。貌似我怎么废话越来越多了,哎,老了。

这里先设置一个值,叫做$showPage,这个值的功能就是表示总共显示的可选页面数为2*$showPage+1,怎么得到这个值呢?看下面的计算方法:

  • 起始页面值:当前页面数-$showPage
  • 结尾页面值:当前页面数+$showPage

那么全部的可选页面数量就是:

结尾页面值-其实页面值+1=2*$showPage+1

这个说明什么呢?看下面的实例:

  • $showPage=5
  • $currentPage=55
  • 总页面数为100

那么显示在页面上的可选页面数量就是:

50 51 52 53 54 55 56 57 58 59 60

55为当前页面数量。

原理是这样,但是总有一些例外情况需要考虑,比如,$currentPage-$showPage时小于0,$currentPage+$showPage大于总页面数,那么这样的页面超链接是没有意义的,所以我们需要进行判断,如果$currentPage-$showPage小于0,则起始页面值等于1,如果$currentPage+$showPage大于总记录数,则结尾页面值等于总页面数。

到这里其实我们就是确定了一个区间,也就是可选页面的范围,而其范围就是一个连续的,步进为1的数组。我们要这么一个区间干什么呢?这里就需要结合代码来考虑了。

Part 2 代码展示

先从简单的开始,就是我们上面判断可选页面数的过程,我是专门写成了一个函数,顺便说一句,用php写的。

/**
 * @param $currentPage 当前页面值
 * @param $countPage 总页面数量
 * @return array
 */
function setGoodsPages($currentPage,$countPage){
//    显示可选页面的数量,正常情况下为2*$showPage+1
    $showPage=C('SHOW_PAGES');
//    设置其实页面值
    $myde_i=$currentPage-$showPage;
//    设置结尾页面值
    $myde_en=$currentPage+$showPage;
//    例外情况
    if($myde_i<=0){
        $myde_i=1;
    }
    if($myde_en>$countPage){
        $myde_en=$countPage;
    }
//    得到全部可选页面区间
    $demon=range($myde_i,$myde_en);
    return $demon;
}

最后返回的结果就是我们1.2讨论的结果,接着就是如何显示在前台了。

这里我使用的是thinkphp的内置标签来进行批量增加的:

<foreach name='pages' item='pages'>
    <a href="{:U('goods/lst',array('page'=>$pages))}">$pages</a>
</foreach>

可以看到我们每次会传一个page的参数传回后台,就是我们调用setGoodsPages时所设置的$currentPage,同时这个值也是调用sql的limit时一个关键的参数,就是1.1中展现的那样。

可能有点乱,但是我尽力了。。。。。。


这里介绍一个插件:jquery.pagination.js,使用这个插件就可以简单一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值