Boteco Digital

Páginação de resultados do Banco de Dados em PHP

Uma das atividades mais básica ao se desenvolver para Web é a paginação de resultados de uma consulta ao banco de dados. Apesar de ser simples, sempre gera algumas dúvidas principalmente pelo uso do comando LIMIT do SQL já que pode variar um pouco dependendo do Gerenciador de Banco de Dados utilizado.

No MySQL por exemplo podemos utilizar da seguinte forma:

 
SELECT * FROM usuarios LIMIT 40 , 20;

Após o comando LIMIT temos dois valores separados por virgula, o primeiro é a partir de que número de linha que o SELECT comçará a mostrar os resultados e o segundo valor é a quantidade de valores que serão mostrados a partir do primeiro valor. Resumindo se a consulta acima sem o comando LIMIT retornasse 100 resultado, utilizando o
LIMIT seria retornado apenas 20, os resultados do 40 até 60.

No PostgreSQL o comando muda um pouco mas o modo de funcionamento é o mesmo:

SELECT * FROM usuarios LIMIT 20  OFFSET 40;

O primeiro valor após o comando LIMIt é a quantidade de resultados que irá mostrar e o valor após o comando OFFSET é a partir de que linha os resultados começarão a ser mostrados.

Tendo visto por auto como funciona o comando LIMIt podemos começar a ver o código de páginação:

try{
 	$conn = new PDO('mysql:host=localhost;port=3306;dbname=teste', 'root', '12345678');
 	$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
 	$por_pagina = 10;
 	$init = ( $_GET['pagina']-1) * $por_pagina;

	$result = $conn->query("SELECT * FROM usuarios limit $init, $por_pagina");
		
	$result_total = $conn->query("SELECT count(*) as total FROM usuarios")->fetch(PDO::FETCH_OBJ);
			
	$num_paginas = ceil( $result_total->total / $por_pagina);

   	$conn = null;
}catch (PDOException $i){
     	print "Erro: <code>" . $i->getMessage() . "</code>";
}

Neste exemplo foi utilizado PDO para realizar consultas ao banco que já foi abordado em outro post.

Na linha 2 conectamos ao banco e na linha 3 configuramos para utilizar exceções.

Na linha 5 definimos e armazenamos em uma variável o número de resultados que queremos por página, isso facilitará mais para frente.

Na linha 6 calculamos a partir de qual resultado deve ser mostrado, esse calculo é feito tendo como base o número da página em que se está visualizando que é recebido via parâmentro de URL ( index.php?pagina=2 por exemplo), se tivermos na página 1 deve ser mostrados os resultado de 0 até 10, se tivermos na 2 será mostrado de 10 até 20, então nosso calculo para o o resultado de inicio (fica pagina-1) * por_pagina.

Na linha 8 utilizamos os valores de $por_pagina e $init para construir a consulta SQL utilizando o comando LIMIT e armazenamos os resultados na variável $result para construir a tabela.

Na linha 10 consultamos o total de resultados da consulta sem o comando LIMIT que será necessário para construir a os links de navegação da paginação.

Na linha 12 calculamos o numero de páginas total que é dado pelo total de resultados divido por quantos resultados se esta mostrando por página, lembrando de utilizar a função ceil para arredondar o resultado.

Agora que temos todo o nossos resultados para mostrar vamos construir o HTML:

<table>
	<tr>
		<th>ID</th>
		<th>Nome</th>
		<th>Login</th>
		<th>E-mail</th>
	</tr>
		
<?php   foreach($result as $linha){  ?>
	<tr>
             	<td><?php echo $linha['id']?></td>
              	<td><?php echo $linha['nome'];?> </td>
              	<td><?php echo $linha['login'];?> </td>
              	<td><?php echo $linha['email'];?> </td>
	</tr>
         <?php } ?>

</table>
		
<div>
<?php for($i = 1 ; $i <= $num_paginas ;$i++ ){?>
 	<a href="index.php?pagina=<?php echo $i ?>"><?php echo $i ?></a>
<?php }?>
</div>

Como pode ser visto acima é criada uma tabela a primeira linha utilizaremos como nome das colunas e para as linha restantes é utilizada a instrução foreach para percorrer todos os resultados da consulta SQL(armazenada na variável $result) e criar para cada linha do resultado uma linha na tabela HTML.

Na linha 21 é utilizado um for normal para ir de 1 até o número de páginas e para cada passada é criado um link com a URL passando o parâmetro da página de resultado a ser mostrada.

Baixar o exemplo completo.

Era isso, t++

Categorias PHP
comments powered by Disqus