Наверное, каждый разработчик сталкивался с необходимостью постраничного вывода какой-либо информации на экран. Практически в каждом проекте всегда есть "что-то", что не помещается на одну страницу и его нужно вывести по частям, классическим примером этому может служить, вывод информации в 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 + 1 < $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_count, 10); // Вывод информации из базы данных 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 + 1 < $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_count, 10); // Вывод информации из базы данных 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 - Начальная позиция, используется только в запросе к базе данных. Вот и все! Универсальный постраничный вывод готов ;).
|