Сейчас: 00:54:21   26-го апреля 2024 г.
UsefulScript.ruСкриптыСложные менюПостраничная навигация
20
59

Постраничный вывод или постраничная навигация

При выводе из MySQL большого количества информации на отдельные странички сайта эти странички рекомендуется разбивать на более мелкие странички. Это делается для удобства работы посетителей и увеличения скорости загрузки сайта.


Предположим, на Вашем сайте из MySQL выводится очень большая таблица или большое количество комментариев к теме. Чтобы не загружать всю таблицу разом (или все комментарии), делается добавление постраничной навигации (или постраничного вывода). Таким образом, посетитель сам решит, хочет ли он видеть продолжение таблицы или остальные комментарии, а мы в свое время экономим ресурсы сервера.


На нашем сайте, к примеру, имеется Черный список IP адресов. Данный список IP адресов как раз и разбит на отдельные странички для удобства их просмотра. А вообще тема является логическим продолжением темы Формы добавления комментариев к темам.


Для получения на своем сайте постраничного вывода из MySQL, как на нашей страничке Черного списка IP адресов, добавьте в начало странички, которую будем разбивать, следующую функцию, отвечающую за формирование меню постраничной навигации:

PHP код:
<?php
function col_pages($count$this$radius) {
 
$j=0$out=""$td='<td width="35" bgcolor="lightgreen">';
 if ((
$this-$radius)<1$i=1;
     else 
$i=$this-$radius;
 if (
$i==1$i++;

 if ((
$count-($radius*2+1))<$i$i=$count-($radius*2+1);
 if (
$i<2$i=2;

 if (
$this!=1)
  
$out.=$td.'<a href="'.$_SESSION[mess_url].'?comment_list=1">1</a></td>';
     else 
$out.=$td.'<b>[ 1 ]</b></td>';

 if (
$i>2$out.=$td.'...</td>';

 while (((
$i<=($this+$radius)) or ($j<($radius*2+1))) and ($i<$count)) {
 if (
$i!==$this)
  
$out.=$td.'<a href="'.$_SESSION[mess_url].'?comment_list='.$i.'">'.$i.'</a></td>';
     else 
$out.=$td.'<b>[ '.$i.' ]</b></td>';
 
$i++; $j++;
 }
 if (
$i<$count$out.=$td.'...</td>';
 if (
$count>1) {
     if (
$count!=$this)
      
$out.=$td.'<a href="'.$_SESSION[mess_url].'?comment_list='.$count.'">
      '
.$count.'</a></td>';
     else 
$out.=$td.'<b>[ '.$count.' ]</b></td>';
 }
 return 
$out;
}
?>

У данной функции имеются входные параметры: $count - количество страниц, $this - текущая страница, $radius - количество соседних ссылок в меню навигации.


Далее нам необходимо считывать из строки адреса номер страницы, определить общее количество страниц для формирования меню постраничной навигации, сделать защиту от неправильного ввода несуществующих страничек и сформировать правильный запрос к MySQL чтобы были выведены соответствующие страничке данные. Для этого добавьте такой PHP код:

PHP код:
<?php
$result 
mysql_query("SELECT * FROM comment WHERE theme_id=id_Вашей_темы"$link);
$count_list=ceil(mysql_num_rows($result)/10);

if (
is_numeric($_GET[comment_list]) and $_GET[comment_list]>0) {
if (
$_GET[comment_list]>$count_list$comment_list=$count_list;
    else 
$comment_list=$_GET[comment_list];
}
else 
$comment_list=1;
if (
$comment_list==0$comment_list=1;

$result mysql_query("SELECT * FROM comment WHERE theme_id=id_Вашей_темы
            ORDER BY id LIMIT "
.($comment_list*10-10).",10"$link);
$number mysql_num_rows($result);
for (
$n=1$n<=$number$n++) {
    
$comments=mysql_fetch_array($result);
    
// Оформление и вывод комментариев
    
echo '<div>'.$comments[message].'</div>';
}
?>

В приведенном выше коде подразумевается, что разбивка страничек будет по 10 комментариев каждая. Если Вы планируете изменить данное количество на другое, то просто замените в четырех местах кода число 10 на требуемое.


Теперь, когда все необходимые данные получены, можно формировать меню постраничной навигации. Делается это так:

PHP код:
<?php
echo '<table style="border: 1px solid #4874a3;" cellspacing="2" cellpadding="0">';
 echo 
'<tr align="center">';
  echo 
'<td bgcolor="lightgreen" width="65">';
if (
$comment_list>1) echo '<a href="'.$_SESSION[mess_url].'">В начало</a>';
    else echo 
'В начало';
  echo 
'</td>';
  echo 
'<td bgcolor="lightgreen" width="65">';
if (
$comment_list>1) echo '<a href="'.$_SESSION[mess_url].'?comment_list='.
(
$comment_list-1).'">Назад</a>';
    else echo 
'Назад';
  echo 
'</td>';

echo 
col_pages((int)$count_list, (int)$comment_list3);

  echo 
'<td bgcolor="lightgreen" width="65">';
if (
$comment_list<$count_list) echo '<a href="'.$_SESSION[mess_url].'?comment_list='.
(
$comment_list+1).'">Вперед</a>';
    else echo 
'Вперед';
  echo 
'</td>';
  echo 
'<td bgcolor="lightgreen" width="65">';
if (
$comment_list<$count_list) echo '<a href="'.$_SESSION[mess_url].'?comment_list='.
$count_list.'">В конец</a>';
    else echo 
'В конец';
  echo 
'</td>';
 echo 
'</tr>';
echo 
'</table>';
?>

В результате у Вас должна получиться постраничная навигация, подобная той, которая имеется на нашей страничке Черного списка IP адресов.

Дата создания: 20:24:56 07.07.2012 г.
Дата обновления: 18:49:08 12.07.2012 г.
Посещений: 9123 раз(а).

Комментарии посетителей (10 шт.):
Incognito
0
# 212
(12:57:26  12.07.2012 г.)

Скажите, пожалуйста, а существует ли возможность сделать этот скрипт более универсальным, не только для mysql, а для любого содержимого?
Ответить

Administrator
3
# 213
(19:32:31  12.07.2012 г.)

Incognito, это сделать довольно просто.
Предположим, необходимые данные лежат в массиве $comments[$n], который мы получили при считывании из файла или другим методом.
Тогда второй код меняем на такой:
$count_list=ceil(sizeof($comments)/10);
if (is_numeric($_GET[comment_list]) and $_GET[comment_list]>0) {
if ($_GET[comment_list]>$count_list) $comment_list=$count_list;
else $comment_list=$_GET[comment_list];
}
else $comment_list=1;
if ($comment_list==0) $comment_list=1;

for ($n=1; $n<=10; $n++) {
// Оформление и вывод комментариев
echo '<div>'.$comments[$comment_list*10-10+$n].'</div><br>';
}
Ответить

Алексей
0
# 229
(12:29:23  24.07.2012 г.)

Спасибо! Скоро буду писать очень большую статью для своего сайта - Ваш скрипт как раз меня очень выручит!
Ответить

Роман
2
# 378
(20:21:16  05.11.2012 г.)

Сделал всё как у вас написано, но ничего не выводится:( А вот листалка работает :) Помогите, пожалуйста, я - новичок в этом деле. Заранее благодарю.
Ответить

Administrator
3
# 379
(22:18:02  05.11.2012 г.)

Роман, данная тема является продолжением темы Форма добавления комментариев к темам, поэтому тут не все так просто.
Попробуйте добавить в самом начале странички следующее:
session_start();
$_SESSION[full_url]=mysql_real_escape_string(basename($_SERVER['REQUEST_URI']));
$_SESSION[mess_url]=strtok($_SESSION[full_url], '?');
Зарегистрируйтесь лучше на нашем форуме и изложите подробно, что не выходит, тогда мы наверняка сможем Вам помочь.
Ответить

Роман
0
# 3454
(16:42:29  26.09.2016 г.)

Доброго времени суток!
подключил этот код, к форме добавления комментариев, но у меня комментарии не выводятся постранично, по 10 штук, а как 30 штук, так и осталось. Но, форма со страницами вывелась, а выше 10 комментариев, просто в виде текста.
Да оно и не удивительно, после я понял почему, ведь в коде написано

// Оформление и вывод комментариев
echo '<div>'.$comments[message].'</div>';

Что значит, идёт просто выборка из поля (строки таблицы) - message.

Вопрос: а как же её прикрутить к форме комментариев, какую сюда переменную подставить? Напишите код пожалуйста.
Ответить

Administrator
0
# 3459
(23:03:12  26.09.2016 г.)

Это для примера сделал вывод всего одного элемент массива. Посмотрите, как Вы раньше выводили комментарии внутри цикла и скопируйте блок кода оттуда внутрь данного цикла взамен:
// Оформление и вывод комментариев
echo '<div>'.$comments[message].'</div>';
Ответить

Андрей
0
# 4142
(16:35:06  21.11.2017 г.)

Здравствуйте, уважаемый администратор. У меня к вам просьба.

1. Помогите правильно в скрипте поменять mysql на mysqli.
Сам пробовал, на примере:
$res = mysqli_query($db, "SELECT * FROM comment WHERE theme_id='".$theme_id."' and moderation=1 ORDER BY id");
но где нужно менять и как оптимальней это сделать не уверен.

2. Как лучше оформить ссылки [1] [2] ... и т.д. Если класс для атрибута href, то где именно
<a class="" href="'.$_SESSION[mess_url].'?comment_list=1">1</a>
или можно как-то по-другому задать стиль.

3. И что будет, когда на странице ссылок будет 20, например, то как они будут отображаться?
[1] [2] ... [20]
или как-то иначе?
Если ссылок пять или шесть, то они будут видны все, а если 20 или 30, то как в этом случае проблему решить?

Заранее спасибо за ваш ответ, очень надеюсь, что вы поможете разобраться.
Ответить

Administrator
0
# 4148
(21:28:59  24.11.2017 г.)

1. Вы все сделали правильно.
2. Можно и так. А можно задать стиль, например, родительскому <table>
а в <style> прописать стиль для всех ячеек:
.имя_стиля_table td { стили }
3. Посмотрите рабочий пример (под таблицей) на страничке черный список IP адресов.
Ответить

Андрей
0
# 4209
(16:39:17  29.12.2017 г.)

Здравствуйте, подскажите пожалуйста, какие изменения нужно сделать, когда из БД вытаскивается несколько полей?

$res = mysqli_query ($db,"SELECT id, img, title, description, date, message FROM thema ORDER BY id");

У меня поля id, img, title, description, date - создают на странице блок (их 8) и при клике на ссылку загружается статья

http://site.ru/article.php?id=1

где из базы вытаскивается содержимое из поле message.

Так вот, в коде выше у меня в переменной $res все поля включая message, также имеется строчка

echo '<div>'.$comments[message].'</div>';

И у меня вместе загружается с блоком содержимое поля message, которое должно быть на другой странице

Если одно поле вытаскивается message, то всё понятно, а у меня несколько полей. Как данный момент реализовать, чтобы постраничная навигация работала для блоков с полями (id, img, title, description, date) на странице blog.php, а не для поля message, для страницы article.php, так как там и так одна страница, статья.

Или менять строчку:
echo '<div>'.$comments[message].'</div>';
на
echo '<div>'.$comments[id, img, title, description, date].'</div>';

Спасибо за ответ !
Ответить

Закрыть
Ваше имя:
384 + 6 =
Добавить комментарий:
Ваше имя:
384 + 6 =

Перед публикацией все комментарии проходят обязательную модерацию!

Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
Посетителей онлайн: 6

Какие темы необходимо добавлять на сайт?