如何避免在“无限滚动”系统中从数据库中获取重复的帖子?

时间:2012-11-20 17:39:46

标签: php javascript html mysql

我有一个AJAX系统,可以从数据库中获取帖子,然后在我的布局中创建DIV来放置它们。当用户到达页面末尾时,API将加载许多其他帖子。问题是,如何获得以下10个帖子,这些帖子只是之前已经加载的帖子?当我在顶部加载新帖子时,我想要发生同样的事情,如何以正确的顺序显示每个帖子而不会错过任何帖子或复制任何帖子?

对不好的解释和糟糕的英语感到抱歉。

4 个答案:

答案 0 :(得分:4)

您需要存储上次检索到的消息的ID。当您提交新请求时,发送最后收到的消息ID并让php / mysql从那里返回结果。


如果您的查询如下所示:

SELECT * FROM posts WHERE username='redcurley' LIMIT 10

然后你需要修改为更像是:

SELECT * FROM posts WHERE username='redcurley' AND id > :id LIMIT 10

您也可以使用Scott提到的偏移方法。


编辑:我认为您使用的是自动增量ID,因为它非常常见。既然你不是,你需要一些方法来跟踪最后返回的消息。您可以通过对记录进行排序,以便每次都以相同的顺序排出记录并使用偏移量。

答案 1 :(得分:1)

您可以在查询中使用OFFSET,即使您希望获得可能具有无序ID的结果,也可以使用OFFSET。所以,如果你有 -

SELECT * FROM posts WHERE username='foo' LIMIT 10

下一个查询将是

SELECT * FROM posts WHERE username='foo' LIMIT 10 OFFSET 10

等等,因为你获取越来越多的记录。您的Javascript必须跟踪偏移并使用AJAX请求将其发送到服务器。

答案 2 :(得分:1)

要允许近乎无限的结果,您不能使用AUTO_INCREMENT,因为最终会有限制。

你可以做的是,当发布时为行添加一个时间戳,然后在第一次加载时,没有给AJAX句柄代码添加时间戳,所以它获取所有时间戳并发送回查询运行时的时间戳。然后,它可以使用具有WHERE timestamp > $sentTimestamp

的其他查询

E.G

<?php
// AJAX handler code
$sqlQuery = "SELECT * FROM posts"

if(!empty($_REQUEST['lastPull'])){
    $sqlQuery .= " WHERE `timestamp` > ".mysql_real_escape_string($_REQUEST['lastPull']);
}
// do your query and formatting for AJAX response here
?>

答案 3 :(得分:0)

当用户加载页面时,您可以使用页面加载

获取所有最后10个帖子

例如 -

id POST 1 Post1 2 Post2 3 Post3 。 。 。 10 Post10

因此,当用户滚动页面底部时,您将调用您的ajax代码并将最后一个id作为输入传递,并在SQL查询中使用LIMIT进行分页。

例如 - 我的上一篇文章ID为50,用户向下滚动页面,因此查询将会触发, 从tableName中选择*,其中id&lt; 50 LIMIT 10

这是针对旧帖子,意思是如果有任何新帖子,那么你可以使用在用户刷新页面时使用最后一个id的新查询来检查新帖子。 从tableName中选择*,其中id&gt; 50 LIMIT 10

这是针对新帖子,将单个请求中的两个集合返回到页面,并通过评估两者,您可以插入新的div标签来显示此内容。

如果你想要更多关于JSON和AJAX的内容,你可以使用ajax和JSON组合Click Here