Постраничный вывод или постраничная навигация
При выводе из MySQL большого количества информации на отдельные странички сайта эти странички рекомендуется разбивать на более мелкие странички. Это делается для удобства работы посетителей и увеличения скорости загрузки сайта.
Предположим, на Вашем сайте из MySQL выводится очень большая таблица или большое количество комментариев к теме. Чтобы не загружать всю таблицу разом (или все комментарии), делается добавление постраничной навигации (или постраничного вывода). Таким образом, посетитель сам решит, хочет ли он видеть продолжение таблицы или остальные комментарии, а мы в свое время экономим ресурсы сервера.
На нашем сайте, к примеру, имеется Черный список IP адресов. Данный список IP адресов как раз и разбит на отдельные странички для удобства их просмотра. А вообще тема является логическим продолжением темы Формы добавления комментариев к темам.
Для получения на своем сайте постраничного вывода из MySQL, как на нашей страничке Черного списка IP адресов, добавьте в начало странички, которую будем разбивать, следующую функцию, отвечающую за формирование меню постраничной навигации:
<?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
$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
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_list, 3);
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 адресов.
Перед публикацией все комментарии проходят обязательную модерацию!
Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
Предположим, необходимые данные лежат в массиве $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>';
}
Попробуйте добавить в самом начале странички следующее:
session_start();
$_SESSION[full_url]=mysql_real_escape_string(basename($_SERVER['REQUEST_URI']));
$_SESSION[mess_url]=strtok($_SESSION[full_url], '?');
Зарегистрируйтесь лучше на нашем форуме и изложите подробно, что не выходит, тогда мы наверняка сможем Вам помочь.
подключил этот код, к форме добавления комментариев, но у меня комментарии не выводятся постранично, по 10 штук, а как 30 штук, так и осталось. Но, форма со страницами вывелась, а выше 10 комментариев, просто в виде текста.
Да оно и не удивительно, после я понял почему, ведь в коде написано
// Оформление и вывод комментариев
echo '<div>'.$comments[message].'</div>';
Что значит, идёт просто выборка из поля (строки таблицы) - message.
Вопрос: а как же её прикрутить к форме комментариев, какую сюда переменную подставить? Напишите код пожалуйста.
// Оформление и вывод комментариев
echo '<div>'.$comments[message].'</div>';
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, то как в этом случае проблему решить?
Заранее спасибо за ваш ответ, очень надеюсь, что вы поможете разобраться.
2. Можно и так. А можно задать стиль, например, родительскому <table>
а в <style> прописать стиль для всех ячеек:
.имя_стиля_table td { стили }
3. Посмотрите рабочий пример (под таблицей) на страничке черный список IP адресов.
$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>';
Спасибо за ответ !