Paginação de resultados com PHP e MySQL

Classe muito útil para criar automaticamente links de navegação, como “Página Anterior”, “Próxima Página” e os links de numeração de páginas.

A classe php

<?php

// classe-paginacao.php
class pager
{
var $sql;
var $getvar;
var $rows;
var $start;
var $getvar_val;
var $pager;
var $result;

function __construct($sql,$getvar,$length)
{
$this->result=null;
$this->sql = $sql;
$this->getvar = $getvar;
$this->rows = 0;
$this->start = 0;
$this->getvar_val = 1;
$this->pager = null;
$this->SetLength($length);
$this->GetStart();
$this->doQuery();
}

//Sets $length
function SetLength($length)
{
$this->length = (int)$length;
if($this->length<0)
{
$this->length = 0;
}
}

function doQuery()
{
$sql = trim($this->sql);
$sql = substr($sql,6);
$sql = ‘SELECT SQL_CALC_FOUND_ROWS ‘.$sql.’ limit ‘.$this->start.’, ‘.$this->length;
$this->result = mysql_query($sql);
$sql = “SELECT FOUND_ROWS()”;
$result = mysql_query($sql);
$this->rows = mysql_result($result,0);
}

function Set_Getvar_val()
{
$this->getvar_val = (int)$_GET[$this->getvar];
if($this->getvar_val<1)
{
$this->getvar_val = 1;
}
}
function GetStart()
{
$this->Set_Getvar_val();
$this->start = (($this->getvar_val-1)*$this->length);
}

function show($next=” – Próxima “,$last=” Anterior – “,$separator=” “)
{
$array = $this->pager();
$str = array();
foreach($array as $k => $v)
{
if($k!=’next’&&$k!=’last’)
{
if($k==$this->getvar_val)
{
$str[] = $k;
}
else
{
$str[] = ‘<a href=”‘.$v.’”>’.$k.’</a>’;
}
}
}
$str = implode($separator, $str);
$rt = $array['last']===null?”":’<a href=”‘.$array['last'].’”>’.$last.’</a>’.$separator;
$rt .= $str.$separator;
$rt .= $array['next']===null?”":’<a href=”‘.$array['next'].’”>’.$next.’</a>’;
return $rt;

}

function pager($margin=5)//paginacao de links
{
$path = $_GET;

//url
$newpath = $PHP_SELF.”?”;

foreach($path as $key => $value)
{
if($key!=$this->getvar)
{
$newpath .= $key.”=”.$value;
$newpath .=”&amp;”;
}
}
$newpath .= $this->getvar;

$linkpaths = array();
$current = $this->start / $this->length + 1;
$pages = ceil(($this->rows/$this->length));
$pagerstart = $current-$margin; //limita links
$pagerstart = ($pagerstart<1)?1:$pagerstart;
$pagerend = $current+$margin;

$pagerend = ( $pagerend > $pages ) ? ( ceil( ( $this->rows / $this->length ) ) ): $pagerend;

for($i=$pagerstart;$i < ($pagerend+1);$i++)
{
//mostra links da paginação quando for maior que o numero de registros por pagina
if($this->rows > $this->length)
{
$linkpaths[$i] = $newpath.”=”.($i);
}

}
if($linkpaths[($current+1)]!=null)
{
//link proximo
$linkpaths['next']=$linkpaths[($current+1)];

}
if($linkpaths[($current-1)]!=null)
{
//link anterior
$linkpaths['last']=$linkpaths[($current-1)];
}
return $linkpaths;

}
}

?>

Como usar a classe.

<?
mysql_connect(‘localhost’, ‘root’, ‘toor’);
mysql_select_db(‘meu-banco’);

include_once(‘classe-paginacao.php’);

$sql = “SELECT * FROM users”;
$pager = new pager($sql,’page’,15);
while($row = mysql_fetch_array($pager->result))
{
echo $row['name'].” “.$row['email'].”<br>”;
}
echo $pager->show();  // mostra navegação e numeros da paginação

?>

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay
  • Add to favorites
  • BarraPunto
  • Bitacoras.com
  • BlinkList
  • blogmarks
  • Blogosphere News
  • blogtercimlap
  • connotea
  • Current
  • Design Float
  • Diggita
  • Diigo
  • DotNetKicks
  • DZone
  • eKudos
  • email
  • Fark
  • Faves
  • Fleck
  • FriendFeed
  • FSDaily
  • Global Grind
  • Gwar
  • HackerNews
  • Haohao
  • HealthRanker
  • HelloTxt
  • Hemidemi
  • Hyves
  • Identi.ca
  • IndianPad
  • Internetmedia
  • Kirtsy
  • laaik.it
  • LaTafanera
  • LinkaGoGo
  • LinkArena
  • LinkedIn
  • Linkter
  • Live
  • Meneame
  • MisterWong
  • MisterWong.DE
  • MOB
  • MSN Reporter
  • muti
  • MyShare
  • MySpace
  • N4G
  • Netvibes
  • Netvouz
  • NewsVine
  • NuJIJ
  • PDF
  • Ping.fm
  • Posterous
  • Propeller
  • QQ书签
  • Ratimarks
  • Rec6
  • Reddit
  • RSS
  • Scoopeo
  • Segnalo
  • SheToldMe
  • Simpy
  • Slashdot
  • Socialogs
  • SphereIt
  • StumbleUpon
  • Suggest to Techmeme via Twitter
  • Technorati
  • ThisNext
  • Tipd
  • Tumblr
  • Twitter
  • Upnews
  • viadeo FR
  • Webnews.de
  • Webride
  • Wikio
  • Wikio FR
  • Wikio IT
  • Wists
  • Wykop
  • Xerpi
  • Yahoo! Bookmarks
  • Yahoo! Buzz
  • Yigg
  • 豆瓣
  • 豆瓣九点

0 comments

There are no comments yet...

Kick things off by filling out the form below.

Leave a Comment