Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Php пагинация

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
StasHappy
Отправлено: 09 Января, 2014 - 13:25:17
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Привет!

Ох.. Даже не представляю как объяснить суть моего вопроса. В общем так. У меня вопрос по поводу постраничной навигации. Сделал навигацию на основе выборки данных из БД посредством LIMIT.

Пример:

PHP:
скопировать код в буфер обмена
  1. $pages = 3; // количество выводимых записей на страницу
  2.  
  3. $pg = trim($_POST['pg_numb']); // номер страницы
  4. $start = $pages*($pg-1); // высчитываю позицию, с которой буду впоследствии делать выборку из БД
  5.  
  6. $get_data = mysql_query("SELECT `field_1` FROM `base_1` ORDER BY `id` DESC LIMIT $start, $pages");
  7.  
  8. // далее через цикл вывожу данные из массива на страницу


Думаю, подобную модель навигации, встречали все Вэб-Программисты. Она достаточно проста и понятна. И посему думаю нет необходимости в разъяснении её принципа работы.

Вопрос в другом. Представим, что в базе данным всего у нас имеются 4 записи. На страницу мы выводим первые 3 записи(пример на изображении). Чтобы вывести последнюю запись, используем кнопку пагинации(Показать ещё). При нажатии на кнопку, посылается запрос на сервер с номером страницы "2" и в последствии, к имеющимся трём записям, добавляется последняя - четвёртая запись. Здесь, всё ясно и понятно.

Теперь мы подошли к сути вопроса. В правом верхнем углу каждой записи, имеется кнопка удалить. Если мы попробуем удалить первую запись на странице, а затем нажмём на кнопку "Показать ещё", то ничего хорошего не происходит. Так как в базе данных, уже осталось только 3 записи. А мы пытаемся вывести последнюю, четвертую запись, которой по своей сути, после удаления первой записи, больше не существует(так как она сдвинулась на одну позицию вверх). Задачка. Как в этом случае вывести последнюю запись на страницу?
Прикреплено изображение (Нажмите для увеличения)
asdf.jpg
 
 Top
caballero
Отправлено: 09 Января, 2014 - 13:40:34
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




не вижу проблеммы. Ну изменилось количество в Бд и что?
Пересчитал страницвы и выводишь опять сначала


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
imya
Отправлено: 09 Января, 2014 - 13:42:56
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


Помог: 19 раз(а)




При удалении обновлять номер записи - id ?


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
StasHappy
Отправлено: 09 Января, 2014 - 13:50:04
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. При удалении обновлять номер записи - id ?

А не могли бы вы разъяснить принцип в трёх словах? Номера записей `id` в таблице, у меня AUTO_INCREMENT. Кстати, пагинация построена на основе ajax запросов к серверу.

(Отредактировано автором: 09 Января, 2014 - 14:20:01)

 
 Top
imya
Отправлено: 09 Января, 2014 - 14:28:29
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


Помог: 19 раз(а)




Сделайте ещё одну колонку, в которой у вас будет хранится порядковый номер записи. Можно было бы использовать id но тогда при удалении будет нарушаться последовательность записей, например 1,2,5,6,7,9 и т.д.


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
StasHappy
Отправлено: 09 Января, 2014 - 14:30:49
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. Сделайте ещё одну колонку, в которой у вас будет хранится порядковый номер записи.
Спасибо за мысль. Попробую.
(Добавление)
И всё равно, ничего не понятно..


Может, оставить всё также, но просто как-то по другому рассчитывать offset...
 
 Top
IllusionMH
Отправлено: 09 Января, 2014 - 14:59:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




StasHappy, как плохой, но надежный вариант: хранить id записей который выведены(с учетом удалений после вывода) и потом при выборке использовать NOT IN, а сортировать как обычно, и выбирать через LIMIT N
Заодно можно параллельно проверить: не удалил ли кто-нибудь параллельно какую-нибудь из записей, которые выведены в данный момент.

Из минусов: очевидные проблемы с передачей списка туда-сюда и на больших числах NOT IN будет совсем не круто Недовольство, огорчение

(Отредактировано автором: 09 Января, 2014 - 15:02:22)

 
 Top
StasHappy
Отправлено: 09 Января, 2014 - 15:12:29
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




IllusionMH. А что если нажимая на кнопку "Показать ещё", отправлять на сервер не только номер запрашиваемой страницы, а ещё и количество удаленных записей. А впоследствии, использовать это число при просчёте параметра offset. Например:

PHP:
скопировать код в буфер обмена
  1. $pages = 3; // количество выводимых записей на страницу
  2.  
  3. $deleted = trim($_POST['numb_deleted']); // количество удалённых записей. Если ничего не было удаленно, то приходит число 0.
  4.  
  5. $pg = trim($_POST['pg_numb']); // номер страницы
  6.  
  7. $start = ($pages*($pg-1))-$deleted; // высчитываю позицию, с которой буду впоследствии делать выборку из БД

(Отредактировано автором: 09 Января, 2014 - 15:35:17)

 
 Top
IllusionMH
Отправлено: 09 Января, 2014 - 15:46:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




StasHappy, если параллельно кто-то(user2) тоже удалил пару записей, а у user1 они еще отображаются, тогда сдвиг будет учтен в большую сторону и пара нужных записей будет пропущена.
Это очень сильно зависит от самой системы, что нужно учитывать, а чего точно не будет при 10 изменениях в системе.
 
 Top
StasHappy
Отправлено: 09 Января, 2014 - 16:06:07
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Цитата:
А что если нажимая на кнопку "Показать ещё", отправлять на сервер не только номер запрашиваемой страницы, а ещё и количество удаленных записей.

Этот вариант вполне неплох и работает. Выборка производится хорошо.

Цитата:
Если параллельно кто-то(user2) тоже удалил пару записей, а у user1 они еще отображаются, тогда сдвиг будет учтен в большую сторону и пара нужных записей будет пропущена.

А вот тут, спасибо вам за хорошие мысли. Я как-то и не думал об этом. На досуге надо будет решать и этот вопрос.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB