Покинул форум
Сообщений всего: 56
Дата рег-ции: Февр. 2013
Помог: 0 раз(а)
Привет!
Ох.. Даже не представляю как объяснить суть моего вопроса. В общем так. У меня вопрос по поводу постраничной навигации. Сделал навигацию на основе выборки данных из БД посредством LIMIT.
$start=$pages*($pg-1);// высчитываю позицию, с которой буду впоследствии делать выборку из БД
$get_data=mysql_query("SELECT `field_1` FROM `base_1` ORDER BY `id` DESC LIMIT $start, $pages");
// далее через цикл вывожу данные из массива на страницу
Думаю, подобную модель навигации, встречали все Вэб-Программисты. Она достаточно проста и понятна. И посему думаю нет необходимости в разъяснении её принципа работы.
Вопрос в другом. Представим, что в базе данным всего у нас имеются 4 записи. На страницу мы выводим первые 3 записи(пример на изображении). Чтобы вывести последнюю запись, используем кнопку пагинации(Показать ещё). При нажатии на кнопку, посылается запрос на сервер с номером страницы "2" и в последствии, к имеющимся трём записям, добавляется последняя - четвёртая запись. Здесь, всё ясно и понятно.
Теперь мы подошли к сути вопроса. В правом верхнем углу каждой записи, имеется кнопка удалить. Если мы попробуем удалить первую запись на странице, а затем нажмём на кнопку "Показать ещё", то ничего хорошего не происходит. Так как в базе данных, уже осталось только 3 записи. А мы пытаемся вывести последнюю, четвертую запись, которой по своей сути, после удаления первой записи, больше не существует(так как она сдвинулась на одну позицию вверх). Задачка. Как в этом случае вывести последнюю запись на страницу? Прикреплено изображение (Нажмите для увеличения)
caballero
Отправлено: 09 Января, 2014 - 13:40:34
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
не вижу проблеммы. Ну изменилось количество в Бд и что?
Пересчитал страницвы и выводишь опять сначала
А не могли бы вы разъяснить принцип в трёх словах? Номера записей `id` в таблице, у меня AUTO_INCREMENT. Кстати, пагинация построена на основе ajax запросов к серверу.
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012 Откуда: Запорожье, Украина
Помог: 19 раз(а)
Сделайте ещё одну колонку, в которой у вас будет хранится порядковый номер записи. Можно было бы использовать id но тогда при удалении будет нарушаться последовательность записей, например 1,2,5,6,7,9 и т.д.
Может, оставить всё также, но просто как-то по другому рассчитывать offset...
IllusionMH
Отправлено: 09 Января, 2014 - 14:59:30
Активный участник
Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011 Откуда: .kh.ua
Помог: 242 раз(а)
StasHappy, как плохой, но надежный вариант: хранить id записей который выведены(с учетом удалений после вывода) и потом при выборке использовать NOT IN, а сортировать как обычно, и выбирать через LIMIT N
Заодно можно параллельно проверить: не удалил ли кто-нибудь параллельно какую-нибудь из записей, которые выведены в данный момент.
Из минусов: очевидные проблемы с передачей списка туда-сюда и на больших числах NOT IN будет совсем не круто
Покинул форум
Сообщений всего: 56
Дата рег-ции: Февр. 2013
Помог: 0 раз(а)
IllusionMH. А что если нажимая на кнопку "Показать ещё", отправлять на сервер не только номер запрашиваемой страницы, а ещё и количество удаленных записей. А впоследствии, использовать это число при просчёте параметра offset. Например:
Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011 Откуда: .kh.ua
Помог: 242 раз(а)
StasHappy, если параллельно кто-то(user2) тоже удалил пару записей, а у user1 они еще отображаются, тогда сдвиг будет учтен в большую сторону и пара нужных записей будет пропущена.
Это очень сильно зависит от самой системы, что нужно учитывать, а чего точно не будет при 10 изменениях в системе.
StasHappy
Отправлено: 09 Января, 2014 - 16:06:07
Новичок
Покинул форум
Сообщений всего: 56
Дата рег-ции: Февр. 2013
Помог: 0 раз(а)
Цитата:
А что если нажимая на кнопку "Показать ещё", отправлять на сервер не только номер запрашиваемой страницы, а ещё и количество удаленных записей.
Этот вариант вполне неплох и работает. Выборка производится хорошо.
Цитата:
Если параллельно кто-то(user2) тоже удалил пару записей, а у user1 они еще отображаются, тогда сдвиг будет учтен в большую сторону и пара нужных записей будет пропущена.
А вот тут, спасибо вам за хорошие мысли. Я как-то и не думал об этом. На досуге надо будет решать и этот вопрос.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.