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
começ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 paginaçã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âmetro 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.
Era isso, t++