给何版主, 机器民主和lilyxie: 关于分页机制.

分页

1. 分页的前提是记录按id排序, 且不连续, 比如有些记录被删除,
   或者要分页显示查找结果, 这样就有了除分页外的条件$q
2. 确定分页的方式:
(1): 用简单的"页首, 上一页, 下一页".
(2): 用"1,2,3,4,5,6,..........末尾"来指定跳到某页.
3. 实现分析:
(1) 如果先查询全部结果, 只显示其中的部分. 这种方式显然不好,
    会累坏server.
(2) 对于用limit m,n实现分页, 有些不负责, 服务器在实际操作时还是
    按$q条件找出所有结果, 然后只返回m后的n条. server工作仍然很多.
(3) 优化的办法是知道要显示页的起始$id, 查询
   "where $q and id>=$id order by id desc limit 0,$page_length"
   这样mysql 会先按id的索引找到符合条件的id, 然后再评估$q.
(4) 那$id怎么来呢?
(5) 对于显示方式1, 每页多查询一条,最后一个记录的$id就是啦
    "where $q and id>=$id order by id limit 0,$page_length+1"
    if (mysql_num_rows($result) > $page_length) echo "下一页"
   //(记住最后一条记录不要显示!)
   //如果不使用第二种分页方式, 到此结束.
(5) 对于显示方式2, 后面$page_offset=6页的每页起始id要一次知道.
"select id from xxxx where $q order by id desc limit 0,$page_length*$page_offset"
for($i=0;$i*$page_length<$mysql_num_rows($result);$i++){
    $start=mysql_result($result,$i*$page_length,0);
    echo '<a href="xxxxx?pageno='.($i+1)."&id=$start\">";
    if ($id==$start) echo "<b>$i</b>"; //加重显示当前页号
    else echo $i;
    echo "</a>";
}
(6)也许有人要问server不是按$q条件把所有这几页都搜一遍了吗?
和"limit 0,$page_length*$pageno"有什么区别? 直接用$pageno哪有$id这么麻烦?
答案是可以利用session功能存起来这个结果, 如果$q没有变, 就可以直接调用,
省得每次换页都折腾数据库.
加上后续页面判断, 上面的例子就变成:
//如果$q没有变化
$page_offset=6;
session_register($ids);
if (!$ids){//后序页面不会执行
    "select id from xxxx where $q order by id desc limit 0,$page_length*$page_offset+1";//判断有无后序页面
    for($i=0;$i*$page_length<$mysql_num_rows($result);$i++){
        $ids[]=mysql_result($result,$i*$page_length,0);
    }
}
//有乐$ids......
for ($i=0;$i<$page_offset;$i++){
    echo '<a href="xxxxx?id="$ids[$i].'">';
    if ($d==$ids[$i]) echo "<b>$i</b>"; //加重显示当前页号
    else echo $i;
    echo "</a>";
}
//下面这句自由发挥, 可以切换到分页模式1
if ($ids[$page_offset])
    echo '<a href="xxxx?pageno='.($pageno+1).'&id='.$ids[$page_offset].">....</a>';
(8) 以上结果稍加改动, 可以session_resiter($pageno), 来记录当前是第几
大页. 类似快进功能.
(7) 不知道php4正式版是否支持session中存放数组, 如果不行建议用
implode/explode来变成字串保存.
(8) 这种方式的优点应该是速度快, 但缺点是不知道总共符合$q条件的数量.
对于搜索庞大的数据库应该有用.
(9) 实现"跳至末尾", 可以在以上sql语句中 order by id, 不要desc. 同理可实现
前面第N页.
4 以上代码还都是设想, 希望各位多多指正.
5 本文中心思想是利用id索引和id的偏移来快速查找后序内容, 节省数据库开销.

时间: 2024-12-30 23:32:47

给何版主, 机器民主和lilyxie: 关于分页机制.的相关文章

看雪版主、十年黑客“玩命”:我不作死,我只玩命 | 宅客故事

        阎文斌 花名:玩命 娜迦公司CTO,资深 hacker,从事安全领域研究与创新10年以上 有着深厚的安全领域背景,长期研究计算机病毒与软件保护技术,并深耕密码学研究领域. 曾负责省级某安全部门.国际信息技术安全研究中心的多个网络安全项目,参与多家政府网站的风险评估工作.曾担任2008奥运会网络安全技术顾问,是国内著名安全论坛看雪论坛版主.业内知名软件保护专家(安全焦点组织员,连续五年在安交峰做软件安全专题演讲). 写在前面的话 我们总在观察黑客的成长路径,希望后来者能够看到他们的

版主角色定位 社区电子商务中的问题

