Cómo hacer una paginación de resultados en PHP

Cómo hacer una paginación de resultados en PHP

Cuando trabajamos con páginas dinámicas, en lenguajes como PHP, ASP, JSP u otros, comúnmente rescatamos información desde una base de datos para desplegarla al usuario, de acuerdo a características particulares.

El proceso de leer y mostrar la información es bastante sencillo y trivial, dando para unas cuantas líneas de código. Sin embargo, ¿qué es lo que pasa cuando los datos que rescatamos son bastante extensos?, ¿basta con llegar y mostrarlos, sin importar el largo de estos resultados?.

Para esto, hoy en Como Lo Hago, les enseñaremos a incluir una sencilla paginación de resultados en sus sitios Web, con lo que podrán definir cuantos resultados mostrar y partir estos en el número de páginas que estimen convenientes, entre otras características.

Como siempre, todo el detalle, después del salto.

Cómo hacer una paginación de resultados en PHP

Como siempre, lo primero:

Implementos necesarios:

  1. Un editor Web, o entorno de programación en PHP. Como es habitual recomendamos Adobe Dreamweaver (pueden descargar una versión de evaluación desde este enlace).
  2. Un servidor local o bien alojamiento Web que soporte PHP y tenga un motor de bases de datos MySQL.

Con los implementos listos, manos a la obra:

Procedimiento:

Antes de comenzar con el proceso, propiamente tal, veamos a fondo lo que haremos:

¿Qué es una paginación?

Cuando hacemos una lectura sobre una tabla de una base de datos (mediante una consulta de tipo SELECT), lo que hacemos es seleccionar una serie de filas (0 o más), que cumplen algunos parámetros que indicamos. El resultado de esa selección es lo que luego, mediante programación en PHP le mostramos al usuario final.

En algunos casos, la consulta que realizemos sobre la base de datos, nos devolverá una gran cantidad de resultados. Por ejemplo, si quisieramos listar los alumnos de un curso o los clientes de una empresa, estaremos viendo un total de coincidencias que podría elevarse a varias decenas, centenas o incluso miles. Desplegar esa cantidad de resultados para el usuario en una sola página sería bastante engorroso, desde que el usuario tenga que hacer scrolldown por mucho rato para encontrar un registro en particular hasta producir descuadres en el diseño de nuestro sitio.

Para esto es que se realiza una paginación de resultados, donde básicamente luego de hacer la consulta, los resultados se dividen en un número definido por nosotros (por ej. listas de a 10 resultados) y se muestran en distintas páginas (por ej. resultados del 0 al 10, del 11 al 20, del 21 al 30, etc.).

Esta paginación se realiza dinámicamente dentro de la misma página de resultados, no es necesario tener un gran número de páginas si es un gran número de resultados. Ya lo veremos en detalle en el código.

Con la explicación de la paginación clara, podemos empezar a hacer nuestra paginación.

1.- Claramente, antes de empezar a insertar cualquier tipo de código, es necesario contar con una tabla de bases de datos poblada (es decir, que tenga datos) sobre la cual realizaremos nuestra consulta. Si no saben como hacer esto, les invitamos a revisar nuestros tutoriales de PHP. Para este tutorial, consideraremos una tabla llamada usuario, la cual tiene los siguientes campos:

  • username: Varchar (8).
  • password: Varchar (8).
  • nombre: Varchar(30).
  • correo: Varchar(20).

2.- A continuación, en la página donde queramos revelar los resultados paginados, para este caso utilizaremos la página lista-usuarios.php, debemos insertar este código, la explicación como siempre, en negrita, cursiva y entre /* y */:

/* Primero definimos 2 variables: $cant_reg que contiene el número de registros que se mostrarán por página, para este caso lo dejaremos en 10 pero pueden acomodarlo según gusten. Y además definimos la variable $num_pag, la cual tomará vía parámetro enviado por URL (por ende GET), el número de página actual de los resultados */

$cant_reg = 10;
$num_pag = $_GET["pagina"];

