我的分页方法分享

王志勇 发表于 2009年02月25日 19:52

分页是程序永恒的主题,2002年的时候我曾经见过一个留言板的分页程序,但是很难读懂。于是我大约在2005年的时候做了一个很大的改进,推算了另一种简单易读的方法,目前我所有的分页程序都是用此方法,这个算法从来没有出过错,无论是ASP、ASP.net、PHP、JSP,还是CGI,都是可以通用的。例如博客或者论坛程序中,以PHP为例,用此程序可以计算出总页数$p、当前页的起始位置$w1的值和结束位置$w2的值,程序如下:

<?$pa=$_GET["page"]; //或者省略查询ID名$pa=$_SERVER['QUERY_STRING'];
if ($pa) $pa=1;
$w3=10;
$w4=$auf/$w3;
$w5=floor($w4);
$p=$w5+1;
if ($w5==$w4) $p=$w5;
if (!$p) $p=1;
$w1=($pa-1)*$w3+1;
$w2=$w3+$w1-1;
if ($w2>$auf) $w2=$auf;?>

说明:

  1. 变量$pa代表当前位于第几页,如果网址中省略页数,则$pa=1;
  2. 变量$w3表示每页显示多少篇博客;
  3. 变量$auf表示博客的文章总数;
  4. 变量$p表示总页数;
  5. 变量$w1表示当前页的博客文章编号从$w1的值开始,$w2表示结束的文章编号;

分页时,读取多篇博客文章的方法:

for ($i=w1; $i<=w2; $i++){}

这是比较简单易读的算法。在搜索程序中,或者打开多段数据库的时候,分页程序就会复杂很多,我曾经连续做了好几天的演算。

8条评论:
1   双喜哥 2009-02-25 22:52
,分页确实是程序永恒的主题,学习了。
2   Goberl 2009-02-28 09:36
这个思路很清晰的!这样子只适合ID为连续的啊?
我一直是用SQL语句实现的分页,觉得效率好点。分页有点恼火哦,总是为了显示几个页码链接写很长的代码才能实现。
select top 页大小 *
from table1
where id>
(select max (id) from
(select top ((页码-1)*页大小) id from table1 order by id) as T
)
order by id
不过这个语句要是里面涉及到的表连接比较多就有点难写了,有时候调试这个SQL语句都得分析好半天。
http://www.cnblogs.com/yzwdli/archive/2007/12/06/984743.html
3   自由勇 2009-02-28 09:53
Thanks,正文的方法对不连续的ID同样适用,比如另外列一个ID列表。
4   Goberl 2009-02-28 14:25
"另外列一个ID列表" 什么意思啊?是在数据库表中重新建立一列吗?
5   自由勇 2009-02-28 16:35
我编的程序里,有时候需要,有时候不需要。
6   有德 2009-03-01 23:41
太好了我又学了。不过对于编程来说我看,我还太早了
7   自由勇 2009-05-02 10:16
Trackback来自 《记笔记是编程的好习惯

在打开多段数据的时候,对于分页的处理会复杂很多。通常情况下,只打开一段数据库,分页程序比较容易实现,如这里。

8   自由勇 2010-04-05 18:20
Trackback来自 《日记:2010-04-05》

这个分页程序可以简化为:
<?//$pa为页数
$w3=10;
$p=ceil($auf/$w3);
if (!$p) $p=1;
$w1=($pa-1)*$w3+1;
$w2=$pa*$w3;
if ($w2>$auf) $w2=$auf;?>

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

直接发送Trackback到此文章

说明:本评论系统不支持HTML代码。(您的留言需要审核,审核规则请见这里。)

王志勇:1980-09-26 (41周岁)
程序设计,前端设计。

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2021年01月
2020年12月
2020年11月(18)
2020年10月(15)
2020年09月(14)
2020年08月(14)
2020年07月(14)
2020年06月(16)
2020年05月(13)
2020年04月(18)
2020年03月(14)
2020年02月(15)
2020年01月(16)
2019年12月(11)
2019年11月(26)
2019年10月(25)
2019年09月(30)
2019年08月(10)
2019年07月(29)
2019年06月(30)
2019年05月(26)
2019年04月(30)
2019年03月(30)
2019年02月(30)
2019年01月(30)
2018年12月(30)
2018年11月(30)
2018年10月(30)
2018年09月(17)
2016年-2017年(9)
2014年06月-09月(10)
2013年 +

2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2021 auiou.com All rights reserved.
此Blog程序由王志勇编写 已经发布在Arsue