Как избежать дублирования сообщений из базы данных в системе «бесконечной прокрутки»?

У меня есть система AJAX, которая извлекает сообщения из базы данных, а затем создает DIV в моем макете для их размещения. Когда пользователь достигнет конца страницы, тогда многие другие сообщения будут загружены API. Проблема в том, как я могу получить следующие 10 сообщений, которые являются только предыдущими сообщениями последнего, которые уже загружены? То же самое, что я хочу сделать, когда загружаю новые сообщения наверху, как показывать каждую запись в правильном порядке, не пропуская ни одной записи или дублируя какую-либо запись?

Извините за плохое объяснение и плохой английский.

Вам нужно сохранить идентификатор последнего полученного сообщения. Когда вы отправляете новый запрос, отправьте последний полученный идентификатор сообщения и получите php / mysql оттуда результаты.


Если ваш запрос выглядит примерно так:

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

Затем вам нужно будет изменить, чтобы быть чем-то более похожим:

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

Вы можете альтернативно использовать метод смещения, о котором упоминает Скотт.


Edit: Я предположил, что вы использовали идентификаторы auto-increment, потому что это так распространено. Поскольку вы этого не сделали, вам нужно каким-то образом отслеживать последнее возвращенное сообщение. Вы можете сделать это, сортируя записи так, чтобы они выходили в одном порядке каждый раз и использовали смещения.

Вероятно, вы могли бы использовать СМЕЩЕНИЕ в своем запросе, который работал бы, даже если бы вы хотели получить результаты, которые могут иметь нестандартные идентификаторы. Так что если бы у вас было –

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

Следующий запрос будет

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

и так далее, так как вы получаете все больше и больше записей. Ваш Javascript должен будет отслеживать смещение и отправлять его на сервер с помощью запроса AJAX.

Чтобы разрешить результаты с близкого расстояния, вы не можете использовать 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 ?> 

Когда пользователь загружает страницу, вы можете получить все последние 10 сообщений с загрузкой страницы,

например –

id POST 1 Post1 2 Post2 3 Post3. , , 10 Post10

Поэтому, когда пользователь прокручивает страницу внизу, вы вызовете свой код ajax и передаете последний идентификатор в качестве ввода и сделаете разбивку страницы с использованием LIMIT в своем SQL-запросе.

Например, мой последний идентификатор сообщения равен 50, а пользователь прокручивает вниз страницу. Так что запрос будет срабатывать, выберите * из tableName, где id <50 LIMIT 10

Это для старой почты, и в то время как если какой-либо новый пост, то вы можете проверить новое сообщение, используя новый запрос с последним идентификатором во время страницы обновления пользователя. Выберите * from tableName, где id> 50 LIMIT 10

Это для новой записи, возвратите обе коллекции в один запрос на страницу и, оценив оба варианта, вы можете вставить новый тег div, чтобы показать это.

Вы можете использовать комбинацию ajax и JSON, нажмите здесь, если вы хотите больше узнать о JSON и AJAX.