Paginação Avançada Com PHP

Todo website com uma quantidade média a grande de conteúdo precisa paginar o conteúdo. Desta maneira ele fica organizado e possibilita ter uma idéia sobre o conteúdo disponível. O exemplo mais comum são os blogs, mas esta idéia também se aplica ao resultado das buscas e outros websites.

Neste tutorial vou mostrar como criar uma paginação simples, com números seqüenciais, e a avançada onde é possível ter acesso à primeira e última página além do intervalo entre a página atual, próximas e anteriores como você pode conferir na imagem abaixo:

Paginação

Antes de partirmos para a programação vamos analisar pontos importantes que devem ser observados na criação da paginação.

O Design Da Paginação

Um aspecto muitas vezes negligenciado no design das páginas é a paginação. As vezes ficam aqueles números pequenos mal espaçados difíceis de clicar. Uma experiência terrível para o usuário.

A primeira medida então é oferecer uma área de clicagem generosa para evitar erros e clicar no link do lado. Um bom espaçamento entre os números já resolve o problema, nem precisa aumentar o tamanho da fonte.

E por ser um link, a aparência dele deve mudar quando o mouse passar sobre os números. Estamos na web, interatividade, resposta imediata das ações. Adicionar link para a próxima página e a anterior facilita muito a vida do leitor.

Informe com estilização diferenciada em qual página o usuário encontra-se. Sempre de maneira intuitiva na linha “não me faça pensar”.

Se você gosta de sair do comum e quer criar uma paginação inovadora, cuide com a empolgação e tenha em mente como aspecto principal a usabilidade.

Os Textos

Os textos são inseridos a partir de uma tabela no banco de dados. Neste tutorial utilizei uma tabela chamada ‘artigos’ com os campos para id, titulo e texto e é feita uma conexão com o banco de dados.



<?php
  $db = "banco_dados";
  @mysql_connect("localhost", "usuario", "senha") or trigger_error(mysql_error(),E_USER_ERROR);
  mysql_select_db($db);
?>

Como A Paginação Funciona

Com as sentenças SQL você pode delimitar quantos registros são retornados pela busca na tabela. A cláusula LIMIT faz este papel. Para selecionar os registros do 5 ao 10 de uma tabela escreve-se:



SELECT * FROM tabela LIMIT 5,5

O primeiro número indica a partir de qual deve ser feita a seleção, e o último quantos registros entram na conta. Alterando estes valores que conseguiremos apresentar na tela os registros respectivos de cada pagina.

Variáveis Iniciais

A principio precisamos saber qual página pretende-se visualizar e quantos registros serão mostrados por página.



<?php

$pag = ($_GET['pag']);
$pag = filter_var($pag, FILTER_VALIDATE_INT);

$inicio = 0;
$limite = 1;

if ($pag!='')
{
  $inicio = ($pag - 1) * $limite;
}

Na primeira linha a variável recebe o número da página e na segunda é feita uma verificação para validar o número. Lembrando que o filter_var somente esta disponível a partir do PHP 5.2.

Os valores padrão para a seleção dos registros são 0 e 1. Por isso as variáveis com os respectivos nomes. Se o número da página não for passado estes é que serão os adotados. Mas se o número da página for diferente de nada, a variável ‘inicio’ vai receber o resultado da subtração deste número por 1 vezes o limite de registros a serem mostrados por página. Qual o propósito do cálculo?

Pense que para mostrar o primeiro registro, na sentença SQL a seleção deve ser feita partindo do número 0 e selecionando um registro:



SELECT * FROM tabela LIMIT 0, 1

Então para selecionar o segundo registro parte do primeiro e seleciona mais um (1+1=2). Se você quiser mostrar dois textos por página, vai bastar alterar o valor da variável ‘limite’ para 2.

Fazendo A Busca E Mostrando O Resultado

Vejamos a aplicação das variáveis setadas. Supondo que é a primeira vez que a página é acessada então são utilizados os valores padrão das variáveis ‘inicio’(0) e ‘limite’(1).



$busca = mysql_query("SELECT * FROM artigos LIMIT $inicio, $limite");
if (mysql_num_rows($busca)>0)
{
while ($texto = mysql_fetch_array($busca))
{
    extract($texto);
    echo '<h2>'.$titulo.'</h2>';
    echo '<p>'. nl2br($artigo).'</p>';
}
}

São selecionadas todas as colunas da tabela artigos limitadas entre o registro 0 e o 1. Isso quer dizer, o primeiro registro. Se a busca retornar algum registro e feito um laço para que, enquanto a variável ‘texto’ receber o retorno da busca os dados são extraídos e mostrados na tela.

Os Números Da Paginação

