Artigo: Paginação de resultados com PHP, PDO e MySql - Gigasystems

PHP

Em por

Neste artigo veremos um exemplo de paginação em PHP, PDO e MySql, utlizando como resultado uma tabela de cidades do IBGE 7 digitos, com códigos válidos para gerar NFe e sua respectiva UF.

O que é paginação de resultados?

Paginação de resultado é algo bem simples, onde fazemos uma busca em determinada tabela do Banco de Dados, e com o resultado da busca, dividimos o número de registros (total), por um número especifico (limite) para exibir por página.

Utilizamos este procedimento quando não queremos deixar nossa página muito grande, limitando a um determinado tamanho e adicionando botões de navegação no final do conteúdo.

Por exemplo, um total de 200 registros, e nós queremos exibir 20 por página, logo teremos 200/20 = 10 páginas. Chega de blá blá blá e vamos lá para o código então.

Primeiramente criamos um arquivo para fazer a conexão ao MySQL, dê o nome de "Conexao.class.php":

<?php    
	class Conexao {
		private $data = array();
		//variavel da classe Base
		protected $pdo = null;
		
		public function __set($name, $value){
			$this->data[$name] = $value;
		}

		public function __get($name){
			if (array_key_exists($name, $this->data)) {
				return $this->data[$name];
			}

			$trace = debug_backtrace();
			trigger_error(
				'Undefined property via __get(): ' . $name .
				' in ' . $trace[0]['file'] .
				' on line ' . $trace[0]['line'],
				E_USER_NOTICE);
			return null;
		}
		
		//método que retorna a variável $pdo
		public function getPdo() {
			return $this->pdo;
		}

		//método construtor da classe
		function __construct($pdo = null) {
			$this->pdo = $pdo;
			if ($this->pdo == null)
				$this->conectar();
		}

		//método que conecta com o banco de dados
		public function conectar() {			
			$local = "localhost";
			$user = "root";
			$pass = "";
			$basename = "sua-base-de-dados";
		
			try {
				$this->pdo = new PDO("mysql:host=$local;dbname=$basename",
								"$user",
								"$pass",
								array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
			} catch (PDOException $e) {
				print "Error!: " . $e->getMessage() . "<br/>";
				die();
			}
		}

		//método que desconecta
		public function desconectar() {
			$this->pdo = null;
		}
		
	}

?>

Em seguida criamos o arquivo principal que será mostrado os dados da tabela 'cidades'. Dê um nome de sua preferência, não esquecendo que a extensão é (.php) e adicione o arquivo criado acima:

<?php
    //inclui as bibliotecas
    require_once('Conexao.class.php');
    //faz a conexão com o BD
    $pdo = new Conexao();
?>

Especificamos o número de registros que serão mostrados por página. Depois pegamos o valor da página atual, subtraimos 1, para que o array comece do zero (0) e multiplicamos a quantidade de registros da página, pelo valor da página atual.

<?php
    //determina o numero de registros que serão mostrados na tela
    $maximo = 20;
    //armazenamos o valor da pagina atual
    $pagina = isset($_GET['pagina']) ? ($_GET['pagina']) : '1'; 
    //subtraimos 1, porque os registros sempre começam do 0 (zero), como num array
    $inicio = $pagina - 1;
    //multiplicamos a quantidade de registros da pagina pelo valor da pagina atual 
    $inicio = $maximo * $inicio;
?>

Fazemos um SELECT usando COUNT na tabela que iremos utilizar para saber quantos registros ela possui e criamos uma variável para armazenar o resultado:

<?php
    $strCount = $pdo->select("SELECT COUNT(*) AS 'total_municip' FROM municipios_ibge");
    $total = 0;
    if(count($strCount)){
        foreach ($strCount as $row) {
            //armazeno o total de registros da tabela para fazer a paginação
            $total = $row["total_municip"]; 
        }
    }
?>

Agora faremos um SELECT no BD, já com o intervalo de INICIOLIMIT e guardamos o resultado na variavel pra exibir os dados na pagina:

<?php
    $resultado = $pdo->select("SELECT * FROM municipios_ibge ORDER BY municipio LIMIT $inicio,$maximo");
?>

Até este momento já definimos quantos registros serão mostrados por página, fazendo uma listagem no BD e armazenando numa variável. Agora com o resultado em mãos, podemos começar a mostrar os dados na tela, utilizando o conteúdo da var $resultado, dessa forma:

<!DOCTYPE HTML>
<html lang="pt-BR">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width" />
        <title>Pagina&ccedil;&atilde;o com PHP</title>
        <link rel="stylesheet" type="text/css" href="css/estilo.css" />
        <link rel="stylesheet" type="text/css" href="css/reset.css" />
    </head>
    <body>
        <table class="tabela1">
            <colgroup>
                <col class="coluna1"/>
                <col class="coluna2"/>
                <col class="coluna3"/>
            </colgroup>
            <caption>Pagina&ccedil;&atilde;o com PHP</caption>          
            <thead>
                <tr>
                    <th>Codigo</th>
                    <th>Municipio</th>
                    <th>UF</th>
                </tr>
            </thead>
            <tbody>
            <?php
                //se a tabela nao estiver vazia, percorremos linha por linha pegando os valores
                if(count($resultado)){
                    foreach ($resultado as $res) {
                        echo "<tr>";
                        echo "  <td>".$res['codigo']."</td>";
                        echo "  <td>".$res['municipio']."</td>";
                        echo "  <td>".$res['uf']."</td>";
                        echo "</tr>";
  
                    }
                }
            ?>
            </tbody>          
        </table>

Depois de preencher a tabela com os valores, criamos os botoes de paginação dentro de uma DIV para termos controle de posição, cor, etc...

<div id="alignpaginacao">
       <?php
            //determina de quantos em quantos links serão adicionados e removidos
            $max_links = 6;
            //dados para os botões
            $previous = $pagina - 1; 
            $next = $pagina + 1; 
            //usa uma funcção "ceil" para arrendondar o numero pra cima, ex 1,01 será 2
            $pgs = ceil($total / $maximo); 
            //se a tabela não for vazia, adiciona os botões
            if($pgs > 1 ){   
                echo "<br/>"; 
                //botao anterior
                if($previous > 0){
                    echo "<div id='botaoanterior'><a href=".$_SERVER['PHP_SELF']."?pagina=$previous><input type='submit'  name='bt-enviar' id='bt-enviar' value='Anterior' class='button' /></a></div>";
                } else{
                    echo "<div id='botaoanteriorDis'><a href=".$_SERVER['PHP_SELF']."?pagina=$previous><input type='submit'  name='bt-enviar' id='bt-enviar' value='Anterior' class='button' disabled='disabled'/></a></div>";
                }   
                  
                echo "<div id='numpaginacao'>";
                    for($i=$pagina-$max_links; $i <= $pgs-1; $i++) {
                        if ($i <= 0){
                        //enquanto for negativo, não faz nada
                        }else{
                            //senão adiciona os links para outra pagina
                            if($i != $pagina){
                                if($i == $pgs){ //se for o final da pagina, coloca tres pontinhos
                                    echo "<a href=".$_SERVER['PHP_SELF']."?pagina=".($i).">$i</a> ..."; 
                                }else{
                                    echo "<a href=".$_SERVER['PHP_SELF']."?pagina=".($i).">$i</a>"; 
                                }
                            } else{
                                if($i == $pgs){ //se for o final da pagina, coloca tres pontinhos
                                    echo "<span class='current'> ".$i."</span> ..."; 
                                }else{
                                    echo "<span class='current'> ".$i."</span>";
                                }
                            } 
                        }
                    }
                      
                echo "</div>";
                  
                //botao proximo
                if($next <= $pgs){
                    echo " <div id='botaoprox'><a href=".$_SERVER['PHP_SELF']."?pagina=$next><input type='submit'  name='bt-enviar' id='bt-enviar' value='Proxima' class='button'/></a></div>";
                }else{
                    echo " <div id='botaoproxDis'><a href=".$_SERVER['PHP_SELF']."?pagina=$next><input type='submit'  name='bt-enviar' id='bt-enviar' value='Proxima' class='button' disabled='disabled'/></a></div>";
                }
                              
            }
                          
       ?>   
</div>

E por fim, fechamos o corpo do HTML:

    </body>
</html>

Com isso nossa páginação está pronta, claro que podendo ser melhorada e ficando a critério de cada um como formatar a aparência, que não é o objetivo deste artigo.


Se desejar, pode baixar o arquivo completo aqui

Até a próxima e bons estudos!

Olá, deixe seu comentário para Paginação de resultados com PHP, PDO e MySql

Já temos 6 comentário(s). DEIXE O SEU :)
Contato Astefree

