Квартиры, дома, земельные участки Краснодарского края без посредников. Объявления собственников недвижимости.
Реклама здесь
Главная
Примеры PHP Примеры JavaScript Примеры Ajax Примеры CSS,HTML

Универсальный постраничный вывод на PHP

Наверное, каждый разработчик сталкивался с необходимостью постраничного вывода какой-либо информации на экран. Практически в каждом проекте всегда есть "что-то", что не помещается на одну страницу и его нужно вывести по частям, классическим примером этому может служить, вывод информации в yandex или google. Все видели панель навигации, в низу страницы, между страницами, как сделать подобную панель навигации, и посвящена эта статья.

Статей, как сделать постраничный вывод много, но если информации будет очень много, на пример поиск в yandex с запросом, типа "php", то все эти скрипты, описанные в статьях, окажутся не пригодными к использованию, скрипт 1 реализует такой простейший постраничный вывод. Представьте, что по этому запросу yandex нашел 100 тыс. сайтов и на каждой странице находится по 10 сайтов, т.е. 10 тыс. страниц, и все эти ссылки вывести на экран :). Когда посетитель увидит этот ужас на вашем сайте, он сразу же "убежит" и никогда не вернется, а если это будет выглядеть, как показано в примере 1 - то это совсем другое дело.

|< ... 122 123 124 125 126 127 128 129 130 131 132 ... >|

Пример 1.

Так будет выглядеть панель навигации, которая описана в этой статье. Итак, приступим. Все комментарии я буду выдавать по ходу работы.

Но сейчас немного теории и принципа работы данного скрипта

Принцип работы скрипта прост, мы просто пробегаем всю окрестность текущей страницы. Ищем в окрестности текущей страницы действительные ссылки и выводим их. Весь остальной код - это просто для наглядности, в частности первый цикл (в скрипте № 2), он предназначен для того, чтобы количество ссылок было постоянным. Приведу пример опять же с yandex, когда по запросу найдено много сайтов, то внизу страницы вы увидите панель навигации приблизительно такого вида, как показано в примере 2.

1 2 3 4 5 6 7 8 ...

Пример 2.

Приблизительно так выглядит панель навигации в yandex, когда вы находитесь на первой странице. Когда вы перейдете на 8 страницу, то панель навигации будет уже выглядеть так, как показано в примере 3. 1 2 3 4 5 6 7 8 10 11 12 13 14 15 ...

Пример 3

Приблизительно так выглядит панель навигации в yandex, когда вы находитесь на 8 странице.

Как видно в примере 3, количество ссылок изменилось. Немного лучше выглядит панель навигации, в которой количество ссылок постоянно, но в таком скрипте больше кода.

Ссылки типа "следующая" отсутствуют, вместо них присутствуют ссылки на первую и последнюю страницу. Сделано сие намеренно - ни разу в жизни не нажимал на "следующая", если можно было нажать на номер страницы, а вот ссылки на первую и последнюю страницу не помешают.

Ниже приведен скрипт простейшего постраничного вывода, а также скрипты обеих навигационных панелей, т.е. с постоянным количеством ссылок и с отсеченными по "краям".

Скрипт 1. Простейший постраничный вывод


