Hola!

Así que decidí que era tiempo de realizar otro post orientado a aquellos nobles trabajadores que se dedican al desarrollo web.

he notado que ha muchas personas se les dificulta hacer un paginador  personalizado para los resultados de sus búsquedas en bases de datos, y realmente la cosa no es muy complicada, es solo de ir buscando “a tragos” en la base de datos.

Resulta que la definición del lenguaje MySQL 5.0 para la funcion SELECT, acepta la siguiente cadena:

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

Donde LIMIT es la funcion que delimita la cantidad de resultados que el query va a retornar. Esta expresión a su vez, acepta varias formas las cuales ejemplificare a continuacion:

  • LIMIT 10 : Le dice al query que regrese únicamente los primeros 10 resultados row_count
  • LIMIT 10,10 :  Le dice al query que regrese los primeros 10 resultados a partir del resultado 10, osea, el primer numero es offset y el segundo row_count 

Bien con este conocimiento básico sobre el “comando” limit en nuestros querys SELECT, podríamos idear una forma facil de paginar nuestros resultados usando parámetros en la dirección url.

Vamos a suponer que tenemos una tabla cliente definida de la siguiente forma:

id nombre direccion telefono
1 Juan Ciudad 123456
2 Pedro Ciudad2 123456

Y vamos a suponer ademas que esta tabla tiene unos 300 registros de clientes. Entonces nuestro requerimiento es paginar de 50 en 50 nuestra tabla y presentarla en un formato amigable al usuario.

Manos al código!!

<html>
 <head>
   <title>Un simple paginador</title>
 </head>
 <body>
   <?php
      //primero obtenemos el parametro que nos dice en que pagina estamos
      $page = 1; //inicializamos la variable $page a 1 por default
      if(array_key_exists('pg', $_GET)){
          $page = $_GET['pg']; //si el valor pg existe en nuestra url, significa que estamos en una pagina en especifico.
      }
      //ahora que tenemos en que pagina estamos obtengamos los resultados:
      // a) el numero de registros en la tabla
      $con=mysqli_connect("localhost","ricardogeek","passw0rd","mi_db");
      $conteo =  mysqli_query($con,"SELECT COUNT(*) as conteo FROM clientes");
      while($row = mysqli_fetch_array($result))
      {
         $conteo = $row['conteo'];
      }
      //ahora dividimos el conteo por el numero de registros que queremos por pagina.
     $max_num_paginas = intval($conteo/50); //en esto caso 50

     // ahora obtenemos el segmento paginado que corresponde a esta pagina
     $segmento = mysqli_query($con,"SELECT *  FROM clientes LIMIT ".(($page-1)*50).", 50 ");

      //ya tenemos el segmento, ahora le damos output.
      echo '<table>';
       while($row = mysqli_fetch_array($result))
      {
         echo '<tr>
                     <td>'.$row['id'].'</td>
                     <td>'.$row['nombre'].'</td>
                     <td>'.$row['direccion'].'</td>
                     <td>'.$row['telefono'].'</td>
               </tr>'; 
      }
      echo '</table><br/><br/>';

      //ahora viene la parte importante, que es el paginado
      //recordemos que $max_num_paginas fue previamente calculado.
      for($i=0; $i<$max_num_paginas;$i++){
         echo '<a href="MiScript.php?pg='.($i+1).'">'.($i+1).'</a> | ';
      }      
   ?>
 </body>
</html>

ahora bien algunas explicaciones con estilo FAQ:

  • Que significa la variable $max_num_paginas? Es el numero de paginas que tendra nuestro paginador. se calcula obteniendo el total de registros y se divide dentro de la cantidad de registros por pagina. En este ejemplo esa cantidad es 50.
  • Por que en la variable segmento se le resta 1 a la variable $page? para calcular el offset, el multiplicador tiene que ser siempre 0-based. es decir, si $page = 1, el ofset debe ser 0 para obtener un LIMIT 0, 50 (los primeros 50 registros despues del registro 0) y si $page = 2, obtener un LIMIT 50,50 (los primeros 50 registros despues del registro 50), y asi sucesivamente.
  • Por que a los links del paginador se le suma 1 a la variable $i? para mantenerlo humanamente entendible (los simples mortales cuentan a partir de 1). y para respetar nuestra regla el paginador anteriormente descrita.

Espero que lo encuentren fácil de hacer :), si alguien lo pide en los comentarios, pongo un .zip con un ejemplo completo.

Saludos!

EDIT: A peticion de Isabel, aqui esta la descarga de un ejemplo de paginador completo:

DESCARGAR PAGINADOR EN PHP

Categorized in:

Tagged in:

, ,