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.SU

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


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

> Без описания
sonk
Отправлено: 07 Апреля, 2011 - 21:48:39
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2011  


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




Люди, помогите! Я в PHP не давно, написал скрипт новостей, но как сделать пагинацию не знаю(
Помогите плз!
Вот скрипт вывода новостей:

Спойлер (Отобразить)
Данные подключения я заменил на ***
 
 Top
Haron
Отправлено: 08 Апреля, 2011 - 00:49:04
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


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




Сперва разберёмся, что же нам надо для пагинации:

1). Совершенно очевидно, что сами новости. А именно - ЗНАТЬ ИХ ОБЩЕЕ КОЛИЧЕСТВО
2). Уже не так очевидно - КОЛИЧЕСТВО НОВОСТЕЙ, КОТОРОЕ МЫ ХОТИМ ВЫВОДИТЬ НА КАЖДУЮ СТРАНИЦУ
3). Ещё менее очевидно - СОБСТВЕННО НОМЕР ТЕКУЩЕЙ СТРАНИЦЫ

Кроме того - скажу что в MySQL - есть замечательный оператор LIMIT, а работает он так:

Синтаксис оператора LIMIT:
LIMIT [offset,] row_count

- offset сообщает сколько рядов от начала выборки нужно пропустить (Необязательный параметр)
- row_count указывает сколько рядов нужно выбрать

Пример:
- LIMIT 0, 20 (или просто LIMIT 20 опустив нулевой offset) выбирает первые 20 рядов (с 0 по 19 ряд)
- LIMIT 40, 20 указывает пропустить 40 (с 0 по 39 ряд) и выбрать следующие 20 (т.е. будут выбраны ряды с номера 40 по 59).

Как это использовать:
- Для начала - допустим что юзеру мы будем показывать по 4 новости на странице.
- Кроме того, параметром $_GET['page'] мы будем передавать номер страницы.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $query =  "select * from news ORDER BY id DESC";
  3. $result = mysql_query($query) or die("Invalid query: " . mysql_error());
  4.  
  5. $rows_max = mysql_num_rows($result); // Сколько всего новостей у нас в базе
  6. $show_pages = 4; // Сколько новостей покажем пользователю
  7. $this_page = filter_var($_GET['page'], FILTER_SANITIZE_NUMBER_INT); // Номер текущей страницы
  8. // (По полезнейшей функции filter_var() - курим мануал)
  9.  
  10. if ($this_page)
  11. {
  12.         $offset = (($show_pages * $this_page) - $show_pages);
  13. }
  14. else
  15. {
  16.         $this_page = 1; // Ставим в единицу (первая страница) если не передан параметр $_GET['page']
  17.         $offset = 0;
  18. }
  19.  
  20. // Запиливаем собственно, панельку со ссылками на страницы, если нужна пагинация
  21. if ($rows_max > $show_pages)
  22. {
  23.        $r = 1;
  24.        while ($r <= ceil($rows_max/$show_pages))
  25.        {
  26.            if ($r != $this_page)
  27.            {          
  28.                 echo '<a href="?page=' . $r . '" title="Перейти на страницу '$r'">'$r'</a>';
  29.            }
  30.            else
  31.            {
  32.                echo '<b>' . $r . '</b>'; // Если это текущая страница - то ссылка на саму себя не нужна
  33.             }
  34.             $r++;      
  35.        }
  36. }
  37.  
  38. $query_limited = "select * from news ORDER BY id DESC LIMIT $offset, $show_pages";
  39. $final_result = mysql_query($query_limited);
  40.  
  41. while ($row = mysql_fetch_assoc($final_result)) {  
  42.     echo '<center><div id="novosti"><table border="0" width="706"><td><strong><center> <div id="novostin"><div id="novostip">'.$row["name"].'</a><br /></div><hr></hr></center></strong><div id="novostit">' ;
  43.     echo $row["text"].'</div><div id="novostif"><br /></div></div></td></table></div><br />' ;
  44. }
  45. ?>


Добавлю ещё кое-что:
Это самый простейший вариант организации постраничной навигации.
Здесь не учитывается ситуация, когда новостей 100500, и выводить 9000 номеров страниц - не есть гуд.

(Отредактировано автором: 08 Апреля, 2011 - 01:12:18)



-----
И чё?
 
 Top
Fobius
Отправлено: 08 Апреля, 2011 - 11:07:24
Post Id


Гость


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


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




PHP:
скопировать код в буфер обмена
  1.  
  2. $query =  "select * from news ORDER BY id DESC";
  3. $result = mysql_query($query) or die("Invalid query: " . mysql_error());
  4.  
  5. $rows_max = mysql_num_rows($result); // Сколько всего новостей у нас в базе


Не рационально передавать из базы все записи из таблицы и считать количество строк... Информации может быть ОЧЕНЬ много...

PHP:
скопировать код в буфер обмена
  1.  
  2. $result = mysql_query("SELECT COUNT(id) AS count FROM `news`");
  3. $row = mysql_fetch_assoc($result);
  4. $rows_max = $row['count']
  5.  

так акуратней будет...
 
 Top
DenkonK
Отправлено: 15 Января, 2015 - 01:06:29
Post Id


Новичок


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


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




Спасибо Haron, мне очень помогло. Просветил по некоторым моментам )
 
 Top
LIME
Отправлено: 15 Января, 2015 - 01:16:55
Post Id


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


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


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




раз уж мы разговариваем с мертвецами то я поправлю Fobiusа
mysql_num_rows ничего не передает из базы кроме кол-ва строк удовлетворяющих запросу
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(id) AS count FROM `news`
лучше заменить на
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(*) FROM news
так как COUNT(*) не высчитывается а хранится ...если без условий выборки
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB