V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
darkmatter
V2EX  ›  程序员

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

  •  1
     
  •   darkmatter · 2015-07-26 19:01:17 +08:00 · 7137 次点击
    这是一个创建于 3407 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个分页功能折腾了两天都没写好
    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  
       2015-07-26 22:34:05 +08:00
    嗯嗯,我也不会写,都是用框架自带的
    iyaozhen
        28
    iyaozhen  
       2015-07-26 22:39:50 +08:00
    @likai PHP 时间转换不是挺方便嘛?
    jyjmrlk
        29
    jyjmrlk  
       2015-07-26 22:44:44 +08:00
    scourgen
        30
    scourgen  
       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 +08: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  
       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   ·   实用小工具   ·   2720 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 12:13 · PVG 20:13 · LAX 04:13 · JFK 07:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.