/* Luego, hacemos un if y preguntamos si hay algún valor en la variable $num_pag. Si no lo hay, significa que es la primera vez que se accede a la página de resultados, y por ende se dan los valores 1 a $num_pag (o sea primera página) y 0 a la variable $comienzo, que es la que define desde donde se empieza a buscar los resultados. */

if (!$num_pag)
{
$comienzo = 0;
$num_pag = 1;
}

/* Luego, se define un else, que se activará en caso de que la variable $num_pag haya recibido un valor, o sea, no es la primera vez que se accede a los resultados. Si este es el caso a la variable comienzo se le asignará un valor equivalente al número de página menos 1, todo multiplicado por la cantidad de registros, en este caso 10. Entonces si la página a la que llegamos es la 2 de los resultados, $comienzo valdría 2-1 * 10, o sea 10 y desde ahí empezaría a rescatar resultados en la consulta */

else
{
$comienzo = ($num_pag - 1) * $cant_reg;
}

/* A continuación, hacemos la conexión a la BD y seleccionamos la BD correspondiente */

$conexion=mysql_connect(”url de la bd”, “user”, “pass”);
mysql_select_db(”nombre de la bd”, $conexion);

/* Ahora, en una variable $resultado, almacenamos la respuesta de una consulta donde estamos contabilizando cuantos usuarios hay en la tabla, para esto usamos la sentencia COUNT en la consulta y le decimos que la ejecute sobre la tabla usuario */

$resultado = mysql_query(”SELECT COUNT(*) FROM usuario”);

/* En la variable $total_registros almacenamos el resultado de la consulta anterior, o sea, cuantos usuarios hay en la BD */

$total_registros = mysql_num_rows($resultado);

/* Luego de almacenar, reutilizamos la variable $resultado, y ahora hacemos una consulta nueva en la BD, esta vez seleccionando los usuarios que existan en la tabla, ordenándolos de manera ascendente según el username con la sentencia ORDER BY y limitando la consulta a que rescate los registros que están entre el valor indicado por $comienzo (rescata desde el valor siguiente), y que desde ahí rescate tantos registros como indicados por la variable $cant_reg, o sea, 10.

Recordemos que la variable $comienzo la vamos moviendo según el número de página donde nos encontremos, por lo tanto la primera vez rescataremos los registros del 1 al 10, luego del 11 al 20, del 21 al 30 y así sucesivamente. */

$resultado = mysql_query(”SELECT username, nombre, correo FROM usuario ORDER BY username LIMIT $comienzo, $cant_reg”);

/* Luego en la variable $total_paginas almacenamos el número total de páginas que se generarán a partir de esta paginación. Este número lo obtenemos a partir de la división entre el número total de registros (almacenado en la variable $total_registros) y la cantidad de registros por página (almacenado en la variable $cant_reg, equivalente a 10). Esta división la redondeamos utilizando ceil. PHP, como muchos lenguajes de programación, tienen funciones para redondear las divisiones que pudieran darnos resultados en números “decimales” o float, computacionalmente hablando. Estas funciones son floor y ceil. Floor redondea hacia abajo (Si el resultado fuese 2,4 redondea a 2) y Ceil hacia arriba (Si el resultado fuese 2,4 redondea a 3). */

$total_paginas = ceil($total_registros / $cant_reg);

/* Ya hemos rescatado los resultados que desplegaremos en la página, así que ahora mediante código HTML creamos una tabla. Este paso es opcional, pueden desplegar los datos de la forma que estimen conveniente. Así que solo tómenlo como referencia. Primero creamos la parte fija de la tabla, que es donde van los títulos de cada campo que mostraremos. */

echo “<table width=’829′ border=’1′ align=’center’ bgcolor=’#006600′>
<tr>
<td bgcolor=’#000000′ width=’129′><div align=’center’>Nombre de Usuario</div></td>
<td bgcolor=’#000000′ width=’124′><div align=’center’>Contraseña</div></td>
<td bgcolor=’#000000′ width=’130′><div align=’center’>Correo</div></td>
<td bgcolor=’#000000′ width=’202′><div align=’center’>Nombre Completo</div></td>
</tr>”;

