谈开心网留言版的分页功能

前段时间研究了一下开心网,发现一个比较适用的分页功能,同时也发现了一个Bug.

众所周知,数据库中的Limit实现如果使用offset的话效率是很低的,所以开心网的留言版采用了一种比较巧妙的方法,给定一个start参数,然后当前页面从 start开始显示 xx条,这样在SQL中就避免了使用offset带来的效率低的问题。

而开心在使用这个方法的时候忽略了start可能被用户输入随意的一个值,比如:

http://www.kaixin001.com/comment/uindex.php?uid=28769518&start=423

这个时候你会发现页面底部会有 42.3 43.3页的显示,甚至会有:

http://www.kaixin001.com/comment/uindex.php?uid=28769518&start=10000000

这个时候就没有留言显示了,因为开心网 没有验证当前这个start是否存在了。

 

不过,对于普通用户来说,一般是不会发现了,使用也没有问题了,因为那个start 都是系统自动生成的,但对于某些特别的人可就不是这样了。

 

当然,发生这个问题也是有其原因的,只是 显示 小数页数,这个就有些问题了。

 

因为 start 有可能不是 被10整除的,有可能用户将某些留言删除掉, 这样导致了,当前页面显示的不一定是ID为 xx0(或者 xx1)的留言,就难分辨到底是用户输入还是系统生成了, 另外 ID和留言数也就可能没有直接联系了,只能确定 留言数 <= max(ID),也就不能直接判断当前start是否有效了,如果想确定还需要访问一次数据库,只是显示小数页码应该很容易解决吧。

 

 

This article is posted by on , link is .

Leave a reply

  • says:
    开心网就不清楚了,我只知道QQ空间的账号有时会弄串了,头像和帐户不搭
  • says:
    比如 留言版的 primarykey为 (user_id, reply_id) 那么, SQL : select * from tablename where user_id = 'xxx' and reply_id > start limit 10; 就是这样子了。 这样就避免了类似这样的SQL: select * from tablename where user_id = 'xxx' limit 100,110;
  • says:
    start参数在sql里怎么用呢?
  • says:
    start参数在sql里怎么用呢?