Vamos configurar os valores para os botões de próximo, anterior e adjacentes da atual página.



$busca_total = mysql_query("SELECT COUNT(*) as total FROM artigos");
$total = mysql_fetch_array($busca_total);
$total = $total['total'];

$prox = $pag + 1;
$ant = $pag - 1;
$ultima_pag = ceil($total / $limite);
$penultima = $ultima_pag - 1;  
$adjacentes = 2;

Nas primeiras três linhas é feita uma busca que retorna o número de registros da tabela, os dados são transformados em matriz e o número total é atribuído para a variável ‘total’.

Os links para a próxima página e a anterior terão como valores o número atual da página acrescido ou decrescido em 1. O valor para o link da última página é o resultado da divisão do total de registros pelo número deles que é mostrado na tela. Com isso tendo 10 registros no total e sendo mostrados 2 por página, o valor da última página será 5. Pegando este valor é subtraído 1 para o valor da penúltima página. A variável ‘adjacentes’ configura quantos números ficarão disponíveis em cada lado da página atual na paginação.

Ficará mais claro o porque destas variáveis conforme formos aplicando no código abaixo.

Paginação Simples

Se o número de registos retornado não for suficiente nem para 5 páginas não precisamos adicionar os números adjacentes nem os pontos para indicar que existem páginas além.



  
if ($pag>1)
{
  $paginacao = '<a href="index.php?pag='.$ant.'">anterior</a>';
}
  
if ($ultima_pag <= 5)
{
  for ($i=1; $i< $ultima_pag+1; $i++)
  {
    if ($i == $pag)
    {
      $paginacao .= '<a class="atual" href="index.php?pag='.$i.'">'.$i.'</a>';        
    } else {
      $paginacao .= '<a href="index.php?pag='.$i.'">'.$i.'</a>';  
    }
  }
}

Se o número da página atual é maior do que um, então cabe o link para ver a página anterior. Já estamos aplicando a variável configurada anteriormente no código.

A próxima verificação poderia ser engatada como else da que virá abaixo, mas para deixar o código mais organizado vamos deixá-la sozinha.

Se a última página, que é o resultado da divisão do total de registros pelo número deles que é mostrado em cada página, for menor do que cinco, é feito um laço. Para ‘i’ que recebe um, enquanto ele for menor do que seis (última página + 1), o laço se repete. Nele os links são mostrados com os valores para os respectivos números de página. A verificação é para saber se o ponteiro do laço esta com o mesmo valor que a página atual, que requer uma estilização diferente para informar o usuário onde ele esta.

Observe que os valores estão sendo atribuídos a variável ‘paginacao’, ela ainda vai receber muitos dados no decorrer do código.

Os Intervalos Na Paginação

Se o número de páginas for maior do que cinco, já é possível criar os intervalos.



if ($ultima_pag > 5)
{
  if ($pag < 1 + (2 * $adjacentes))
  {
    for ($i=1; $i< 2 + (2 * $adjacentes); $i++)
    {
      if ($i == $pag)
      {
        $paginacao .= '<a class="atual" href="index.php?pag='.$i.'">'.$i.'</a>';        
      } else {
        $paginacao .= '<a href="index.php?pag='.$i.'">'.$i.'</a>';  
      }
    }
    $paginacao .= '...';
    $paginacao .= '<a href="index.php?pag='.$penultima.'">'.$penultima.'</a>';
    $paginacao .= '<a href="index.php?pag='.$ultima_pag.'">'.$ultima_pag.'</a>';
  }
  
  elseif($pag > (2 * $adjacentes) && $pag < $ultima_pag - 3)
  {
    $paginacao .= '<a href="index.php?pag=1">1</a>';        
    $paginacao .= '<a href="index.php?pag=1">2</a> ... ';  
    for ($i = $pag-$adjacentes; $i<= $pag + $adjacentes; $i++)
    {
      if ($i == $pag)
      {
        $paginacao .= '<a class="atual" href="index.php?pag='.$i.'">'.$i.'</a>';        
      } else {
        $paginacao .= '<a href="index.php?pag='.$i.'">'.$i.'</a>';  
      }
    }
    $paginacao .= '...';
    $paginacao .= '<a href="index.php?pag='.$penultima.'">'.$penultima.'</a>';
    $paginacao .= '<a href="index.php?pag='.$ultima_pag.'">'.$ultima_pag.'</a>';
  }
  else {
    $paginacao .= '<a href="index.php?pag=1">1</a>';        
    $paginacao .= '<a href="index.php?pag=1">2</a> ... ';  
    for ($i = $ultima_pag - (4 + (2 * adjacentes)); $i <= $ultima_pag; $i++)
    {
      if ($i == $pag)
      {
        $paginacao .= '<a class="atual" href="index.php?pag='.$i.'">'.$i.'</a>';        
      } else {
        $paginacao .= '<a href="index.php?pag='.$i.'">'.$i.'</a>';  
      }
    }
  }
}

