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!

Veja Também:

Artigos Relacionados a categoria: PHP

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

Já temos 6 comentário(s). DEIXE O SEU :)
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 10h12 RESPONDER
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 17h03 RESPONDER
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 13h03 RESPONDER
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 14h03 RESPONDER
N/A
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 22h10 RESPONDER
N/A
Enviando Comentário Fechar :/
Contato Astefree

Contato Astefree

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

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

Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite e veja agora mesmo e tenha um site de qualidade para o seu negócio!

[contato]
Ver o Portfólio Agora