На форуме CodeNet.Ru неоднократно задавали вопрос о том, как сделать постраничный вывод на PHP. Я объяснял, что такое LIMIT, и как его использовать в MySql.
Но все время оказывалось, что вопрос касался только навигации по страницам:
Вот универсальная процедура, выводящая такой блок ссылок:
$records - всего записей
$r_start - текущая страница
$URL - адрес, заканчивающийся на "="
$inpage - записей на страницу
<?
function LeftRight($records,$r_start,$URL,$inpage) {
$str="";
if ($records<=$inpage) return;
if ($r_start!=0) {
$str.="<a href=".$URL."0><<</a> ";
$str.="<a href=$URL".($r_start-1)."><</a> ";
}
else $str.="<< < ";
if ($r_start==0) {$sstart=$r_start-0;$send=$r_start+10;}
if ($r_start==1) {$sstart=$r_start-1;$send=$r_start+9;}
if ($r_start==2) {$sstart=$r_start-2;$send=$r_start+8;}
if ($r_start==3) {$sstart=$r_start-3;$send=$r_start+7;}
if ($r_start==4) {$sstart=$r_start-4;$send=$r_start+6;}
if ($r_start>=5) {$sstart=$r_start-5;$send=$r_start+5;}
if ($send*$inpage>$records) $send=$records/$inpage;
if ($sstart<0) $sstart=0;
if ($records%$inpage==0) $add=0; else $add=1;
for ($i=$sstart;$i<$send;$i++) {
if ($i==$r_start) $str.=" <B>".($i+1)."/".(intval($records/$inpage)+$add)."</B> | ";
else $str.="<a href=$URL".($i)."><U><B>".($i+1)."</B></U></a> | ";
}
if ($r_start+(1-$add)<intval($records/$inpage)) {
$str.=" <a href=$URL".($r_start+1).">></a>";
$str.=" <a href=$URL".(intval($records/$inpage)-(1-$add)).">>></a>";
}
else $str.=" > >>";
return($str);
}
// Пример вызова
print "<center>".LeftRight(567,43,"index.htm?start=",20)."</center>";
?>
#Считаем количество страниц
if($records%$inpage==0) $add=0; else $add=1;
$page_count=(intval($records/$inpage)+$add);
#Ссылки на первые 10 страниц, начиная с первой
if($r_start<5) {
$sstart=0;
$send=10;
}
#Ссылки на 10 страниц, влево и вправо по 5, относительно текущей
if($r_start>=5 and $r_start<=($page_count-5)){
$sstart=$r_start-5;
$send=$r_start+5;
}
#Ссылки на последние 10 страниц
if($r_start>($page_count-5)) {
$sstart=$page_count-10;
$send=$page_count;
}
code:
<?
/* Классы поддержки навигации в данных ( navigation_classes.php ) */
/*
* Класс постраничного вывода информации.
* Конструктору передается информация для вывода.
* @author : Barinov Roman
* @version : no
* @date created : 16.08.2007
* @date modifyed : no
*/
class page_navigation_printer {
var $navig_len;
var $url;
/* конструктор класса */
function page_navigation_printer ($in_navig,$selfurl) {
$this->navig_len = $in_navig;
$this->url = $selfurl;
}
/* печатаем единичную ссылку на страницу */
function print_navigation_link ($page_number) {
$a = $page_number+1;
echo "<td><a href='".$this->url."?page=$page_number'>".$a."</a></td>";
}
/* печатаем навигационную полосу */
function make_nagivation_panel () {
echo "<table><tr>";
for ($i=0;$i<$this->navig_len;$i++) {
$this->print_navigation_link($i);
}
echo "</tr></table>";
}
}
/*
* Класс поддержки навигации информации по страницам.
* Конструктору передается информация , он разбивает ее по страницам.
* @author : Barinov Roman
* @version : no
* @date created : 16.08.2007
* @date modifyed : no
*/
class page_navigation_maker {
var $in_array;
var $page_len;
var $page_counter;
var $array_len;
var $current_page_len;
var $current_page_number;
Исправлена ошибка количества ссылок при переходе на 5 последних "страниц."
Вместо
/*
if ($r_start==0) {$sstart=$r_start-0;$send=$r_start+10;}
if ($r_start==1) {$sstart=$r_start-1;$send=$r_start+9;}
if ($r_start==2) {$sstart=$r_start-2;$send=$r_start+8;}
if ($r_start==3) {$sstart=$r_start-3;$send=$r_start+7;}
if ($r_start==4) {$sstart=$r_start-4;$send=$r_start+6;}
if ($r_start>=5) {$sstart=$r_start-5;$send=$r_start+5;}
*/
пишем следующее
if ($records%$inpage==0) $add=0; else $add=1;
$ggg=(intval($records/$inpage)+$add);
if ($r_start<5) {$sstart=0;$send=10;}
if ($r_start>=5) {$sstart=$r_start-5;$send=$r_start+5;}
if ($r_start>($ggg-5)) {$sstart=$ggg-10;$send=$ggg;}
Enemy / 23 мая 2006, 20:04:08
Код конечно хороший но у меня почему-то на второй странице выводит вместо 10 указаных на страницу 20...
может я неправиьлно делаю цикл вывода while($list=mysql_fetch_array($list_result))???
D@nil / 11 апреля 2006, 06:57:12
Так правильно юзать:
code:
$page = $_GET['page'];
$page_posts = 10; // Количество файлов на страницу
$query="SELECT something FROM table LIMIT
$page*$page_posts, ($page*$page_posts+$page_posts)";
2Fluffy Fear
проше так $str = substr($str, 0, -3);
Fluffy Fear / 05 марта 2006, 03:06:47
Заметил в коде как минимум 2 недоделки.
1-я(эстетичская):
После начальных "<< <" отсутствует вертикальная черта, однако перед последними она есть. Может так и задумано, но всё-таки я считаю это неточностью. Для исправления нужно либо
вставить перед циклом (for, который всего один)
code:
$str.= ' | ';
либо убрать последние символы после цикла,
например так:
code:
$str = substr($str, 0, strlen($str)-3);
2-я(практическая): Вы, вероятно, заметили(или нет), что когда выбираете страницы из последней десятки, то общее количество ссылок на страницы уменьшается с 10 до 6(коряво написал, но надеюсь понятно). Для исправления придётся добавить код
code:
if ($r_start==0) {$sstart=$r_start-0;$send=$r_start+10;}
if ($r_start==1) {$sstart=$r_start-1;$send=$r_start+9;}
if ($r_start==2) {$sstart=$r_start-2;$send=$r_start+8;}
if ($r_start==3) {$sstart=$r_start-3;$send=$r_start+7;}
if ($r_start==4) {$sstart=$r_start-4;$send=$r_start+6;}
if ($r_start>=5) {$sstart=$r_start-5;$send=$r_start+5;}
Только ЕГО НУЖНО ПЕРЕДЕЛАТЬ ДЛЯ КОНЦА СТРОЧКИ(мне лень :), я сделал по своему, короче, но не так наглядно).
Дмитрий / 06 апреля 2005, 13:52:51
Очень хорошая статья. После того как я ее внедрил у себя в страницах, сильно поубавилось лишнего коду. Главное, что универсально. Правда для новичков желательно было бы слегка пояснить и исправить названия переменных в функции.
Значит, выборка делается так:
$query="SELECT something FROM table LIMIT $start, $inpage";
А в функции переменную $r_start исправить на $start.
Побольше бы таких полезных статей.
SLA / 17 февраля 2005, 15:39:22
В ORACLE нет ключевого слова LIMIT. Как "выкрутиться" из этого положения:
SELECT t1.rn, t1.col1 FROM
(
SELECT rownum rn, col1 FROM Table1
) t1
WHERE t1.rn BETWEEN 11 AND 20;