本文与立志于做网络雷锋的网站拥有者无关,本文专门探讨社区电子商务中的版主问题.我们很清楚在这几年间,社区型的网站领域发生了什么:大众热点从"内容为王"的web2.0,转变成SNS,从难以赚钱的SNS转变为SNS+UGC.然而,真正在做社区电子商务实践的人认为:我们需要的其实是社区,社区可以是DIGG,可以是SNS,也可以是传统的BBS.鲜果今天发布公告,宣称自己跟新浪.海内合作了,宣称自己开放的与一切可以合作者合作.在海内,共享热文就是共享鲜果的热文了. 但是,作为真正的实践者和经验主

蛮横的版主以及他们如何影响你

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 我还是在上大学的时候接触到的电脑,那时候很喜欢去聊天室,一聊就是一个通宵,真不知道那个时候怎么会这么喜欢聊天,现在看来,那时候真是在糟蹋我的美好时光,后来慢慢的就发现,聊天室越来越少的人在聊天,或者说是私聊,要不就是一大堆的广告,慢慢的也就不再聊天室混了.后来,开始玩起了论坛,其实我根本就不会玩,就是喜欢到处去看看帖子,觉得这个东西满有意思的

揭秘睿智站长论坛版主管理办法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 作为互联网较早的产品之一论坛如今已经获得了较多的站长和互联网用户的青睐,目前我国做的比较好的论坛就有天涯,猫扑等,并且随着互联网的发展,各大网站也会顺势推出相关的论坛,以此扩大自己的产品线,增强网站的粘性.当然,这样的话站长很多时候会选择版主,不仅为了增加互动方式,也是为了更好的有效管理网站,版主作为第一线的管理者,他就对整个论坛的发展起到重

如何当好一个版主,斑竹-写给版主们

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 如论坛是个团体,我们每个版主们都应有团队精神,首先版主之间必须就是朋友.兄弟姐妹,这样才能默契的为论坛做好每一件事. 既然我们是个团体,就更有必要有组织有纪律,不提倡独来独往,我行我素,所以版主们,必须将自己负责的版块管理好.尽自己的能力去搞活版块. 为了论坛的人气:要作到多发帖;发好帖;发精帖. 为了论坛的环境:要定时清除时间长久又无实际意

社区电子商务中版主的角色定位问题

本文与立志于做网络雷锋的网站拥有者无关,本文专门探讨社区电子商务中的版主问题. 我们很清楚在这几年间,社区型的网站领域发生了什么:大众热点从"内容为王"的web2.0,转变成SNS,从难以赚钱的SNS转变为SNS+UGC.然而,真正在做社区电子商务实践的人认为:我们需要的其实是社区,社区可以是DIGG,可以是SNS,也可以是传统的BBS.鲜果今天发布公告,宣称自己跟新浪.海内合作了,宣称自己开放的与一切可以合作者合作.在海内,共享热文就是共享鲜果的热文了. 但是,作为真正的实践者和经验

论坛版主及管理员培育发展心得

一个好坛子不是一两个人能支撑起来的.我做过很多论坛的管理员,把所有精力放在对外推广和自己制造马甲疯狂转贴上面.转贴一页又一页,还是没有人气,其实这是用过去草根站长建站的思维来做论坛.我们评价一个论坛的好坏标准,首先还是是否有足够的互动性,创进棋觉得好的管理员当治大不致细.管人不管事.调动别人而不让自己在台前疲于奔命.管理员的真正身份应该做好幕后推手,管理论坛核心就是管理和发展斑竹,服务好斑竹板斧.当斑竹和板斧把论坛当家了的话,论坛在一定时间内想不上去都不可能. 那么什么样的人具备好版主的潜质?首

瞧,那些校园论坛版主的网络生活

从本科生读到博士生,杨春雷曾经获得过一串儿的奖励.前不久,他又拿到了一份奖学金--专门奖给校园论坛优秀版主的社会捐助奖学金--这他从未想到过. 6月16日晚7点,北京理工大学的一个小礼堂,神州正方奖学金现场答辩正式开始.19名校内BBS版主每人进行5分钟的演讲,并回答评委提问.当howardcc.yoyoflower.八爪鱼.故垒西边等人走上讲台时,他们受到了明星般的礼遇,热烈的掌声.欢呼声响彻礼堂. 台下的观众是他们的"粉丝",但很多人彼此并不认识,然而,这些选手的ID在校内的&qu

子窗体刷新父窗体的问题完全解决了,谢谢E版主

实际上我是对showdialog不熟悉所致.光想到传送数据了,就重新了showdialog事件,这样虽然传送了数据,但是却不能使用form.owner方法了.现在的解决方法是:在主窗体中用showdialog(me)调用子窗体,在子窗体中使用:dim f as new form() 'form是主窗体f = me.owner这时就可以调用主窗体的各个控件了,获取数据也很容易了.再次感谢E版主的大力帮助.