连个分页都写不好,看来做程序员是没希望了?? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
darkmatter
V2EX    程序员

连个分页都写不好,看来做程序员是没希望了??

  •  1
     
  •   darkmatter 2015-07-26 19:01:17 +08:00 7672 次点击
    这是一个创建于 3781 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个分页功能折腾了两天都没写好
    62 条回复    2015-07-28 05:42:46 +08:00
    jjplay
        1
    jjplay  
       2015-07-26 19:04:53 +08:00
    勤能补拙
    tobyxdd
        2
    tobyxdd  
       2015-07-26 19:08:50 +08:00
    看是多高级的分页
    ghostcat
        3
    ghostcat  
       2015-07-26 19:10:58 +08:00
    我一般找现成的代码……读别人的代码学习
    qwe321
        4
    qwe321  
       2015-07-26 19:14:01 +08:00
    我写的分页代码也是很鸡肋
    qw7692336
        5
    qw7692336  
       2015-07-26 19:14:57 +08:00 via Android
    框架自动完成的分页
    luban
        6
    luban  
       2015-07-26 19:16:27 +08:00
    手两天写不好太正常
    Wangxf
        7
    Wangxf  
       2015-07-26 19:17:25 +08:00
    确实天赋太差,努力做一个好的码农吧,慢慢来吧,也许是某个环节点知识点没疏通
    learnshare
        8
    learnshare  
       2015-07-26 19:29:03 +08:00
    多写多积累
    Syec
        9
    Syec  
       2015-07-26 19:35:31 +08:00
    多看看别人的代码
    htfy96
        10
    htfy96  
       2015-07-26 19:39:08 +08:00
    到底是哪个分页……
    br00k
        11
    br00k  
       2015-07-26 19:41:54 +08:00
    多高级的分页?
    sneezry
        12
    sneezry  
       2015-07-26 19:44:34 +08:00 via iPhone   1
    一般的分页的套路基本是固定的,看看大家都是怎么写的记住就行了,遇到高级,谁都不可能写得顺风顺水的,别没事就质疑自己能力,这世界上的天才远没有你想的那么多,大牛也多是写的多了经历的多了。
    likai
        13
    likai  
       2015-07-26 19:50:39 +08:00
    玩PHP我最怕的就是分页和时间转换了
    anubiskong
        14
    anubiskong  
       2015-07-26 19:57:12 +08:00
    小事情比你想的复杂很多.
    不信你写个登陆注册
    loading
        15
    loading  
       2015-07-26 20:15:12 +08:00 via Android
    分页不就是 sql 需要看下例子吗?
    darkmatter
        16
    darkmatter  
    OP
       2015-07-26 20:16:04 +08:00
    @tobyxdd 也就是一般的分页。
    darkmatter
        17
    darkmatter  
    OP
       2015-07-26 20:16:29 +08:00
    @luban 我怎么觉得很不正常。
    darkmatter
        18
    darkmatter  
    OP
       2015-07-26 20:17:03 +08:00
    @Wangxf 从别的行业转来,想做个程序员。
    wohenyingyu01
        19
    wohenyingyu01  
       2015-07-26 20:19:23 +08:00
    我也是一个程序员,但是我听不懂什么叫分页
    breeswish
        20
    breeswish  
       2015-07-26 20:22:42 +08:00
    pagination? paging? …
    说来生成 pagination 的 上一页,下一页,第一页,最后一页,前几页,后几页…确实要写不少东西
    zonghua
        21
    zonghua  
       2015-07-26 21:00:13 +08:00
    @breeswish 不是模型那层输出list和count就行吗?我都这么干。
    lincanbin
        22
    lincanbin  
       2015-07-26 21:29:19 +08:00
    @loading 我觉得这里的分页应该是指分页的导航输出。




    https://github.com/lincanbin/Carbon-Forum/blob/master/common.php#L374

    我这里写了一个,如果考虑的情况比较多,不是像V2EX这样简单的上一页下一页,写起来还是挺繁琐的。
    laoyuan
        23
    laoyuan  
       2015-07-26 21:50:13 +08:00
    分页我每隔一两年就重新写一次
    powtop
        24
    powtop  
       2015-07-26 21:53:26 +08:00
    @laoyuan 今晚还直播不
    yakczh
        25
    yakczh  
       2015-07-26 21:53:39 +08:00
    google的那种分页,就是当前页在中间的样式
    gseven0312
        26
    gseven0312  
       2015-07-26 22:33:18 +08:00   1
    别灰心,没有人能一步到位的,慢慢来
    Tink
        27
    Tink  
    PRO
       2015-07-26 22:34:05 +08:00
    嗯嗯,我也不会写,都是用框架自带的
    iyaozhen
        28
    iyaozhen  
       2015-07-26 22:39:50 +08:00
    @likai PHP 时间转换不是挺方便嘛?
    yuanji
        29
    yuanji  
       2015-07-26 22:44:44 +08:00
    scourgen
        30
    scourgen nbsp;
       2015-07-26 22:46:06 +08:00   7
    分页还真不是简单能写好的,简直是一个细思恐极的话题。

    1.如何自动根据查询语句去生成一个 count sql,算出有多少条信息,需要分多少页?
    2.有没有不用计算一共有多少条也能分页的办法?
    3.如何保证「1」的语句在不同的情况下都能正常运行?
    4.如果你用了 distinct 的话,如何保证效率?
    5.如果查询语句里有 union 之类的操作的话,该怎么办?
    6.如果信息刷新很频繁,如何解决「第x页的最后一条内容被顶到x+1页的第一条」这个问题?
    7.如何在实现以上几点的情况下做cache?
    8.如何在实现「7」的基础上尽量提高命中率?
    bombless
        31
    bombless  
       2015-07-26 23:03:26 +08:00   1
    分页是有套路的,任何人熟悉一下都能写好,要想锻炼自己完全可以把精力放在更有创造力的事情上,分页的时候直接按照套路来就可以了。
    gzxultra
        32
    gzxultra  
       2015-07-26 23:04:35 +08:00
    我以为是内核kernel的分页。。。果然最近kernel源码看多了。。。被拖走
    zjqzxc
        33
    zjqzxc  
       2015-07-27 00:43:22 +08:00
    @scourgen 貌似6的问题大多数人都避而不谈。。被顶到下一页第一个问题不大,一会儿工夫被顶到下一页最后一个这种情况应该就比较悲剧了。
    TangMonk
        34
    TangMonk  
       2015-07-27 07:07:14 +08:00
    @scourgen 第6点求解决方案,如果是android或者ios的话那只有id判断了
    msg7086
        35
    msg7086  
       2015-07-27 08:22:01 +08:00
    gem install will_paginate
    vikeria
        36
    vikeria  
       2015-07-27 08:28:08 +08:00 via Android
    喵的,我第一反应是操作系统内存管理的分页,我愣了一下,卧槽,我好像也没写过,当即伤感了一会……
    Ouyangan
        37
    Ouyangan  
       2015-07-27 09:32:32 +08:00
    哈哈写了三天,能用了...
    cheng007
        38
    cheng007  
       2015-07-27 09:33:22 +08:00
    @vikeria 哈哈,我的第一感觉也是,操作系统的内存管理的分页,话说这玩意,虚拟内存地址到物理地址的映射
    我也没写过,只看过
    aivier
        39
    aivier  
       2015-07-27 09:40:50 +08:00
    嗯,作为一个前端不会分页查询好像也没什么不对啊 =_=
    ZHenJ
        40
    ZHenJ  
       2015-07-27 10:10:17 +08:00
    我的分页是用地址栏参数导航的。。。比你更菜,放心
    zhuangzhuang1988
        41
    zhuangzhuang1988  
       2015-07-27 10:21:55 +08:00
    这还要写?? 库里不是都提供了么???
    server
        42
    server  
       2015-07-27 10:28:24 +08:00
    10年 我的第一份工作 领导linux不会装 php(php5.2.x) iconv ,愣是让我把程序里的iconv 改成了mbstring,
    这找谁说理去。
    flydogs
        43
    flydogs  
       2015-07-27 10:46:23 +08:00
    分页很难的,要考虑sql的优化
    最近就在烦这事
    loading
        44
    loading  
       2015-07-27 11:15:10 +08:00 via Android
    @lincanbin 我写过这个导航,是比较繁琐。
    特别是在点到第4页左右的时候,你要显示第一页,第345页,然后第一1页和第3页中间,是省略还是显示第2页的问题…
    不过安静地写下来就好了。
    Felldeadbird
        45
    Felldeadbird  
       2015-07-27 11:50:22 +08:00   1
    我也不会写分页。我也要看先别人的写法,才可以改造。楼主不要灰心。有些东西我们无法创造,但是我们可以站在巨人的肩膀上成功。
    billwang
        46
    billwang  
       2015-07-27 13:37:06 +08:00
    分页一般都是copy改,很多东西网上都有轮子了,不用自己造。
    linxy
        47
    linxy  
       2015-07-27 13:45:40 +08:00
    我认真的找出了自己写内核时关于分页一些笔记,翻出了自己的小内核代码…
    写了几百字!!
    看到有人说是网页的分页……
    又默默地删了……
    wd0g
        48
    wd0g  
       2015-07-27 13:52:12 +08:00
    @likai 敲得少!
    caryxiao
        49
    caryxiao  
       2015-07-27 13:53:35 +08:00
    多写写,多想想就熟了
    raincious
        50
    raincious  
       2015-07-27 14:15:18 +08:00
    @loading

    所以当俺给自己的模板引擎加了个Pagination产生器之后,瞬间感觉生活美好了很多……
    https://github.com/raincious/facula/blob/wip/src/Facula/Unit/Paging/Compiler/Operator/Pager.php#L250
    虽然代码本身是烂的一塌糊涂

    不过就算产生了Pagination Links,缓存仍然是一个问题,所以请教下 @scourgen,如何较好的处理分页内容的缓存(问题7)?
    loading
        51
    loading  
       2015-07-27 14:22:50 +08:00 via Android
    @scourgen 关于信息增加快,可以看看微博的解决方法,同理。
    zhjits
        52
    zhjits  
       2015-07-27 14:30:01 +8:00
    @vikeria 我第一反应也是……
    fengyqf
        53
    fengyqf  
       2015-07-27 14:37:05 +08:00
    找现成的代码直接用吧,码农不是经常自称“搬砖”吗,该搬砖的时候就得当搬运工。
    v3exhao
        54
    v3exhao  
       2015-07-27 14:38:21 +08:00
    参考别人的,多加练习
    realpg
        55
    realpg  
    PRO
       2015-07-27 14:57:18 +08:00
    分页的轮子造了不计其数个……
    dreamtrail
        56
    dreamtrail  
       2015-07-27 15:02:29 +08:00
    分页本来就不容易写完美,所以我都是用现成的分页模块
    hahasong
        57
    hahasong  
       2015-07-27 15:12:03 +08:00
    @aivier 抓住一个前端妹子
    雷猴,在羊城边度 how do you do
    ybh37
        58
    ybh37  
       2015-07-27 16:53:30 +08:00
    自己从前写到后就好了,后续不管用谁写的分页,都差不多……
    vincenttone
        59
    vincenttone  
       2015-07-27 17:00:07 +08:00
    学而不思或者思而不学,不仅仅是当不了程序员那么简单。
    zouxcs
        60
    zouxcs  
       2015-07-27 18:02:13 +08:00
    是内存的分页么
    scourgen
        61
    scourgen  
       2015-07-28 00:16:30 +08:00   2
    既然大家有兴趣,就简单和大家说一下我的经验吧,但肯定不是完整的方案,因为每个case有很多需要注意的点和分支剧情,也要考虑到每个业务的具体场景,讲完整是不可能的。

    @zjqzxc @TangMonk「6」这个问题可以用这个思路,比如内容是以时间排序的,那么就在每次查询的时候自动多带一个参数,也就是用户访问的时间点,并且在翻页的过程中记住这个时间点,在每页的查询语句里设置内容创建的时间要早于这个时间,这样用户不管翻多少页,由于有这个limit在,只要不删数据(即使删数据也可以用每页cache的方法,做到不影响其他页),总的结果集是固定的,所以每页的内容就是固定的。在用户重新进入第一页的时候,这个时间重新计算,这样就可以既不影响翻贴用户的阅读体验,又能够保证用户想看新内容的时候能够看的到。

    当然如果你是做APP之类的瀑布流信息展现方式的话,就用Last_ID之类的方案好了,不过其实瀑布信息流也不应该叫做分页。

    @raincious 「7」和「8」这两个问题和业务场景结合的很深,但总的来说是一个平衡问题,在以下两者之间取得一个平衡:
    1.以每页为cache单位,这样内容一旦增加(例如新增了一条信息在第一页),那所有的cache都应该被清空重建。这个策略在数据刷新很频繁的时候效率最低,在数据变更不频繁的时候效率最高。
    2.以每条内容为cache单位,这样一旦有新数据出现,不会有任何旧的cache被重建,只要每条数据不删不改,cache是可以一直用下去的,所以在数据刷新很频繁的时候效率较高,但这样cache会分布的很散,所以在数据刷新不频繁的时候效率会较低(分支剧情:如果你可以用redis的hmget的话当我没说)。
    两者你都无法接受的话,就可以考虑结合他们的优势,去做group cache,比如每页20条数据,你每10条数据做一个cache,这样悲观情况下取3次就能拿到整页的内容,乐观情况下2次即可,具体group里放数据的数量要根据你的使用场景去订。分支剧情:但如果这样做的话,就要考虑如果数据删除的话,会造成cache不对齐,那这时候你就可以考虑在每个group里前后多加x条数据,这样即使数据有改动,只要不是太频繁,就能做到现有的cache的重复利用。不过这个分支剧情貌似走的人比较少,对逻辑的严密性也比较高,在此只是提一下就不展开了。

    随便写写,一定有错,求别抬杠,求别黑,谢谢。
    final0pro
        62
    final0pro  
       2015-07-28 05:42:46 +08:00
    real time pagination like facebook and twitter is difficult to implement.

    You can find more information here: http://www.sitepoint.com/paginating-real-time-data-cursor-based-pagination/
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     918 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 22:18 PVG 06:18 LAX 14:18 JFK 17:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86