PHP.SU

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


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

> Описание: Постраничная навигация на php
php-beginer
Отправлено: 10 Ноября, 2017 - 10:22:56
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Нояб. 2017  


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




Пока только пробую php (месяц-три от силы ваяю). Дошло дело до постраничной навигации.
Своими колхозными знаниями решил попробовать повтор SQL запроса с лимитом, где начало и конец выборки подставляются в зависимости от номера страницы, получаемого через адресную строку GET-запросом. Пришел к урлу формата index.php?p=n, где n - текущий номер страницы. Встроил проверку номера на то, что это целое и положительное число, жестко задал лимит (пока по 2 записи на страницу), определил количество страниц (результат запроса на подсчет количества строк в таблице, деленный на количество записей, которое планируется выводить на странице), проверил, что полученное значение номера не превышает общее количество страниц. После сформировал массив номеров страниц как диапазон значений от 1 до общего количества страниц. Далее, красиво вывел номера с ссылками на соответствующие страницы в теле индексной страницы
Собственно, проблема заключается в том, что главная страница (она же первая) корректно отображается только в случае, если урл чистый, или указан нулевой номер. При прямом заходе на index.php?p=1 наблюдаю следующую картину: показывается запись, которая должна быть второй на первой странице, и первая запись со второй страницы. Номера выше единицы работают нормально.
Пытался добавить дополнительное условие для первого номера - на этом скрипт прекратил работать и стал показывать содержимое первой страницы на всех номерах.
Код прилагается ниже (писал сам, ничего ниоткуда не копировал):

Основной контроллер articles.php - сниппет подсчета количества страниц, проверки текущего номера и формирования массива номеров
PHP:
скопировать код в буфер обмена
  1.  
  2. $total = mysql_query("SELECT COUNT(*) FROM `articles`");
  3. $per_page = 2;
  4. $pages = $total / ($per_page);
  5. $p = $_GET['p'];
  6. $check_p = is_integer($p);
  7. if (($p < 0)||($check_p = false)||($p > $pages)) exit(include '/404.php');
  8. else{
  9. if (!$p) $start = 0;
  10. else $start = $p;
  11. $prev = $p - 1;
  12. $next = $p + 1;
  13. if (($p = 0) || (!$p)){
  14. $prev = 1;
  15. $next = 2;
  16. if ($next > $pages) $next = $pages;    
  17. }
  18. $border = range(1, $pages);
  19. exit (include "/tp/stati.php");
  20. }
  21.  


Файл pagination.php - сниппет, отвечающий за вывод номеров с ссылками на соответствующие страницы
PHP:
скопировать код в буфер обмена
  1.  
  2. foreach ($border as $value) {
  3. echo '<li><a href='.'"/articles.php?p='.$value.'">'.$value.'</a></li>';
  4. }
  5.  


Фрагмент файла stati.php - собственно, сам запрос на выборку и сортировку
PHP:
скопировать код в буфер обмена
  1. $result=mysql_query("SELECT id, title, description, date, time, author, snippet_text, topic, img FROM `articles` ORDER BY date DESC LIMIT $start, $per_page");


Вопрос именно с ситуацией, когда p=1. В логах сервера пишется, что в лимит при p=1 подставляется 1,2, а нужно 0,2. Именно поэтому происходит смещение выборки. Подскажите, пожалуйста, как решить этот вопрос. Заранее огромное спасибо за ответы. Также хотелось бы знать, насколько подход с повторением запроса с лимитом правильный. Если есть альтернативные варианты, также готов ознакомиться.
 
 Top
Sail
Отправлено: 11 Ноября, 2017 - 15:14:51
Post Id



Участник


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


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




php-beginer пишет:
В логах сервера пишется, что в лимит при p=1 подставляется 1,2, а нужно 0,2.

Страницы нумеруете от 1?
Начните с добавления проверки равенства этой переменной единице при инициализации $start (строка 9 первого листинга).
Затем ответьте на вопрос: "Почему в 13-й строке первого листинга $p присваивается, не проверяется, а присваивается значение ноль, и, после исправления этой опечатки надо ли сравнивать с нулем, а не с единицей?"
Ну а дальше будет видно Улыбка
 
 Top
php-beginer
Отправлено: 11 Ноября, 2017 - 19:17:40
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Нояб. 2017  


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




Чувствовал, что решение на поверхности. Большое спасибо Хорошо
 
 Top
Sail
Отправлено: 11 Ноября, 2017 - 19:36:58
Post Id



Участник


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


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




php-beginer, там, кстати, ещё есть присваивание вместо сравнения...
 
 Top
php-beginer
Отправлено: 11 Ноября, 2017 - 22:39:54
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Нояб. 2017  


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




Sail пишет:
php-beginer, там, кстати, ещё есть присваивание вместо сравнения...

Уже поправил. Спасибо
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB