У меня есть система 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.