Paginação com MySQL no PHP

Paginação com MySQL no PHPOlá pessoal, seguindo com a série de artigos sobre paginação de dados com PHP + PDO, segue abaixo como construir paginação com  MySQL 5.5. Atualmente grande parte das páginas WEB de pequena e média escala estão rodando sobre um banco de dados MySQL, por esse motivo existe bastante material sobre paginação com ele, além do MySQL possuir comandos bem intuitivos para se trabalhar com paginação de dados.  
 
No MySQL vamos adicionar a clausula LIMIT X, Y no final da nossa instrução SQL, esse comando recebe dois parâmetros, sendo o primeiro obrigatório e o segundo opcional.

Se for informado apenas 1 parâmetro a pesquisa irá retornar apenas a quantidade de registros de acordo com valor passado, no exemplo abaixo somente os primeiros “10” registros:

Se forem informados os 2 parâmetros, o primeiro indica em qual linha vai iniciar a consulta e o segundo parâmetro quantos registros serão retornados a partir da linha indicada no primeiro parâmetro. No exemplo abaixo a consulta vai retornar registros começando pela linha “0” (não tem relação com campos ID) com os próximos “10” registros. Serão retornados 10 registros no total,  mas conseguimos informar a partir de onde será iniciado essa contagem, é por aí que conseguimos parametrizar a consulta e paginar os dados, abaixo exemplo de paginação com MySQL.

Observação: Essa parametrização da clausula LIMIT a partir de consultas executadas em outras linguagens (PHP, Java, C# e etc) foi adicionada a partir da versão 5.5 do MySQL, na versões anteriores somente era possível isso utilizando prepared statements em procedures.
 
Agora que já sabemos basicamente como funciona a clausula LIMIT, é hora de por a mão na massa criando o banco de dados, tabela e inserindo os dados fictícios.
 
Abaixo segue o script para criar o banco de dados “blog” e  a tabela artigos “artigos“:

Agora que já temos o banco e a tabela criados vamos inserir alguns registros, para podermos explorar todas as funcionalidades da paginação vamos inserir 35 registros, onde cada página vai conter 5 registros, totalizando 7 páginas. Vou usar uma procedure para executar vários INSERTs, assim fica mais fácil de realizar a inclusão dos 35 registros, lembrando que os dados em si não tem importância, a parte que nos interessa é a quantidade de registros.
 

Com isso já temos toda a parte de banco de dados finalizada, agora vamos para o principal o script da index.php mas agora com toda a lógica PHP de consulta e paginação, para que esse código funcione é importante mencionar que a extensão pdo_mysql.dll (Windows) ou pdo_mysql.so (Linux) tem que estar habilitada no PHP, script segue abaixo:
 

Criando script de paginação com MySQL

index.php

Post relacionado:  Formatar Datas no MySQL, PostgreSQL e SQL Server

Observação: A folha de estilo CSS foi postado no Paginação de Dados no PHP com PDO – Introdução.

1 – Define 2 constantes no início do script, sendo a primeira QTDE_REGISTROS, para identificar quantos registros quero exibir por página, nesse caso apenas 5. Segunda constante RANGE_PAGINAS, serve para identificar quantas opções de páginas para navegação vou exibir antes e depois da página em destaque, nesse exemplo quero apenas 1 página (2 – 3 – 4).

 
2 – Nesse trecho fazemos uma validação do parâmetro (page) recebido via GET, verificando se o parâmetro page existe e se o valor é numérico, caso uma das validações não seja verdadeira atribuímos o valor “1” para variável $pagina_atual.

 
3 – Nessa linha estou calculando qual será a linha inicial da consulta, baseado no parâmetro passado via URL e no valor da constante QTDE_REGISTROS.

 
4 – Nessa linha temos a mágica da paginação com MySQL usando a clausula LIMIT sendo parametrizada pelos valores recebidos e calculados.

 
5 – O segredo para saber quantas páginas serão necessárias é saber quantos registros serão retornados, podemos fazer isso executando um COUNT(*) na tabela. Com esse resultado basta dividi-lo pela quantidade de registros que iremos exibir por página, nesse caso pela constante QTDE_REGISTROS. Esse valor também serve para sabermos qual será a última página.

 
6 – Nesse conjunto de linhas fica toda a mágica da paginação, coloquei os nomes das variáveis bem intuitivos. Observem que para deixar o código mais legível estou usando em alguns pontos operadores TERNÁRIOS, para não poluir o código com vários IFs simples. Observem que para calcular a quantidade de páginas basta dividir o total de registros pela constante QTDE_REGISTROS por página $ultima_pagina = ceil($valor->total_registros / QTDE_REGISTROS).

 
7 – O código abaixo utiliza classes que criei no CSS para esconder ou exibir os botões de Primeira, Anterior, Próxima e Última página, conforme a necessidade.

Paginação Inicial

Paginação Final
 
Abaixo temos o resultado final quando acessamos a primeira página, notem que não temos opções para o primeiro e nem registro anterior.
Paginação de dados início
 
 
Agora acessando a página “3” temos opções baseadas no range, com 1 página anterior e 1 página posterior, além das opções de primeira, anterior, próxima e última página.
Paginação de dados no meio
 
E para finalizar, acessando a última página “7” temos a opção de exibir uma página anterior “6” e os botões anterior e primeira página.
Paginação de dados no fim
 
Neste artigo demonstrei como montar paginação com MySQL, com isso chegamos ao final de mais um artigo, é evidente que existem diversas maneiras de se montar esse layout de paginação, com variações de CSS, HTML e lógica PHP. Na internet existem diversos plugins para esse tipo de funcionalidade, os principais frameworks para PHP possuem métodos para isso, mas antes de usar soluções prontas é interessante saber como funciona, quais as limitações do SGBD que você está usando em seu projeto para se trabalhar com paginação.
 
Até a próxima …
Post relacionado:  Exclusão - Sistema de Cadastro com PHP + PDO e MySQL
Tags:,
Show Buttons
Hide Buttons