Paginação de resultados com PHP/MySQL

Vamos a mais um artigo. Desta vez, vou ensinar a fazer a paginação de resultados de uma consulta SQL. A paginação é muito útil quando de trata de vários registros, e hoje vamos aprender uma paginação simples.

Veja antes o que será feito, clicando aqui.

1. Banco de dados

Vamos utilizar, novamente, como um simples exemplo, uma tabela de produtos:

CREATE TABLE IF NOT EXISTS `produtos` (
  `cod` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(50) NOT NULL,
  `valor` double NOT NULL,
  PRIMARY KEY (`cod`)
) ENGINE
=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `produtos` (`cod`, `nome`, `valor`) VALUES
(1, 'Produto 1', 1.99),
(2, 'Produto 2', 5.19),
(3, 'Produto 3', 8.25),
(4, 'Produto 4', 12.99);

Criamos nossa tabela produtos e inserimos inicialmente 4 produtos para utilizarmos como exemplo.

2. Paginando Resultados

Agora vamos ao código para realizar a paginação dos produtos:

<?php
// Informações da query
$campos_query = "*";
$final_query  = "FROM produtos ORDER BY cod ASC";

// Maximo de registros por pagina
$maximo = 2;

// Declaração da pagina inicial
$pagina = $_GET["pagina"];
if($pagina == "") {
    $pagina = "1";
}

// Calculando o registro inicial
$inicio = $pagina - 1;
$inicio = $maximo * $inicio;

// Conta os resultados no total da query
$strCount = "SELECT COUNT(*) AS 'num_registros' $final_query";
$query = mysql_query($strCount);
$row = mysql_fetch_array($query);
$total = $row["num_registros"];

###################################################################################
// INICIO DO CONTEÚDO

// Realizamos a query
$sql = mysql_query("SELECT $campos_query $final_query LIMIT $inicio,$maximo");

// Exibimos os nomes dos produtos e seus repectivos valores
while ($linha = mysql_fetch_object($sql)) {
	echo "<b>" . $linha->nome . "</b> (R$ ". $linha->valor.")<br />";
}

// FIM DO CONTEUDO
###################################################################################

$menos = $pagina - 1;
$mais = $pagina + 1;

$pgs = ceil($total / $maximo);

if($pgs > 1 ) {

	echo "<br />";

    // Mostragem de pagina
    if($menos > 0) {
		echo "<a href=".$_SERVER['PHP_SELF']."?pagina=$menos>anterior</a>  ";
    }

    // Listando as paginas
	for($i=1;$i <= $pgs;$i++) {
		if($i != $pagina) {
			echo " <a href=".$_SERVER['PHP_SELF']."?pagina=".($i).">$i</a> | ";
		} else {
			echo " <strong>".$i."</strong> | ";
		}
	}

	if($mais <= $pgs) {
		echo " <a href=".$_SERVER['PHP_SELF']."?pagina=$mais>próxima</a>";
	}
}
?>

O código bem está comentado, e também é bem adaptável. Basta apenas você definir a variável $campos_query e $final_query com as informações da tabela desejada e a variável $maximo, com o número máximo de registros por página. Após definir a principais variáveis devemos nos preocupar com o conteúdo que será exibido.

Espero que esse artigo tenha sido claro e útil para você.
Até o próximo artigo,
Abraços.

Referência:
http://www.revistaphp.com.br/artigo.php?id=61