/* Ahora, hacemos un ciclo de tipo while, y como condición de duración ponemos que es mientras en la variable $row se vaya almacenando una fila de los resultados */
while($row=mysql_fetch_array($resultado))
{

/* Ahora en las variables $username, $password, $nombre y $correo almacenamos los datos que vamos extrayendo de la BD */

$username=$row["username"];
$password=$row["password"];
$nombre=$row["nombre"];
$correo=$row["correo"];

/* Luego, con código HTML y PHP vamos desplegando celdas y mostrando los resultados de esas variables */

echo “<tr>”;
echo “<td width=’129′><div align=’center’>$username</div></td>”;
echo “<td width=’124′><div align=’center’>$password</div></td>”;
echo “<td width=’130′><div align=’center’>$correo</div></td>”;
echo “<td width=’202′><div align=’center’>$nombre</div></td>”;
echo “</tr>”;
}

/* Cerramos la tabla y centramos el parrafo */

echo “</table><center><br>”;

/* El siguiente código es para mostrar, después de desplegar los resultados actuales, vínculos para páginas anteriores, siguientes y mostrar la página actual. Primero, se pregunta si la página actual menos 1 es mayor a cero, esto significa que no es la primera vez que listamos y por ende se despliega el vínculo para volver a páginas anteriores, enviando como parámetro el número de página menos 1 para que se inicialicen las variables más arriba. */

if(($num_pag - 1) > 0)
{
echo “<a href=’lista-usuarios.php?pagina=”.($num_pag-1).”‘>< Anterior</a> “;
}

/* Luego, mediante un ciclo de tipo for que dura mientras la variable i sea menor al número total de páginas, se van listando, con números, todas las páginas disponibles con sus respectivos vínculos. También se desplega la página actual, sin vincular. */

for ($i=1; $i<=$total_paginas; $i++)
{
if ($num_pag == $i)
{
echo “<b><p class=’style1′>Página “.$num_pag.”</b> “;
}
else
{
echo “<a href=’lista-usuarios.php?pagina=$i’>$i</a> “;
}
}

/* Y finalmente, se pregunta mediante un if si el número de la página actual  más 1 es menor o igual al total de páginas. Si es así se presenta un vínculo para la página siguiente, enviando el parámetro correspondiente que se recoje mediante GET */

if(($num_pag + 1)<=$total_paginas)
{
echo ” <a href=’lista-usuarios.php?pagina=”.($num_pag+1).”‘>Siguiente ></a>”;
}
echo “</center>”;

Y así de simple tenemos nuestra paginación de resultados en PHP. Antes de terminar, algunas notas:

1.- El código es para una tabla simple de 4 campos. De cualquier forma, solo editando las líneas necesarias pueden adaptarlo a cualquier tipo de tabla.

2.- La forma de desplegar los resultados es según guste cada uno. Por un tema de orden y comodidad aquí optamos por una tabla en HTML, pero al ser resultados dinámicos pueden insertarlos de la forma que deseen.

3.- Este código es tremendamente adaptable, por lo que se puede utilizar como resultado a la petición de un formulario, o dispararlo mediante la activación de una acción en particular, así que los animamos a probar en las distintas situaciones que necesiten.

Como siempre, este tutorial ha sido desarrollado, probado y documentado por el equipo de Como Lo Hago, por lo que cuenta con nuestro Sello de Garantía. Cualquier duda, consulta o comentario, pueden realizarlos en el área habilitada a continuación.

Esperamos que este tutorial haya sido de utilidad para Uds.

Muchas gracias por leer y será hasta una próxima oportunidad.

Staff CLH

Tutoriales relacionados:

MalenaMaomaRegulequeWendyFantabuloso (1 votos, promedio: 5,00 de 5)
Loading ... Loading ...


