How to do PHP and MySQL pagination?

6

I want to make a pagination on my blog. I will not have 50 posts on the first page, so I want to limit the page to the last 15 posts added and then clicking the "older posts" button will show me the oldest posts. In the background I do not want to load the page full of posts, basically it is like Google history, we have our history and everything does not appear on the page since we installed it, we have buttons saying "older", "newer" p>     

asked by anonymous 23.07.2014 / 16:14

3 answers

8

Following is an example of a paging code, all lines are commented out.

<?php
    //inclusão da conexão com banco de dados
    require('config/conectaBd.php');
    //A quantidade de valor a ser exibida
    $quantidade = 3;
    //a pagina atual
    $pagina     = (isset($_GET['pagina'])) ? (int)$_GET['pagina'] : 1;
    //Calcula a pagina de qual valor será exibido
    $inicio     = ($quantidade * $pagina) - $quantidade;

    //Monta o SQL com LIMIT para exibição dos dados  
    $sql = "SELECT * FROM novidades ORDER BY  data DESC LIMIT $inicio, $quantidade";
    //Executa o SQL
    $qr  = mysql_query($sql) or die(mysql_error());
    //Percorre os campos da tabela
    while($ln = mysql_fetch_assoc($qr)){?>

                <div id="noticias">
                <div style="border-bottom:1px dotted #CCC; width:700px; padding:15px; margin-left:-65px;">
            <!--echo '<div style="color:#999; font-size:10px; width:auto; margin-top:2px; margin-bottom:-3px;">'.formata_data($data).'</div>';-->

                <div id="titulo">
        <?php echo $ln['titulo'];?>
                </div>
        <img src="fotos/<?php echo $ln['foto'];?> " style="width:250px; float:left; margin-right:25px; margin-bottom:15px; padding:10px; border:2px solid #D8D8D8;"/>
        <div id="descricao">
        <?php echo $ln['descricao']?></div>
                </div>
                </div>
                </div>
        <?php }?>


        <?php
  /**
   * SEGUNDA PARTE DA PAGINAÇÃO
   */
  //SQL para saber o total
  $sqlTotal   = "SELECT id FROM novidades";
  //Executa o SQL
  $qrTotal    = mysql_query($sqlTotal) or die(mysql_error());
  //Total de Registro na tabela
  $numTotal   = mysql_num_rows($qrTotal);
  //O calculo do Total de página ser exibido
  $totalPagina= ceil($numTotal/$quantidade);
   /**
    * Defini o valor máximo a ser exibida na página tanto para direita quando para esquerda
    */
   $exibir = 3;
   /**
    * Aqui montará o link que voltará uma pagina
    * Caso o valor seja zero, por padrão ficará o valor 1
    */
   $anterior  = (($pagina - 1) == 0) ? 1 : $pagina - 1;
   /**
    * Aqui montará o link que ir para proxima pagina
    * Caso pagina +1 for maior ou igual ao total, ele terá o valor do total
    * caso contrario, ele pegar o valor da página + 1
    */
   $posterior = (($pagina+1) >= $totalPagina) ? $totalPagina : $pagina+1;
   /**
    * Agora monta o Link paar Primeira Página
    * Depois O link para voltar uma página
    */
  /**
    * Agora monta o Link para Próxima Página
    * Depois O link para Última Página
    */
    ?>
    <div id="navegacao">
        <?php
        echo '<a href="?pagina=1">primeira</a> | ';
        echo "<a href=\"?pagina=$anterior\">anterior</a> | ";
    ?>
        <?php
         /**
    * O loop para exibir os valores à esquerda
    */
   for($i = $pagina-$exibir; $i <= $pagina-1; $i++){
       if($i > 0)
        echo '<a href="?pagina='.$i.'"> '.$i.' </a>';
  }

  echo '<a href="?pagina='.$pagina.'"><strong>'.$pagina.'</strong></a>';

  for($i = $pagina+1; $i < $pagina+$exibir; $i++){
       if($i <= $totalPagina)
        echo '<a href="?pagina='.$i.'"> '.$i.' </a>';
  }

   /**
    * Depois o link da página atual
    */
   /**
    * O loop para exibir os valores à direita
    */

    ?>
    <?php echo " | <a href=\"?pagina=$posterior\">próxima</a> | ";
    echo "  <a href=\"?pagina=$totalPagina\">última</a>";
    ?>
    
24.07.2014 / 13:48
2

I will summarize a technique I use using OFFSET of MySQL.

<?php

$limite = 15; // Limite por página

// Pega página atual, se houver e for válido (maior que zero!)
if( isset( $_GET['pagina'] ) && (int)$_GET['pagina'] >= 0){
    $pagina = (int)$_GET['pagina'];
}else{
    $pagina = 0;
}

// Calcula o offset
$offset = $limite * $pagina;

// Se for 0 será 15*0 que será 0, começando do inicio
// Se for 1 será 15*1 que irá começar do 15 ignorando os 15 anteriores. ;)

$postagem = $mysqli->query('SELECT * FROM 'post' ORDER BY id DESC LIMIT '.$limite.' OFFSET '.$offset);
?>

After this, just show as you want, for example:

<?php

while($info = $postagem->fetch_array()){
// Loop finito para repetir para cada linha existente
?>

<!-- HTML PARA EXIBIÇÃO -->
<h1><?= $info['titulo'] ?></h1> 
<div class="data"><?= $info['dataHumano'] ?></div>
<div class="descricao"><?= $info['desc'] ?></div>
<!-- HTML PARA EXIBIÇÃO -->

<?php
}
?>

To page use something similar to:

  

This will trigger the $_GET['pagina'] mentioned in the first part.

<?php
if($pagina !== 0){ // Sem isto irá exibir "Página Anterior" na primeira página.
?>
<a href="meulink.com?pagina=<?php echo $pagina-1; ?>">Página Anterior</a>
<?php
}
?>
<a href="meulink.com?pagina=<?php echo $pagina+1; ?>">Página Posterior</a>

I think this is simple and will suffice, I tried to comment as much as possible.

Note:

  

The next page link will appear even if it is the last page possible! To solve this I think the best solution is to select all the lines and divide by 15 and check if the user is not on the last page.

     

I have not used bind_param because it is only integer and only in LIMIT and OFFSET, but use bind_param if there are other parameters in WHERE , for example categories.

    
17.01.2016 / 19:43
0

My site has 180 products, you can use my code works perfectly:

<?php
echo'<table width="88%" height="10" cellspacing="0" cellpadding="0"><tr>';
$conn = new PDO("mysql:host=localhost;dbname=loja", "root", "");
$stmt = $conn->prepare("SELECT * FROM 'produtos' ORDER BY 'id' ASC ");
$stmt->execute( );
$linha = $stmt->fetch(PDO::FETCH_ASSOC);
while($linha = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo'<br>';
    echo'<p><td align=center ><h2><font size="5" face="Trebuchet MS">'.$linha['nome'].'</font></font></p></h2>';
    echo "<div align=center ><img src='".$linha['foto']."' width='160' height='160' border='0'></p>";
    echo '<a href="carrinho.php?acao=add&id='.$linha['id'].'"><button type="button" name="" value="" class="quero">Eu Quero!</button>';
}
echo "</tr></table>";
?>
    
01.10.2015 / 14:53