Помните нашу навигацию, которая занимала пару десятков строк, не считая самой функции? Может стоить ее уменьшить до пары? Сделаем это через ООП. В этом нет ничего сложно, и не стоит его бояться.
#PHP
<?php
class N{ // создаем класс навигации
// задаем свойства класса и права доступа для них
public $post;
public $start;
public $num;
public $limit;
private $page=1;
private $who;
private $hvost;
private $total=0;
############################
public function __construct($post,$num,$who,$hvost){ // создаем конструктор и задаем в нем свойства класса
if(isset($_REQUEST['page'])){ // получаем номер текущей страницы
$this->page=intval($_REQUEST['page']);
}
if(is_numeric($post)){ // получаем общее кол-во записей; первый аргумент может быть как sql запросом, так и простым числом(для файлов)
$this->post=$post;
}else{
$this->post=mysql_result(mysql_query($post),0);
}
if($this->post){ // если есть записи, то двигаемся дальше и рассчитываем лимиты
$this->who=$who; // имя записей
$this->hvost=$hvost.'&'; // хвост ссылки
$this->num=$num; // кол-во записей на страницу
$this->total=intval(($this->post-1)/$this->num)+1; // рассчитываем лимиты показа на страницу
if($this->page>$this->total){$this->page=$this->total;}elseif($this->page<1){$this->page=1;}
$this->start=$this->page*$this->num-$this->num;
$this->limit=$this->start.', '.$this->num;
}else{ // иначе выводим сообщение о том, что вывести нечего
echo 'Нету '.$who;
}
}
##############
public function __destruct(){ // функция постраничной навигации в качестве деструктора, я Вам ее уже комментировал
echo '<div style="text-align: center;">Всего '.$this->who.': '.$this->post.'</div>';
#######
if($this->page!=1){
echo '<a href="'.$this->hvost.'page='.($this->page-1).'"><<Пред.</a> ';
if($this->page!=$this->total){echo '|| ';}
}
if($this->page<$this->total){
echo ' <a href="'.$this->hvost.'page='.($this->page+1).'">След.>></a>';
}
echo '<br/>';
#######
$pp=$p2l=$p1l=$p1r=$p2r=$np='';
if($this->page<$this->total){
$p1r='<a href="'.$this->hvost.'page='.($this->page+1).'">'.($this->page+1).'</a>';
if($this->page+1!=$this->total and $this->total-4<$this->page){$p1r.=',';}
}
if($this->page+4<$this->total){
$p1r.=',<a href="'.$this->hvost.'page='.($this->page+2).'">'.($this->page+2).'</a>';
}
if($this->page-3>0){
$pp='<a href="'.$this->hvost.'page=1'.'">1</a>';
if($this->page-4>0){
$pp.=',<a href="'.$this->hvost.'page=2'.'">2</a>';
}
if($this->page-5>0){
$pp.=',<a href="'.$this->hvost.'page=3'.'">3</a>';
}
if($this->page-6>0 and $this->page<8){
$pp.=',<a href="'.$this->hvost.'page=4"'.'>4</a>';
}
if($this->page>7){$pp.='...';}else{$pp.=',';}
}
if($this->page+2<$this->total){
$np='<a href="'.$this->hvost.'page='.$this->total.'">'.$this->total.'</a>';
}
if($this->page-2>0){
$p2l='<a href="'.$this->hvost.'page='.($this->page-2).'">'.($this->page-2).'</a>,';
}
if($this->page-1>0){
$p1l='<a href="'.$this->hvost.'page='.($this->page-1).'">'.($this->page-1).'</a>,';
}
if($this->total-3>$this->page){
if($this->page+3==$this->total-3){
$p2r=',<a href="'.$this->hvost.'page='.($this->total-3).'">'.($this->total-3).'</a>';
}
if($this->page+2<$this->total-4){$p2r.='...';}else{$p2r.=',';}
$p2r.='<a href="'.$this->hvost.'page='.($this->total-2).'">'.($this->total-2).'</a>,<a href="'.$this->hvost.'page='.($this->total-1).'">'.($this->total-1).'</a>,';
}elseif($this->page+1<$this->total){
$p2r='<a href="'.$this->hvost.'page='.($this->page+2).'">'.($this->page+2).'</a>';
if($this->page+2<$this->total){$p2r.=',';}
}
#######
if($this->total!=1){
echo $pp.$p2l.$p1l.' <b>'.$this->page.'</b> '.$p1r.$p2r.$np;
}
if($this->total>10){
echo '<form action="'.$this->hvost.'" method="post">
<input type="text" name="page" size="3" maxlength="3" value="'.$this->page.'" /><br/>
<input class="s" type="submit" value="Go!" />
</form>';
}
}
############################
}
Применение:
#PHP
<?php
// для mysql:
include_once 'N.php'; // подключаем класс с навигацией
$N=new N('SELECT COUNT(*) FROM table',15,'string','?');
/*
1 аргумент - запрос, который будет считать кол-во записей
2 - кол-во записей на страницу
3 - имя записей
4 - хвост для пути
*/
if($N->post){ // смотрим, есть ли записи вообще
$res=mysql_query('SELECT id FROM table ORDER BY id LIMIT '.$N->limit); // если есть, то вытаскиваем их в соответствии с лимитом
while($m=mysql_fetch_assoc($res)){ // вывод
echo $m['id'].'<br/>';
}
unset($N); // уничтожаем объект и вызываем деструктор, он же постраничная навигация
}
#PHP
<?php
// Для файлов проще
$f=file('123.txt'); // заносим файл в переменную
$N=new N(sizeof($f),15,'string','?'); // тоже самое что и для mysql, только 1 аргумент уже число элементов массива
if($N->post){ // смотрим, есть ли записи вообще
for($i=$N->start;$i<$N->start+$N->num;$i++){ // вывод
if(!isset($f[$i])){break;}
echo $f[$i].'<br/>';
}
unset($N); // уничтожаем объект и вызываем деструктор, он же постраничная навигация
}
Как видите, код стал проще в использовании. Пусть он и не самый лучший, но это повод сделать его совершенней уже самим))/div>