Se a página atual for menor do que cinco (o adjacentes esta configurado com 2) é feito um laço. No for, enquanto a variável ‘i’ for menor do que seis os números são mostrados fazendo uma verificação para saber qual é a página atual que exige uma estilização diferente.

Gerados os números, à variável ‘paginacao’ ainda são somados os três pontos e a última e penúltima página.

Mas se a página atual for maior do que quatro e menor do que a última menos três, é uma página intermediária. Primeiro são anexadas a primeira e última páginas. Depois é feito um laço para definir as adjacentes.

A variável ‘adjacentes’ recebeu neste código o valor dois. Para enteder melhor este laço vamos supor que estamos na página seis. A variável ‘i’ vai receber quatro (atual – adjacentes), enquanto ela for menor do que oito (atual + adjacentes) os números links gerados com uma verificação para saber qual é a página atual. Por fim são anexadas a última e penúltima páginas.

O último else é para quando a página atual esta perto do final da numeração. São anexadas a primeira e última páginas além dos três pontos. A variável ‘i’ recebe o resultado da última página menos oito (4+2*2) enquanto não for menor ou igual a este número, os links são gerados.

Na Tela

Até esta altura do código, nenhuma paginação foi mostrada, apenas a variável ‘paginacao’ recebeu os links.



if ($prox <= $ultima_pag && $ultima_pag > 2)
{
  $paginacao .= '<a href="index.php?pag='.$prox.'">pr&oacute;xima &raquo;</a>';
}
  
echo $paginacao;

echo '</div>';

A variável ainda recebe o link para a próxima página que é atribuído após uma verificação para saber se não estamos na última página nem na primeira.

Por fim com um echo toda a paginação é mostrada e é fechada a div que contém os links.

Download do código utilizado neste tutorial: Paginação Avançada Com PHP

Be Sociable, Share!