<?php
function link_bar($page$pages_count)
{
for (
$j 1$j <= $pages_count$j++)
{
// Вывод ссылки
if ($j == $page) {
echo 
' <a style="color: #808000;" ><b>'.$j.'</b></a> ';
} else {
echo 
' <a style="color: #808000;" href='.$_server['php_self'].'?page='.$j.'>'.$j.'</a> ';
}
// Выводим разделитель после ссылки, кроме последней
// например, вставить "|" между ссылками
if ($j != $pages_count) echo ' ';
}
return 
true;
// Конец функции

// Подключение к базе данных
mysql_connect('localhost''root''') or die('error! Нет соединения с сервером mysql!');
mysql_select_db('data_base') or die('error! Нет соединения с базой данных!');

// Подготовка к постраничному выводу
$perpage 10// Количество отображаемых данных из БД

if (empty(@$_GET['page']) || ($_GET['page'] <= 0)) {
$page 1;
} else {
$page = (int) $_get['page']; // Считывание текущей страницы
}
// Общее количество информации
$count mysql_numrows(mysql_query('select * from table')) or die('error! Записей не найдено!');
$pages_count ceil($count $perpage); // Количество страниц

// Если номер страницы оказался больше количества страниц
if ($page $pages_count$page $pages_count;
$start_pos = ($page 1) * $perpage// Начальная позиция, для запроса к БД

// Вызов функции, для вывода ссылок на экран
link_bar($page$pages_count);

// Вывод информации из базы данных
echo '<p><b>Постраничный вывод информации</b></p>';
$result mysql_query('select * from table limit '.$start_pos.', '.$perpage) or die('error!');
while (
$row mysql_fetch_array($result)) {
echo 
'<p>'.$row['some_field'].'</p>';
}
?>
Скопировать в буфер

Скрипт 2. С постоянным количеством ссылок


<?php
function universal_link_bar($page$count$pages_count$show_link)
{
// $show_link - это количество отображаемых ссылок;
// нагляднее будет, когда это число будет парное
// Если страница всего одна, то вообще ничего не выводим
if ($pages_count == 1) return false;
$sperator ' '// Разделитель ссылок; например, вставить "|" между ссылками
// Для придания ссылкам стиля
$style 'style="color: #808000; text-decoration: none;"';
$begin $page intval($show_link 2);
unset(
$show_dots); // На всякий случай :)
// Сам постраничный вывод
// Если количество отображ. ссылок больше кол. страниц
if ($pages_count <= $show_link 1$show_dots 'no';
// Вывод ссылки на первую страницу
if (($begin 2) && !isset($show_dots) && ($pages_count $show_link 2)) {
echo 
'<a '.$style.' href='.$_server['php_self'].'?page=1> |< </a> ';
}

for (
$j 0$j $page$j++) {
// Если страница рядом с концом, то выводить ссылки перед идущих для того,
// чтобы количество ссылок было постоянным
if (($begin $show_link $j $pages_count) && ($pages_count-$show_link $j 0)) {
$page_link $pages_count $show_link $j// Номер страницы
// Если три точки не выводились, то вывести
if (!isset($show_dots) && ($pages_count-$show_link 1)) {
echo 
' <a '.$style.' href='.$_server['php_self'].'?page='.($page_link 1).'><b>...</b></a> ';
// Задаем любое значение для того, чтобы больше не выводить в начале "..." (три точки)
$show_dots "no";
}
// Вывод ссылки
echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$page_link.'>'.$page_link.'</a> '.$sperator;
} else continue;
}
for (
$j 0$j <= $show_link$j++) // Основный цикл вывода ссылок
{
$i $begin $j// Номер ссылки
// Если страница рядом с началом, то увеличить цикл для того,
// чтобы количество ссылок было постоянным
if ($i 1) {
$show_link++;
continue;
}
// Подобное находится в верхнем цикле
if (!isset($show_dots) && $begin 1) {
echo 
' <a '.$style.' href='.$_server['php_self'].'?page='.($i-1).'><b>...</b></a> ';
$show_dots "no";
}
// Номер ссылки перевалил за возможное количество страниц
if ($i $pages_count) break;
if (
$i == $page) {
echo 
' <a '.$style.' ><b>'.$i.'</b></a> ';
} else {
echo 
' <a '.$style.' href='.$_server['php_self'].'?page='.$i.'>'.$i.'</a> ';
}
// Если номер ссылки не равен кол. страниц и это не последняя ссылка
if (($i != $pages_count) && ($j != $show_link)) echo $sperator;
// Вывод "..." в конце
if (($j == $show_link) && ($i $pages_count)) {
echo 
' <a '.$style.' href='.$_server['php_self'].'?page='.($i+1).'><b>...</b></a> ';
}
}
// Вывод ссылки на последнюю страницу
if ($begin $show_link $pages_count) {
echo 
' <a '.$style.' href='.$_server['php_self'].'?page='.$pages_count.'> >| </a>';
}
return 
true;
// Конец функции

// Подключение к базе данных
mysql_connect('localhost''root''') or die('error! Нет соединения с сервером mysql!');
mysql_select_db('data_base') or die('error! Нет соединения с базой данных!');

// Подготовка к постраничному выводу
$perpage 10// Количество отображаемых данных из БД
if (empty($_get['page']) || ($_get['page'] <= 0)) {
$page 1;
} else {
$page = (int) $_get['page']; // Считывание текущей страницы
}
// Общее количество информации
$count mysql_numrows(mysql_query('select * from table')) or die('error! Записей не найдено!');
$pages_count ceil($count $perpage); // Количество страниц
// Если номер страницы оказался больше количества страниц
if ($page $pages_count$page $pages_count;
$start_pos = ($page 1) * $perpage// Начальная позиция, для запроса к БД
// Вызов функции, для вывода ссылок на экран

universal_link_bar($page$count$pages_count10);

// Вывод информации из базы данных
echo '<p><b>Постраничный вывод информации</b></p>';
$result mysql_query('select * from table limit '.$start_pos.', '.$perpage) or die('error!');
while (
$row mysql_fetch_array($result)) {
echo 
'<p>'.$row['some_field'].'</p>';
}
?>
Скопировать в буфер

Скрипт 3. С отсеченными по "краям" ссылками


<?php
function yandex_link_bar($page$count$pages_count$show_link)
{
// $show_link - это количество отображаемых ссылок;
// нагляднее будет, когда это число будет парное
// Если страница всего одна, то вообще ничего не выводим
if ($pages_count == 1) return false;
$sperator ' '// Разделитель ссылок; например, вставить "|" между ссылками
// Для придания ссылкам стиля
$style 'style="color: #808000; text-decoration: none;"';
$begin $page intval($show_link 2);
unset(
$show_dots); // На всякий случай :)
// Сам постраничный вывод
// Если количество отображ. ссылок больше кол. страниц
if ($pages_count <= $show_link 1$show_dots 'no';
// Вывод ссылки на первую страницу
if (($begin 2) && ($pages_count $show_link 2)) {
echo 
'<a '.$style.' href='.$_server['php_self'].'?page=1> |< </a> ';
}
for (
$j 0$j <= $show_link$j++) // Основный цикл вывода ссылок
{
$i $begin $j// Номер ссылки
// Если страница рядом с началом, то увеличить цикл для того,
// чтобы количество ссылок было постоянным
if ($i 1) continue;
// Подобное находится в верхнем цикле
if (!isset($show_dots) && $begin 1) {
echo 
' <a '.$style.' href='.$_server['php_self'].'?page='.($i-1).'><b>...</b></a> ';
$show_dots "no";
}
// Номер ссылки перевалил за возможное количество страниц
if ($i $pages_count) break;
if (
$i == $page) {
echo 
' <a '.$style.' ><b>'.$i.'</b></a> ';
} else {
echo 
' <a '.$style.' href='.$_server['php_self'].'?page='.$i.'>'.$i.'</a> ';
}
// Если номер ссылки не равен кол. страниц и это не последняя ссылка
if (($i != $pages_count) && ($j != $show_link)) echo $sperator;
// Вывод "..." в конце
if (($j == $show_link) && ($i $pages_count)) {
echo 
' <a '.$style.' href='.$_server['php_self'].'?page='.($i+1).'><b>...</b></a> ';
}
}
// Вывод ссылки на последнюю страницу
if ($begin $show_link $pages_count) {
echo 
' <a '.$style.' href='.$_server['php_self'].'?page='.$pages_count.'> >| </a>';
}
return 
true;
// Конец функции

// Подключение к базе данных
mysql_connect('localhost''root''') or die('error! Нет соединения с сервером mysql!');
mysql_select_db('data_base') or die('error! Нет соединения с базой данных!');

// Подготовка к постраничному выводу
$perpage 10// Количество отображаемых данных из БД
if (empty($_get['page']) || ($_get['page'] <= 0)) {
$page 1;
} else {
$page = (int) $_get['page']; // Считывание текущей страницы
}
// Общее количество информации
$count mysql_numrows(mysql_query('select * from table')) or die('error! Записей не найдено!');
$pages_count ceil($count $perpage); // Количество страниц
// Если номер страницы оказался больше количества страниц
if ($page $pages_count$page $pages_count;
$start_pos = ($page 1) * $perpage// Начальная позиция, для запроса к БД
// Вызов функции, для вывода ссылок на экран

yandex_link_bar($page$count$pages_count10);

// Вывод информации из базы данных
echo '<p><b>Постраничный вывод информации</b></p>';
$result mysql_query('select * from table limit '.$start_pos.', '.$perpage) or die('error!');
while (
$row mysql_fetch_array($result)) {
echo 
'<p>'.$row['some_field'].'</p>';
}
?>
Скопировать в буфер

Переменные, которые требуют подробного описания:
$page - Текущая страница, передается от скрипта к скрипту методом get.
$perpage - Количество отображаемых данных из базы данных, на примере yandex - это количество ссылок на сайты, отображаемых на одной странице.
$count - Общее количество информации, на примере yandex - это количество найденных сайтов по запросу.
$pages_count - Количество страниц, без комментариев.
$start_pos - Начальная позиция, используется только в запросе к базе данных.

Вот и все! Универсальный постраничный вывод готов ;).

Источник: http://php.com.ua/

Автор: - zest

Дополнение применительно к MySQL

Пусть есть база с новостями, на странице надо выводить на 10 новостей, текущая страница находится в переменной $_GET['p']

раньше это выглядело так:


<?php
$query  
"SELECT * FROM `news` ORDER BY `id`";
$result = @mysql_query($query);
$total  mysql_num_rows($result);
                        
for(
$i 10*$_GET['p']; $i 10*($_GET['p'] + 1) && $i $total$i++)
{...}
?>
Скопировать в буфер

всё же на самом деле в несколько раз проще и понятнее если немного поглубже ознакомится с MySQL того же самого можно добиться след. запросом:


<?php
$query  
"SELECT * FROM `news` ORDER BY `id` DESC LIMIT ".($_GET['p'])*10.", ".10;
$result mysql_query($query);
$total  mysql_num_rows($result);
    
for(
$i 0$i $total$i++)
{...}
?>
Скопировать в буфер
Построю дом, возьмусь за дерево. Папа Карло. Изумительная доска пола массив дешево.
верстак слесарный

© Copyright 2008-2012 by KDG