Paginar los resultados de una consulta en PHP

Realizar una consulta a una base de datos MySQL desde PHP y presentarla es sencillo. El problema viene cuando debemos presentar 3000 registros y nos gustaría que el usuario no esperara hasta Nochebuena. En ese caso, se presenta un número menor de registros en la página (diez, viente) y se añaden enlaces para poder acceder a los demás. A esto se le llama paginación.

Mostrar los registros adecuados

Para poder paginar debemos recibir en la página, además de los parámetros que reciba normalmente, uno que indique la página de resultados que deseamos obtener. Por defecto será 1 y lo llamaremos pag. Supongamos que tenemos una página que devuelve el nombre de todos los clientes de una empresa. La llamaremos, en un alarde de originalidad, clientes.php. Sería algo así:

<html> 
<body> 
<?php 
$link = mysql_connect("localhost", "nobody"); 
mysql_select_db("mydb", $link); 
$result = mysql_query("SELECT nombre, apellidos FROM clientes", $link); 
if (mysql_num_rows($result)){ 
  echo "<table border = '1'> 
"; 
  echo "<tr><td>Nombre</td><td>Apellidos</td></tr> 
"; 
  while ($row = @mysql_fetch_array($result)) { 
    echo "<tr><td>".$row["nombre"].
      "</td><td>".$row["email"]."</td></tr> 
"; 
  }
  echo "</table> 
"; 
}
else
  echo "¡ No se ha encontrado ningún registro !";
?> 
</body> 
</html>

Para poder soportar paginación debemos, primero, decidir cuantos registros presentamos por página (por ejemplo, 10) y recibir el número de página que debemos presentar. Hay dos maneras de obtener el número de registros totales y los registros que necesitamos para presentar la página. Nosotros utilizaremos dos consultas. En la primera obtendremos el total de registros de la tabla y, en la segunda, cogeremos sólo los registros que necesitamos haciendo uso de LIMIT. Sustituiremos el código de la consulta por lo siguiente:

if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$result = mysql_query("SELECT COUNT(*) FROM clientes", $link); 
list($total) = mysql_fetch_row($result);
$tampag = 10;
$reg1 = ($pag-1) * $tampag;
$result = mysql_query("SELECT nombre, apellidos FROM clientes
  LIMIT $reg1, $tampag", $link); 

Añadir los enlaces a otras páginas

La primera labor que vamos a hacer es crear una función abstracta que reciba el número de registros que en total devuelve la consulta, el tamaño de página, el número de la página actual, y el texto del enlace hasta insertar el número de página. Este último parámetro puede resultar un poco confuso. Pongamos un ejemplo. Si en nuestra página recibimos ese número por el parámetro pag, si quisieramos ver la página 2 escribiríamos:

clientes.php?pag=2

Por lo tanto, como debemos quitar el número de página, nos quedará:

clientes.php?pag=

La función deberá obtener primero el número total de páginas. Luego averiguará si existe una página anterior, escribiendo en enlace que va a esa página previa. Lo siguiente es escribir los enlaces a todas las páginas anteriores a la actual desde la 1. Luego escribe el número de la página actual, resaltado, pero sin enlace. Después escribe los números de las páginas posteriores y, finalmente, el enlace a la página posterior:

/******************************************************/
/* Funcion paginar
 * actual:          Pagina actual
 * total:           Total de registros
 * por_pagina:      Registros por pagina
 * enlace:          Texto del enlace
 * Devuelve un texto que representa la paginacion
 */
function paginar($actual, $total, $por_pagina, $enlace) {
  $total_paginas = ceil($total/$por_pagina);
  $anterior = $actual - 1;
  $posterior = $actual + 1;
  if ($actual>1)
    $texto = "<a href="$enlace$anterior">&laquo;</a> ";
  else
    $texto = "<b>&laquo;</b> ";
  for ($i=1; $i<$actual; $i++)
    $texto .= "<a href="$enlace$i">$i</a> ";
  $texto .= "<b>$actual</b> ";
  for ($i=$actual+1; $i<=$total_paginas; $i++)
    $texto .= "<a href="$enlace$i">$i</a> ";
  if ($actual<$total_paginas)
    $texto .= "<a href="$enlace$posterior">&raquo;</a>";
  else
    $texto .= "<b>&raquo;</b>";
  return $texto;
}

Además de incluir la función en nuestro script la tendremos que llamar después de cerrar la tabla:

echo paginar($pag, $total, $tampag, "clientes.php?pag=");

Y con esto ya tenemos un sistema de paginación que podremos utilizar en nuestras páginas.

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.