Contato Astefree

Parabens, otimo conteudo bem explicado e funcional
★★★★★DIA 12.11.16 10h42RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Edson

Edson

parabéns pelo post, o código está funcionando bem aqui. Só gostaria de saber: Seria possível um sistema de pesquisa por palavra chave. Estou pesquisando na internet e não acho nada realmente prático, seguro, simples ou instrutivo.
★☆☆☆☆DIA 06.10.15 22h10RESPONDER
N/A
Enviando Comentário Fechar :/
Claudemir Lopes

Claudemir Lopes

Obrigado meu amigo, esse código irá me ajudar muito em meus estudos!!!
★☆☆☆☆DIA 20.03.15 14h03RESPONDER
N/A
Enviando Comentário Fechar :/
Claudemir Lopes

Claudemir Lopes

Gostaria de receber esse código fonte por e-mail, teria como?
★☆☆☆☆DIA 19.03.15 17h03RESPONDER
N/A
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Olá Claudemir, como solicitado, foi incluído um link no final do artigo para fazer o download do arquivo completo. Leia o arquivo leiaMe.txt e bons estudos!

att Gigasystems
★☆☆☆☆DIA 20.03.15 13h03RESPONDER
N/A
Enviando Comentário Fechar :/
Everton J Paula

Everton J Paula

Muito bom esse artigo... conseguiu esclarecer sobre várias dúvidas minhas.. Parabéns...seria sensacional ter mais um artigo adicionando um login com nivel de acesso..
★☆☆☆☆DIA 04.12.14 10h12RESPONDER
N/A
Enviando Comentário Fechar :/
Enviando Comentário Fechar :/

Veja Também:

Artigos Relacionados a categoria: PHP

Soluções

...CURTIU? AINDA NÃO VIU NOSSO PORTFÓLIO?


Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite, veja agora mesmo nossos Cases de Sucesso e tenha seu site nos padrões atuais preparado para maioria dos dispositivos e navegadores.