谈开心网留言版的分页功能
前段时间研究了一下开心网,发现一个比较适用的分页功能,同时也发现了一个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是否有效了,如果想确定还需要访问一次数据库,只是显示小数页码应该很容易解决吧。