Forums » PHP e MySQL

Paginação de resultados com php e mysql

    • 466 posts
    12 de agosto de 2014 00:33:26 ART

    Paginação de resultados com php e mysql (Aprenda definitivamente no passo a passo)

    Olá pessoal!


    Depois de muito tempo sem postar nada relacionado a programação, volto aqui com algo que é bastante requisitado no mundo da programação em php. Como fazer, e – principalmente – entender a lógica da paginação de resultados?


    Confesso que tive dificuldades para aprender, até pela falta de bom material explicativo que fosse desde a lógica à prática. Então decidi fazer esse tutorial da forma mais clara e com boa explicação possível, para que aprendam a paginar definitivamente.
    Se chegou até aqui, certamente que é porque já sabe o que é uma paginação de resultados, mas caso ainda não saiba, um exemplo fácil é a divisão de páginas que o Google faz quando você faz uma busca. Já imaginou se todos os resultados da pesquisa fossem exibidos em uma única página? Seria um desastre, não é?

     

    PRIMEIRA PARTE


    Supondo que iremos rodar a nossa página em localhost (servidor local / seu próprio computador) e que temos um banco de dados com o nome de loja, faremos uma conexão com o nosso servidor e iremos selecionar o nosso banco de dados desejado no seguinte código:

     

    $conexao = mysql_connect("localhost","usuario","senha"); // Faz a conexão com o servidor local
    $banco = mysql_select_db("loja", $conexao); // Seleciona o banco de dados 'loja'


    Após termos feito a conexão e a seleção do banco com o qual queremos trabalhar, definiremos uma variável contendo um limite de registros a serem mostrados por página.


    $limite = 5; // Define o limite de registros a serem exibidos com o valor cinco


    Depois precisamos pegar pela url a página atual (número da página) que será exibida. Faremos isso usando a superglobal $_GET, e a variável ‘pag’ que estará na url.
    (exemplo: http://www.meusite.com/pagincao.php?pag=1).

     

    // Captura os dados da variável 'pag' vindo da url, onde contém o número da página atual
    $pagina = $_GET['pag'];


    Caso não exista nenhuma página (valor) vinda pela url, então definiremos o estado inicial da variável $pagina como um.

     

    /* Se a variável $pagina não conter nenhum valor,
    então por padrão ela será posta com o valor 1 (primeira página) */

    if(!$pagina)
    {
    $pagina = 1;
    }

    Até aqui tudo bem, mas é agora que começa a “complicar” os leigos em paginação. Nessa etapa, definiremos uma variável $inicio, e nela estará uma operação aritmética que irá definir – não a página inicial, como muitos se confundem -, mas, sim,a partir de qual registro do banco de dados irá ser iniciado.
    Veja:


    /* Operação matemática que resulta no registro inicial
    a ser selecionado no banco de dados baseado na página atual */
    $inicio = ($pagina * $limite) - $limite;


    Está confuso? Calma, irei explicar melhor rs…
    Supondo que temos dez registros no nosso banco de dados, e sendo que o nossolimite de registros por página é cinco, então a partir de qual registro o número de uma página irá iniciar?
    Para sabermos, faremos um exemplo com valores reais no lugar da $pagina e do$limite do código mostrado acima para que entenda melhor.
    Iniciaremos pela primeira página:


    $inicio = (1 * 5) – 5;


    Essa operação resulta em zero. Mas, o inicio não deveria ser um? Não, pois vale lembrar que o inicio real dos registros no banco de dados tem o inicio a partir do número zero, e não do um. Então o primeiro registro a ser exibido estará correto! :)
    E se fosse a página dois?


    $inicio = (2 * 5) – 5;


    O que resulta em cinco, ou seja, na primeira página será exibido do registro zero ao registro quatro, e como o zero conta, resulta em cinco números, correto? E na segunda página, será mostrado do registro cinco ao dez. Entendeu? ;)
    Eu costumo chamar isso de ponteiro, então o nosso ponteiro irá andar de cinco em cinco registros por página no banco de dados.
    Agora, para fazer com que isso comece a funcionar, iremos fazer uma consulta no banco de dados, selecionar os registros que iremos mostrar no nosso site e definir um LIMIT(limite) para a exibição dos registros no mysql. Para isso, iremos usar as nossas variáveis $inicio e $limite.

     

    $query = mysql_query("SELECT id, nome FROM produtos LIMIT $inicio,$limite");


    Após ter feito a consulta, chegou a hora de mostrar os registros na página. Faremos isso com a estrutura de repetição while, pois, assim, serão pegos todos os registros que precisamos, ou seja, os primeiros cinco registros.

     

    while($mostrar = mysql_fetch_array($query))
    {
    echo $mostrar['campo da tabela que você quer mostrar']."<br/>";
    }


    Perfeito. Agora podemos mostrar os dados vindo do banco de dados no nosso registro e ver ele funcionando. Basta que – ao testar – você digite no final da url pag= e colocar o número de uma página que você desejar baseado na quantidade de registros que você deve ter, ou seja, no nosso caso só teremos duas páginas, pois temos apenas dez registros.

     

    SEGUNDA PARTE

     

    Chegamos a segunda e última parte da nossa aplicação. Agora aprenderemos a criar o acesso às páginas, ou seja, faremos com que as páginas sejam mostradas númericamente, e elas estarão lincadas, ou seja, será possível clicar e acessar as páginas seguintes através delas.
    Agora, teremos que fazer uma nova consulta no nosso banco, pois a consulta anterior está limitada (LIMIT), e nesse momento precisamos que não tenha limite algum, afinal, iremos saber o total de registros a partir dessa consulta.
    O que faremos é pegar o id na nossa tabela e colocá-lo em uma variável de nome$consulta.

     

    $consulta = mysql_query("SELECT id FROM produtos"); // Seleciona o campo id da nossa tabela produtos


    Após ter feito a consulta, pegaremos agora o total de registros (você poderá se deparar com o termo ‘linhas’ em outros lugares) com a função mysql_num_rows.

     

    // Captura o número do total de registros no nosso banco a partir da nossa consulta
    $total_registros = mysql_num_rows($consulta);


    Feito isso, estamos em um ponto crucial para saber como o total de páginas surgirá. A lógica está em saber o total de registros de um determinado campo na nossa tabela – no caso, o campo id – e dividílo pelo limite de registros a serem exibidos.
    Vamos a um exemplo prático:


    (total de registros / limite de registros)


    Se o nosso total de registros for dez, e o nosso limite é cinco registros por página, então qual será o total de páginas? Será duas, pois dez dividido por cinco é dois!
    Mas, poderemos nos deparar com um problema! E se o total de registros não for um valor arredondado, e sim um valor decimal? Irei explicar melhor. E se ao invés de dezo nosso total de registros fosse nove e o nosso limite fosse cinco? O Resultado seriaquatro vírgula cinco (Decimal), o que resultaria na falta do último registro e página, pois na página anterior não haveria espaço para esse último registro.
    Como poderemos fazer com que os registros sejam divididos em páginas em que não falte nenhum registro? A solução está na função CEIL do php. Essa função arredonda para cima valores numéricos. Então ao invés de quatro vírgula cinco, o resultado arredondado seria cinco! ;)
    Veja:

     

    /* Define o total de páginas a serem mostradas baseada
    na divisão do total de registros pelo limite de registros a serem mostrados */
    $total_paginas = Ceil($total_registros / $limite);


    E a mágica está feita. O que nos resta agora é mostrar os números das páginas lincadas com a estrutura de repetição FOR.
    Caso não saiba como o FOR funciona, a sintaxe dele é:

     

    <Início>; <Condição>; <Incremento> ;


    Início: Será a variável $i com o valor inicial de um, ou seja, a primeira página.

    Condição: Será a variável $i menor ou igual a variável $total_paginas. Quando a variável $i atingir o número total de páginas, a repetição estará completa e finalizada.
    Incremento: $i++. Cada vez que $i não tiver atingido o número total de páginas, o incremento de valor um será adicionado nele, até que ele esteja igual ao número total de páginas.
    Dentro do escopo (código entre as chaves { }) do FOR, terá o código a ser executado até que a condição seja satisfeita. Nesse código estará em números as páginas lincadas com código HTML que enviarão pela URL quando forem clicadas, a página que queremos ter acesso através do nome da página mais a variável pag.
    Veja:

     

    for($i=1; $i <= $total_paginas; $i++)
    {
    echo '<a href="pagincao.php?pag='.$i.'"> '.$i.'</a>';
    }


    Agora teste e veja se está funcionando tudo corretamente.

    Caso queira saber fazer para que quando uma página seja clicada, ela se transforme em texto para que não seja clicada novamente até que a página seja mudada, também é simples!
    O que você terá que fazer é verificar a página atual. Você descobrirá comparando a variável $i com a variável $página.

     

    for($i=1; $i <= $total_paginas; $i++)
    {
    if($pagina == $i)
    {
    echo " ".$i." "; // Escreve somente o número da página sem ação alguma
    }
    else
    {
    echo '<a href="pagincao.php?pag='.$i.'"> '.$i.'</a>'; // Escreve o número e o link da página

    }
    }


    Pronto, está feito!


    Caso você também queira saber como fazer os links “primeira página” e “última página”, também é fácil!
    A primeira página, basta você colocar antes do FOR, um echo com HTML lincado com a variável pag com o valor um.
    E a última página, depois do FOR, um echo com HTML lincado com a variável$total_paginas.
    Ficará assim:

     

    echo '<a href="index.php?pag=1">'.'Primeira página'.'</a>';
    for($i=1; $i <= $total_paginas; $i++)
    {
    if($pagina == $i)
    {
    echo " ".$i." ";
    }
    else
    {
    echo '<a href="index.php?pag='.$i.'"> '.$i.'</a>';

    }
    }


    echo '<a href="index.php?pag='.$total_paginas.'"> Última página</a>';


    Chegamos ao fim do nosso tutorial. Qualquer dúvida, sugestão ou correção será muito bem vinda.
    Se funcionou tudo corretamente, parabéns, você já sabe fazer uma paginação de resultados.
    Abraços e obrigado por ter lido esse tutorial.


    Este post foi editado por Oliveira Dario em 12 de agosto de 2014 00:38:39 ART"