20 Comentarios a “ Cómo hacer una paginación de resultados en PHP ”

  1. JOj! dice:                                                                                                                        #1

     Califica este comentario: Vota 0  Subtract rating 0  

    Ta weno el tutorial, pero podrían poner el codigo final listo para bajar.

    too caso lo voy a usar para mis scripts futuros (y)

  2. Antonio José dice:                                                                                                                        #2

     Califica este comentario: Vota 0  Subtract rating 0  

    Excelente su forma de explicar, detallada y precisa.
    Si así hicieramos todos, la velocidad de aprendizaje
    de los navegantes sería más alta.

    Mil gracias

    Antonio José

  3. Juan Xabadu dice:                                                                                                                        #3

     Califica este comentario: Vota 0  Subtract rating 0  

    @Antonio José: Muchas gracias por tus comentarios. Nos alegramos que te haya gustado y servido.

    Saludos

  4. gsuskrist dice:                                                                                                                        #4

     Califica este comentario: Vota 0  Subtract rating 0  

    excelente el tutorial, me has librado de mucho trabajo.
    sinembargo tengo un problema con la paginacion…
    resulta ke no me funciona cuando untento paginar los resultados de una busqueda que depende de muchos parametros, los cuales son enviados pormedio de varios select option de una pagina html; luego mi paginador recive esos parametros y de acuerdo con estos usa un query distinto (son 12 querys distintos en total).
    el paginador me muestra los primeros registros, pero cuando se da click al enlace ke deberia mostrar los siguientes registros, simplemente muestra una tabla vacia.
    es decir se pierden los datos traidos de la consulta.
    cualkier ayuda es bienvenida

  5. Juan Xabadu dice:                                                                                                                        #5

     Califica este comentario: Vota 0  Subtract rating 0  

    @gsuskrist: Te recomiendo revisar en tus consultas SQL si las estas limitando sobre el numero de registros que captura. Es probable que en la primera extracción este sacando todos los registros y solo desplegando los permitidos en la paginación.

    Por favor avísanos si no es ese el problema para que lo sigamos viendo.

    Saludos

  6. pipex dice:                                                                                                                        #6

     Califica este comentario: Vota 0  Subtract rating 0  

    excelentisimo !!!

  7. Ariel dice:                                                                                                                        #7

     Califica este comentario: Vota 0  Subtract rating 0  

    La verdad exelente

  8. Fredy dice:                                                                                                                        #8

     Califica este comentario: Vota 0  Subtract rating 0  

    Muy buen aporte, pero hay un detalle en lugar de emplear mysql_num_rows deben emplear mysql_fetch_array y la linea del total de paginas quedaria de la sgt manera:
    $total_paginas = ceil($total_registros[0] / $cant_reg); ahora si lo copian y lo pegan en un editor web como dreamweaver tienen q cambiar las comilla dobles ” y comillas simples ‘. Pero el ejemplo es muy bueno

    Gracias

  9. Juan Luis dice:                                                                                                                        #9

     Califica este comentario: Vota 0  Subtract rating 0  

    Hola: Gracias por el tutorial, pero solo me salen los 10 primeros registros y el número de página en la que estoy. No de deja opción a acceder a los siguientes registros.
    Gracias.

  10. Juan Luis dice:                                                                                                                        #10

     Califica este comentario: Vota 0  Subtract rating 0  

    Hola: Antes que nada agradecerles el tutorial.

    He seguido paso a paso el tutorial de paginación de resultados y sólo me salen los 10 primeros registros y la página donde estoy.

    No me salen los página siguiente ni nada más.

    Saludos.

  11. abda dice:                                                                                                                        #11

     Califica este comentario: Vota 0  Subtract rating 0  

    esta muy bien comentado los codigos me da gsuto q sea asi x q vi un codigo pero no lo entendi muy bien. Ahora lo podre hacer a mi manera pero con la logica de esta buenisima.

  12. Andres dice:                                                                                                                        #12

     Califica este comentario: Vota 0  Subtract rating 0  

    ¿Pero que pasa si por la cantidad de resultados se generan 100 páginas? El paginador se enancharía haciendo aparecer la barra de desplazamiento horizontal y eso no se ve bien esteticamente en una web. Hay forma de hacer que el paginador recopile sólo 10 pagina, Ej. 11 12 13 14 15 16 17 18 19 20, al pinchar el 20 desaparece el 11 y aparece a la derecha el 21. Aquí hay un ejemplo de lo que digo… http://www.prensafutbol.cl/index.php?option=com_content&view=section&layout=blog&id=21&Itemid=99&limitstart=60

    Gracias por los comentarios.

  13. Juan Xabadu dice:                                                                                                                        #13

     Califica este comentario: Vota 0  Subtract rating 0  

    @Andres: Gracias por tu aporte.

    Efectivamente tocas un buen punto. Nuestra intención con este tutorial era introducir el concepto de paginación de resultados, pero en base a la sugerencia que nos has entregado prepararemos una versión más avanzada que cubra ese y otros aspectos que hemos ido recopilando.

    Saludos.

  14. Metaltoon dice:                                                                                                                        #14

     Califica este comentario: Vota 0  Subtract rating 0  

    Hola amigos… excelente tutorial, lo he implementado satisfactoriamente en un proyecto :) Solamente tuve un problema con la consulta “SELECT COUNT(*) FROM tabla”, no me mostraba más que la primer página. Luego de revisar de punta a punta el código,  le quité el COUNT() y me funcionó. Dejando la consulta de esta manera”SELECT * FROM tabla”. ¿Porqué será que no me funcionaba de esta manera?

  15. Xabadu dice:                                                                                                                        #15

     Califica este comentario: Vota 0  Subtract rating 0  

    @Metaltoon: Ojo que ‘Select count(*)’ lo que hace es contabilizar cuantas filas hay en la tabla y su resultado es siempre un entero (Ej: 12).  Por eso después se hace una nueva consulta en donde seleccionamos todas las filas que cumplan el criterio.

    Estas 2 consultas en el tutorial las almacenamos (su resultado) en una misma variable $resultado. Quizás cuando hiciste la segunda consulta no se ejecutó bien y en $resultado quedó almacenada la cuenta. Te recomiendo revisar eso.

    Saludos!

  16. jany dice:                                                                                                                        #16

     Califica este comentario: Vota 0  Subtract rating 0  

    la verdad me ayudo mucho gracias

  17. erik kire dice:                                                                                                                        #17

     Califica este comentario: Vota 0  Subtract rating 0  

    tengo un breve problema con el sitio que estoy creando. lo que pasa es que me estan pidiendo que los resultados de los numeros de visitas que se hagan a mi sitio los muestre en graficas de barras hojala y que ustedes me puedan hechar la mano

  18. Xabadu dice:                                                                                                                        #18

     Califica este comentario: Vota 0  Subtract rating 0  

    @erik kire: En nuestra categoría PHP hemos publicado un tutorial para realizar gráficos, te recomiendo revisarlo.

    Saludos.

  19. Andrea MD dice:                                                                                                                        #19

     Califica este comentario: Vota 0  Subtract rating 0  

    Que articulo tan bueno, todo explicado paso a a paso, Asi si que se entiende solo faltaria un link para descargar el codigo y seria perfecto

  20. Victor padilla dice:                                                                                                                        #20

     Califica este comentario: Vota 0  Subtract rating 0  

    que tal
     
    ps ami me sale un error a la hora de pasar a la pagina siguiente
    ese es el error que me sale y no se porque

    Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /home/content/c/r/e/creativostar/html/elearning2009/main/sistema/paginador.php on line 37
     
    en esa linea tengo lo siguiente
    dentro de un if

    $ver = mysqli_fetch_array($reporte)
    y mi variable $reporte esta lo siguiente
     

    $reporte = $conn->query(”select *
    from reporte_asesor
    where usuario = ‘$name’ or
    profesor LIKE ‘%$name%’
    limit $RegistrosAEmpezar, $RegistrosAMostrar”);

     
    ¿cual sera el error?
    gracias por adelantado

Comenta