Постраничный вывод
- 24 July, 2008
- Posted in PHP
Tags : MySQL, PHP- 2 Comments
Начнем по обыкновению с постановки задачи. Необходимо организовать постраничный вывод любого рода контента. Поле деятельности – движок, написаный на PHP, и данные, которые хранятся в базе MySQL.
Разобьем нашу задачу на два подпункта. Нам необходимо организовать выбор из базы необходимой нам части информации (иными словами – страницы), а также сгенерировать меню навигации по страницам.
Я считаю наиболее удобной следующего вида схему навигации по страницам:
<< … n-1 n n+1 … >>,
где “<<” переход на первую страницу (“<< … ” не отображаются когда текущая страница первая), ” n ” – номер текущей страницы, “n-1″и “n+1″ – ссылки на предыдущую и следующую страницы соответственно, “…” просто три точки. =)
Теперь приступим непосредственно к делу. Для начала определим константу, которой присвоим максимально допустимое значение единиц контента на страницу.
DEFINE('ITEM_PER_PAGE', 4);
Следующим шагом необходимо узнать количество всех доступных элементов. Например:
$items_cnt_arr = $this->db->GetRow("SELECT COUNT(`id`) as `all` FROM `content` ");
# в этой переменно уже храниться общее кол-во элементов.
$items_cnt = $items_cnt_arr['all'];
#делим кол-во всех элементов на кол-во элементов на странице и округляем до большего
$max_pages = ceil($items_cnt/ITEM_PER_PAGE);
Теперь определить какой передаваемый параметр будет отвечать за запрашиваемую страницу и проверить допустимо ли значение, которое он принимает.
if ( empty($_GET['page']) || !is_numeric($_GET['page'])) {
# если передаваемое значение пусто или не число
$curr_page = 0;
} elseif ($_GET['page']>=$max_pages){
# если не превышает максимально допустимого числа страниц
$curr_page = ($max_pages-1);
} else {
# если входит в область допустимых значений
$curr_page = $_GET['page'];
}
Для того чтобы выбрать необходимые элементы для вывода на страницу теперь достаточно выполнить следующего рода запрос:
SELECT * FROM `content` LIMIT ".($curr_page*ITEM_PER_PAGE).", ".ITEM_PER_PAGE;
(выделенная жирным часть обязательно должна присутствовать
Теперь организуем генерацию меню навигации.
$_nav_text = '';
# ссылка на первую страницу
if ($curr_page>0) {
# если текущая страница не первая
$_nav_text .= '<a href="/phone/0" mce_href="/phone/0">«</a> ...';
}
for ($k=0;$k<3;$k++) {
# номер страницы, содержащейся в ссылке
$_link_id = $curr_page+($k-1);
if (($_link_id < $max_pages) && ($_link_id>=0)) {
if ($_link_id != $curr_page) {
# выводим ссылки на предыдущие и следующие страницы
$_nav_text .= ' <a href="index.php?page='.$_link_id.'" mce_href="index.php? page='.$_link_id.'">'.($_link_id+1).'</a> ';
} else {
# выводим номер текущей страницы
$_nav_text .= ' <b>'.($_link_id+1).'</b>';
}
}
}
// ссылка на последнюю страницу
if ($curr_page < ($max_pages-1)) {
# если текущая страница не последняя
$_nav_text .= ' ... <a href="index.php?page='.($max_pages-1).'" mce_href="index.php?page='.($max_pages-1).'">»</a>; ';
}
Теперь в переменной $_nav_text содержится код ссылок меню навигации.
UPD.1. В данной статье принято считать страницы с нуля. Чтобы получить человеко понятную нумерацию, нужно изменить $curr_page = $_GET['page']; на $curr_page = $_GET['page']-1; .
SELECT *
2 FROM `content`
3 LIMIT “.($curr_page*ITEM_PER_PAGE).”, “.ITEM_PER_PAGE;
Как это так? Допустим страница у нас 1 ($curr_page =1)
выходит вывод должен быть 1 * 4 = 4 с 4ой до 8 записи?
Ничо не перепутали?
Нет, ничего не перепутал. См. UPD.1. в конце статьи.