2

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

对不起,糟糕的解释和糟糕的英语。

4

4 回答 4

5

您需要存储最后检索到的消息的 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,因为它很常见。由于您不是,因此您需要一些方法来跟踪返回的最后一条消息。您可以通过以每次都以相同顺序出现并使用偏移量的方式对记录进行排序来做到这一点。

于 2012-11-20T17:42:02.583 回答
1

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

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

下一个查询是

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

当您获取越来越多的记录时,依此类推。您的 Javascript 必须跟踪偏移量并将其与 AJAX 请求一起发送到服务器。

于 2012-11-20T17:44:49.080 回答
1

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

但是您可以做的是在发布时向该行添加一个时间戳,然后在第一次加载时没有为 AJAX 句柄代码提供时间戳,因此它会全部获取它们并发送回运行查询的时间戳,然后当它接收它时然后可以使用不同的查询WHERE timestamp > $sentTimestamp

例如

<?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
?>
于 2012-11-20T17:58:18.527 回答
0

当用户加载页面时,您可以通过页面加载获取所有最后 10 个帖子,

例如 -

id 发布 1 发布 1 2 发布 2 3 发布 3。. . 10 帖子10

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

例如 - 我的最后一个帖子 id 是 50 并且用户向下滚动页面,所以查询会触发,Select * from tableName where id < 50 LIMIT 10

这是针对旧帖子的,这意味着如果有任何新帖子,那么您可以在用户刷新页面时使用带有最后一个 ID 的新查询来检查新帖子。Select * from tableName where id > 50 LIMIT 10

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

您可以使用 ajax 和 JSON 组合,如果您想了解更多关于 JSON 和 AJAX 的信息,请单击此处。

于 2012-11-20T18:41:42.530 回答