60 Comentários

  1. rdmelo

    Não entendi muito bem, mas vou dar um bela estuda e fazer vários testes localmente.
    Fazendo os testes me surgiu o seguinte erro:
    Fatal error: Call to undefined function: filter_var() in …\index.php on line 23

  2. rdmelo

    De fato usando strip_tags resolvi meu problema inicial. Agora estou com uma dúvida: No meu bd tenho 12 registros, quando eu deixo a $limite = 5 o resultado é uma paginação com 3 links, porém o resultado é apenas 10 registros. Ficou faltando os 2 primeiros registros no bd que são os mais aintigos. Sem contar que alguns registros se repetiram, aparecendo tanto no link 1 quanto no link 2 ou no 3. A minha busca no bd está sendo feita pelo id e ordenado por Desc ficando assim: "select * from testes where status = '1' order by id desc limit $inicio, $limite". Se eu mudar a $limite para 10 o problema persiste. Pergunta: Além de mudar a $limite , preciso mudar outras variaveis para obter uma paginação correta? Você tem ideia do porque os últimos registros não estão aparecendo e porque alguns se repetem?

  3. Olá rdmelo e gonçalo. Revi o código e realmente é preciso fazer uma pequena alteração no cálculo que define a partir de qual registro deve ser feita a seleção na tabela. A variável 'inicio' deve receber o seguinte cálculo:

    $inicio = ($pag – 1) * $limite;

    A alteração já foi feita no tutorial e peço desculpas por este descuido no código.

  4. Júnior

    Olá, ótimo tutorial. Queria saber como posso mostrar o número de 5 páginas por exemplo. Queria que o '…' ficasse tipo assim: 1 2 3 4 5 … Proxima>> Isso para as 5 primeiras páginas. Caso a pessoa navegasse até a oitava página por ex. seria: <<Anterior … 4 5 6 7 8 … Proxima >>. No seu exemplo aparece sempre as 2 primeiras páginas: 1 2..4 5 6..10 12 por ex. Grato.

  5. Alexandre

    Ótimo tutorial, adorei, proucurei por isso a um tempão.
    Só está faltando uma coisa se vcs puderem me ajudar o tuto vai ficar exelente é dar um resultado para busca, por exemplo se eu colocar – FROM usuarios WHERE cliente_nome LIKE '%".$palavra."%' – e o resultado da pesquisa forem 3 itens o primeiro ele me retorna o resultado correto, porem se eu clico no link da paginação para exibir o proximo resultado ele me mostra todos os resultados que estão cadastrado no bd.
    Assim! me parece que se por exemplo eu digito no campo de busca bolo, ele me retorna que tem 3 bolos cadastrados mais quando eu clico no link para exibir o broximo bolo o nome bolo some da pesquisa e ele me retorna todos os produtos cadastrados no bd como se eu não tivece digitado um parametro para pesquisa. Se vcs puderem me ajudar ficarei muito agradecido e tenho certeza que ajudarão muitos companheiros que lerem este tuto, valeu!

    • E ai cara… tava querendo usar este sistema de paginação usando o LIKE tbm na query sql e me deparei com o MESMO problema.

      É uma area onde o cara vai pesquisar pelos clientes cadastrados no banco e caso exista mais de uma pessoa com o mesmo nome ai que a paginação entraria em ação.

      Resolvi usando o GET no lugar do POST.

      O problema é que no POST qdo vc clica na proxima pagina a variavel perde o valor que foi passado pelo form da pagina anterior onde foi digitada a pesquisa. Usando o GET o valor fica sempre na URL e ai fica facil.

      Vc só vai precisar alterar todos os links ai da variavel $paginacao.

      Eu fiz a seguinte alteração…

      Antes:

      $paginacao .= ‘‘.$i.’‘;

      Depois:

      $paginacao .= ‘‘.$i.’‘;

      Isso fez com que a variavel $nome puxasse o valor da URL e isso acaba com o problema!

      Boa sorte ai!!!!

  6. Kleber

    achei seu tutorial excelente… estou utilizando ele em um projeto mas ta com dois erros que não consigo descobrir o que esta havendo o primeiro seria o mesmo que o Alexandre postou quando coloco algo dentro do LIKE ele tras os resultados mas se tver mais de uma pagina de resultados a proxima pagina aparece em branco, o outro problema é que tenho uma pagina que lista todos os anuncios mas eu passo o valor sem LIKE ai ele mostra todos os resultados em suas devidas pagina mas quando chega na ultima pagina e tem por exemplo 2 resultados de 15 que é pra mostrar ele mostra os 15 resultados repetindo alguns da pagina anterio, como faço pra ele mostrar somente os dois ultimos resultados na pagina…fico no aguardo vlw.

  7. carlosjgw

    Muito bom amigo este seu código,estou utilizando aqui em um projeto para um cliente, fiz umas pequenas mudanças e ficou da hora.

  8. Adilson

    Baixei o script para estudar ele, e no meu caso está dando estes erros:
    Notice: Undefined index: pag in D:wampwwwPAGindex.php on line 22
    Notice: Undefined variable: paginacao in D:wampwwwPAGindex.php on line 69

    o estranho é que se começo a navegar nas páginas, ele deixa de dar erro. aí se votlo para a primeira ou vou para a última dá o erro novamente.

    • Jolimar

      Amigo, esse seu problema pode ser resolvido colocando um @ antes da variavel, ficando asim: @$paginacao, esse erro aparece, pq na primeira página, a váriavel está vazia, fazendo com que ela fica como sem valor, por isso mostra o erro, já qunado vc navega, ela passa a ter um valor. então pra evitar esse erro, coloque um @ no começo da variavel.

  9. Luciano

    Senhores, o meu erro é o mesmo do colega Adilson. Como faço para resolver???

  10. fantastico, vlw mesmo!!!! god bless you!!!

  11. Geovanes Lopes

    Perfeito!!! Parabéns!!!

  12. Eli

    Ola amigo ?
    Eu também estou tendo o mesmo problema dos colegas Adilson e Luciano !!
    Eu já testei com PHP 5.2.11 e 5.3.0 .
    Se puder dar uma ajudinha, fico muito grato !!

    Agradeço desde já.

  13. Eli

    Olá !
    Eu consegui resolver o erro que estava dando, igual dos colegas Adilson e Luciano !
    É só colocar um ' @ ' antes das variaveis que estiver dando erro ( indefinida ) !
    Pra mim deu tudo certo, espero que pra vocês também !
    Até mais.

  14. Lucas

    Olá primeiramente gostaria de informar que foi ótimo seu post. Porém estou com a mesma dúvida do júnior. 
    Quando a página avança das adjacentes, depois dos pontos "…" aparecem todas as páginas do início de volta inclusive uma página de número " -1 ". Gostaria de saber como remover esse suposto erro. No mais parabéns

  15. Paulo

    Olá a todos, gostaria de informar que na linha:
    for ($i = $ultima_pag – (4 + (2 * adjacentes)); $i <= @$ultima_pag; $i++)
    está faltando um $ no adjacentes já que é uma variável, então ficando assim:
    for ($i = $ultima_pag – (4 + (2 * $adjacentes)); $i <= @$ultima_pag; $i++)

  16. Frederico

    Vi que na paginação que você desenvolveu (muito boa por sinal), a próxima página pega os anteriores e mais um da nova página. Vou explicar: Se eu colocar para paginar 5 registros por página e tiver um total de 6 registros na minha consulta, ele me retornará na segunda página, os quatro da página anterior mais o registro que falta. Como eu faria para que ele pegasse apenas à partir do ponto que falta, ou seja, neste exemplo somente o sexto registro?
    Obrigado e parabéns pelo artigo!

  17. italo rodrigo

    esse erro que a maioria está encontrando é apenas um erro de digitacao. encontrem essas linha:

    $paginacao .= '1';
    $paginacao .= '2 … ';

    alterem para:

    $paginacao .= '1';
    $paginacao .= '2 … ';

  18. Násser

    Olá amigo, tenho uma dúvida…
    Quando altero a variável ' $limite ' para 2 por exemplo, para mostrar 2 artigos por página, o último artigo dessa primeira página, aparece em primeiro na segunda página e assim por diante…

    Como faço para corrigir esse problema ?? Desde já agradeço… e parabéns pelo Artigo…

  19. Sebas

    Olá Maicon!
    Consegui adaptar e fazer funcionar perfeitamente.
    Tiver várias dificuldades,as mesmas já relatas nos comentários acima.
    Obrigado pelo tutorial e por disponibilizar o link com o material.
    Sebas

  20. Opa… funfou de primeira, agora estou fazendo só uns pequenos ajustes pra não aparecer as 2primeiras e ultimas numerações Ex.: >>> 1.2 … 3.4.5 …8.9, más ficou show de bola, certinho, valewwww 

  21. Anderson

    Ola, tive um pequeno problema…..
    Se coloco esta paginação juntamente com um formulario de busca, legal funciona EX: vamos supor que tenho 48 paginas de paginação…..assim que faço o filtro cai para 20 paginas, mas qdo clico na pag 2 para ver a segunda pagina do filtro é feito uma consulta total no banco de dados novamente. Alguem tem alguma ideia do que pode estar acontecendo???????

  22. Eduardo

    Olha…

    Muito bom esse artigo, vou alterar o layout de paginação que uso.

    Muito fácil o entendimento, meus parabéns…

    Eduardo

  23. Bruno Gasparotti

    Olá amigos quando altero a variável ' $limite ' para 3 no meu caso para mostrar 3 artigos por página, quando clico na próxima pagina aparece somente um artigo novo e dois da pagina anterior aparece em primeiro na segunda página e assim por diante … tem como me ajudar nesse erro?

    Grato

    Como faço para corrigir esse problema ?? Desde já agradeço… e parabéns pelo Artigo…

  24. Bruno Gasparotti

    Olá amigos, quando altero a variável ' $limite ' para 3 n meu exemplo, para mostrar 3 artigos por página, os  dois últimos artigos da primeira página, aparece em primeiro na segunda página e assim por diante… 

    Como faço para corrigir esse problema ?? Desde já agradeço…

    • Nilson

      Bruno, eu fiz a correção e postei aqui no tópico… assim que o moderador autorizar o post acredito que vai dar pra matar a dúvida de muita gente

  25. Nilson

    Estou com o mesmo problema do Gasparotti e também com problemas na utilização do like '%pesquisa%'…

    Alguem conseguiu desvendar esses problemas?

  26. Nilson

    Bom pessoal, depois de penar um pouco, consegui resolver meus problemas com a paginação e vou postar aqui como ficou para ajudar o pessoal…

    Fiz alguns comentários sobre o que entendi dele e caso pinte alguma dúvida, estamos ae!

    <?php
    //Informando a condição caso o PHP seja chamado via paginação ou consulta no formulário
    if (($_POST['pesquisa']) || ($_GET['pag'])) {

    //informando um valor para o like do SQL 
    if ($_POST['pesquisa']){$pesquisa = $_POST['paciente'];}
    if ($_GET['pag']){$pesquisa = $_GET['pesquisa'];}

    //selecionando o total de linhas com minha variável
    $sql = "SELECT * FROM pacientes WHERE tx_paciente LIKE '%$pesquisa%'";
    $resultado = mysql_query($sql) or die (mysql_error());
    $total2 = mysql_num_rows($resultado);

    //caso haja algum resultado
    if (mysql_num_rows($resultado)>0)
    {
    $pag = ($_GET['pag']);
    $pag = filter_var($pag, FILTER_VALIDATE_INT);
    $inicio = 0;
    //Limite da paginação
    $limite = 15;

    //Definindo o número de páginas
    if ($pag!=''){$inicio = $pag – 1;} 
    $busca_total = mysql_query("SELECT COUNT(*) as total FROM pacientes WHERE tx_paciente LIKE '%$pesquisa%'");
    $total = mysql_fetch_array($busca_total);
    $total = $total['total'];

  27. Nilson

    //Tive que dividir meu post…  segue parte 2

    //Limitando o número de retornos por página
    $busca = mysql_query("SELECT * FROM pacientes WHERE tx_paciente LIKE '%$pesquisa%' LIMIT $inicio, $limite");

    if (mysql_num_rows($busca)>0){
    $prox = $pag + 1;
    $ant = $pag – 1;
    $ultima_pag = ceil($total / $limite);
    $penultima = $ultima_pag – 1;
    $adjacentes = 2;

    //Esta parte é o modo Gambiarra ON!!!  
    //Para a paginação funcionar corretamente, tive que fazer este cálculo para que ela não repetisse os dados.  
    if ($pag < 1){$contar = 0;}
    //Caso altere o limite da paginação, repita aqui.. Ex.: 10 Linhas:  $pag * 10 – 10 ou 3 Linhas:  $pag * 3 – 3
    else{$contar = $pag * 15 – 15;}

    //Colocando os dados nas páginas certas
    $sql_paginado = "select * from pacientes WHERE tx_paciente LIKE '%$pesquisa%' ORDER BY tx_paciente ASC LIMIT $contar,$limite";
    $query_paginado = mysql_query($sql_paginado);
    echo "Sua consulta retornou: $total2 paciente(s)";
    echo "<ul class='lista-cliente'>";
    while ($linha=mysql_fetch_array($query_paginado))
    {
    if ($cor == 'e4e4e4') 
    $cor = 'efefef';
    else $cor = 'e4e4e4';
    $id = $linha['cd_paciente'];
    $paciente = $linha['tx_paciente'];
    $nascimento = substr($linha['dt_nascimento'],6,2)."/".substr($linha['dt_nascimento'],4,2)."/".substr($linha['dt_nascimento'],0,4);
    $telefone = $linha['int_telefone'];
    echo "<li style='background:#$cor; border: #cdcdcd dotted 1px;'> 
    <a href='pacientes-ver.php?paciente=$id'>Nome: $paciente Nascimento: $nascimento   Telefone: $telefone
    ";
    }
    }
    echo "";

  28. Nilson

    //Parte 3

    //caso altere o limite, altere o valor aqui também!  Aqui a paginação vai entender que caso encontre mais do que o limite da paginação, ele acionará os botões
    if (mysql_num_rows($resultado)>15){

    //endereço da página onde a paginação está rodando
    $endereco = "pacientes.php";

    //campo que irá passar o valor para a proxima página em caso de consulta com formulário e like
    $consulta = "pesquisa=$pesquisa";
    //paginação
    echo '<div id="galeria-paginator">';
    echo '<div class="paginacao">';
    if ($pag>1){$paginacao = '<a href="'.$endereco.'?'.$consulta.'&pag='.$ant.'">Anterior';}
    if ($ultima_pag <= 15){
    for ($i=1; $i< $ultima_pag+1; $i++){
    if ($i == $pag){
    $paginacao .= '<a class="atual" href="'.$endereco.'?'.$consulta.'&pag='.$i.'">'.$i.'';} 
    else {$paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag='.$i.'">'.$i.'';}
    }} 
    if ($ultima_pag > 15){
    if ($pag < 1 + (2 * $adjacentes)){
    for ($i=1; $i< 2 + (2 * $adjacentes); $i++){
    if ($i == $pag){$paginacao .= '<a class="atual" href="'.$endereco.'?'.$consulta.'&pag='.$i.'">'.$i.'';} 
    else {$paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag='.$i.'">'.$i.'';}}
    $paginacao .= '…';
    $paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag='.$penultima.'">'.$penultima.'';
    $paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag='.$ultima_pag.'">'.$ultima_pag.'';
    }
    elseif($pag > (2 * $adjacentes) && $pag < $ultima_pag – 3)
    {
    $paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag=1">1';
    $paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag=1">2 … ';
    for ($i = $pag-$adjacentes; $i<= $pag + $adjacentes; $i++)
    {
    if ($i == $pag)
    {
    $paginacao .= '<a class="atual" href="'.$endereco.'?'.$consulta.'&pag='.$i.'">'.$i.'';
    } else {
    $paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag='.$i.'">'.$i.'';
    }}
    $paginacao .= '…';
    $paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag='.$penultima.'">'.$penultima.'';
    $paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag='.$ultima_pag.'">'.$ultima_pag.'';
    }
    else {
    $paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag=1">1';
    $paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag=1">2 … ';
    for ($i = $ultima_pag – (4 + (2 * adjacentes)); $i <= $ultima_pag; $i++)
    {
    if ($i == $pag)
    {
    $paginacao .= '<a class="atual" href="'.$endereco.'?'.$consulta.'&pag='.$i.'">'.$i.'';} 
    else {$paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag='.$i.'">'.$i.'';}
    }}}}
    if ($prox <= $ultima_pag ){$paginacao .= '<a href="'.$endereco.'?'.$consulta.'&pag='.$prox.'">Pr&oacute;xima';}
    echo $paginacao;
    echo '</div>';
    }
    }
    //Bom, acho que com isso vocês vão conseguir resolver os problemas com a paginação.
    ?>

  29. Muito Bom o Post Parabéns ! Estou fazendo os tetes em Breve colocarei no site ! valeu pela Dica!

  30. Christian Galois

    Excelente artigo!
    Muito grato pela ajuda, amigo!
    Forte abraço.

  31. Fabiano

    Bom post, me ajudou muito a entender a logica para criar uma paginação apropiada para uma pagina, não tive problemas em adaptar o codigo

    Valeu

  32. Olá amigo como eu faria o parte de chamar os resultados se tivesse 2 tabelas? Uma e dependente da Outra !
    Como poderia usar o Count, Sendo que terei de usar um Where e um And nesta consulta?

  33. Creuza

    Parabéns … Tutorial ótimo. Fiz algumas alterações pois através de um formulário faço a pesquisa. vc teria um tutorial com a variável $_post. minha tabela tem 500 registros e quando faço a pesquisa o numero varia conforme a palavra digitada no campo text do formulário.

  34. Silas Batista

    Olá.. Faltou avisar que a página deve ter a variavel GET "pag" na url (index.php?pag=1) para funcionar.
    Tambem deve indicar a variavel $paginacao deixando em branco ($paginacao="";)

  35. Muito bom cara, eu modulei ele aqui da minha forma e está rodando direitinho!!!
    Parabéns mesmo :D

  36. rogermaxrjs

    Me perdoem meu caros, mas está tudo em Grego para mim, já há 1 ano que queria colocar paginação nas páginas de meu blog em meu site, como faço tudo via artisteer entrei em contato com o suporte e o que responderam foi que só seria possível caso utilizasse alguma plataforma, seja blogger, wordpress, joomla ou outra, como não uso disseram ser impossível, assim estou penando até hoje, pois não entendo nada de programação, portanto se alguém puder ajudar de alguma forma serei grato. Caso alguém saiba resolver meu problema posso até pagar, se for o caso, desde que não seja muito caro. Meu site é: http://rogermaxrjs.com.br OBS.: Estou fazendo uma mudança no layout e logo estarei publicando…

  37. William Oliveira

    Boa noite,
    Gostaria de agradecer pelo tutorial que por sinal me ajudou muito, estou tendo apenas um pequeno probleminha, quando aparecem os(…) a paginacao repete o numero anterior  mas apenas quando esta em numeracao baixa.
    ex: 12345..567.
    Desde ja agradeco!

  38. Carlos Eduardo

    Ainda tem alguém que está acompanhando esse link?

    estou com alguns problemas.

  39. Almir

    para ben pelo codigo , passei semanas testando codigo mais simples do que este e sempre alguma coisa dava errado, e quando testei este entendi em poco tempo e é alem do que eu queria.

    Muito obrigado!!

  40. Elias Gabriel

    Paginação simples com intervalos.
    ex: Anterior 1 2 3 4 5 … Próxima,   Anterior … 3 4 5 6 7 … Próximo. 

    parte 1
    <HTML>
    <HEAD>
     <TITLE>New Document</TITLE>
    </HEAD>
    <BODY>
    <div class="css">
    <?php
    include "";// aqui sua conexção com o banco de dados
    $pag = (isset($_GET["pag"])) ? $_GET["pag"] : null;
    $pag = filter_var($pag, FILTER_VALIDATE_INT);
    $pagina = (isset($_GET["pagina"])) ? $_GET["pagina"] : null;
    if($pag == "") {
        $pag = "1";
    }

    $inicio = 0;
    $limite = 1;
    $inicio = ($pag – 1) * $limite;

    $busca_total = mysql_query("SELECT COUNT(*) as total FROM tabela");
    $total = mysql_fetch_array($busca_total);
    $total = $total['total'];
    //Nesta linha o ORDER BY id ASC Será exibido os dados na ordem crescente
    $busca = mysql_query("SELECT * FROM tabela ORDER BY id ASC LIMIT $inicio, $limite");
    if (mysql_num_rows($busca)>0)
    {
    while ($linha = mysql_fetch_array($busca))
    {
    //Aqui você exibe os dados da tabela do seu jeito.
    echo "<div> ";
    //a class é a aplicação do css dentro do echo
    echo "<b class='css'>Usuario: <b class='css'>".$linha["nome"]." ";
    echo "</div> ";}
    ?>

  41. Elias Gabriel

    Parte 2

    <div class="paginacao_louvor">
    <?php
    <?php
    $prox = $pag + 1;
    $ant = $pag – 1;
    $ultima_pag = ceil($total / $limite);
    $penultima = $ultima_pag – 1;
    $adjacentes = 2;
    if($total>1){
    //Nesta linha o botão anterior é exibido sem link e e você pode colocar uma class para ficar meio apagado.
          $consulta = "pesquisa=$pag";$paginacao = '<b  class="css" >Anterior'; }
    echo '<div class="paginacao">';
    if ($pag>1){
    //nesta linha a class do botão anterior com link é a mesma de todos os links das páginas
      $paginacao = '<a class="css" href="paginatal.php?pag='.$ant.'">anterior';}
    if ($ultima_pag <= 5){
    for ($i=1; $i< $ultima_pag+1; $i++){
    if ($i == $pag){
    //nesta linha a class é para diferenciar a página atual das demais.
    @$paginacao .= '<a class="css" href="paginatal.php?pag='.$i.'">'.$i.'';
    }
    //nesta linha a class é a mesma do botão anterior com link.
    else {$paginacao .= '<a class="css"  href="paginatal.php?'.$consulta.'&pag='.$i.'">'.$i.'';}
    }}

    if ($ultima_pag > 5)
    {
    if ($pag < 1 + (2 * $adjacentes))
    {
    for ($i=1; $i< 2 + (2 * $adjacentes); $i++)
    {
    if ($i == $pag)
    {
    //nesta linha a class que diferencia a página atual das demais
    $paginacao .= '<a class="atual" href="paginatal.php?pag='.$i.'">'.$i.'';
    }
    //nesta linha a class é a mesma do botão anterior com link.
    $paginacao .= '<a class="sem_link" href="paginatal.php?pag='.$i.'">'.$i.'';
    }
    }
    //nesta linha a class é a mesma do botão anterior sem link.
    $paginacao .= '<b class="sem_link">…';
    }
    elseif($pag > (2 * $adjacentes) && $pag < $ultima_pag – 3)
    {
    //nesta linha a class é a mesma do botão anterior sem link.
    @$paginacao .= '<b class="sem_link">…';

  42. Elias Gabriel

    Parte 3
    for ($i = $pag-$adjacentes; $i<= $pag + $adjacentes; $i++)
    {
    if ($i == $pag)
    {
    //nesta linha a class que diferencia a página atual das demais.
    $paginacao .= '<a class="atual" href="paginatal.php?pag='.$i.'">'.$i.'';
    } else {
    //nesta linha a class é a mesma do botão anterior com link.
    $paginacao .= '<a class="link" href="paginatal.php?pag='.$i.'">'.$i.'';
    }}
    //nesta linha a class é a mesma do botão anterior sem link.
    $paginacao .= '<b class="sem_link">…';
    }
    else
    {
    //nesta linha a class é a mesma do botão anterior sem link.
    $paginacao .= '<a class="sem_link" href="paginatal.php?pag=20">…';
    for ($i = $ultima_pag – (4 + (2 * @adjacentes)); $i <= $ultima_pag; $i++)
    {
    if ($i == $pag)
    {
    //nesta linha a class que diferencia a página atual das demais.
    $paginacao .= '<a class="atual" href="paginatal.php?pag='.$i.'">'.$i.'';
    }
    else {
    //nesta linha a class é a mesma do botão anterior com link.
    $paginacao .= '<a class="link" href="paginatal.php?'.$consulta.'&pag='.$i.'">'.$i.'';}
    }}} }
    if (@$prox <= @$ultima_pag && @$ultima_pag > 1){
    //nesta linha a class é a mesma do botão anterior com link.
    @$paginacao .= '<a class="link" href="paginatal.php?'.$consulta.'&pag='.$prox.'">Pr&oacute;xima';}
    else
    //nesta linha a class é a mesma do botão anterior sem link.
    if (@$prox >= @$penultima&&$total>1 ){@$paginacao .= '<b class="sem_link">Pr&oacute;xima';}
    echo @$paginacao;
    echo '</div>';
    ?>
    </div>
    </BODY>
    </HTML>

Participa! Comenta...