PHP

Ξ 61 comentarios

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

por Xabadu
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.

Sello de GarantÍa CLH

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.

Comparte este tutorial

El culpable de todo esto

Las tardes gloriosas de domingo y las grandes ovaciones a estadio lleno, no son algo extraño para Xabadu. Luego de ser descubierto a los 4 años en un partido de barrio por los ojeadores del gran Aviación F.C., sacudió el mercado nacional al ser traspasado en $500 pesos chilenos (1 USD) y 3 coca colas al renombrado Estrella Blanca de Lolol. Luego de una impresionante carrera por equipos como Lozapenco, Santa Cruz, Deportivo Lago Chungará y una incursión en la 3a división del futbol de Kazajstan, su record imbatible hasta la fecha de 1257 goles en 20 partidos lo llevo a ser elegido como uno de los arqueros más recordados en la historia pelotera nacional. Una lesión en el colmillo superior derecho lo llevó al retiro el año 2003, pero está de vuelta y sin duda que su jerarquía y experiencia internacional será un gran aporte.

En los barrios marginales se le conoce como: Xabadu

Comentarios en Facebook

61 Comentarios

  • 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)

  • 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é

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

    Saludos

  • 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

  • @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

  • excelentisimo !!!

  • La verdad exelente

  • 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

  • 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.

  • 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.

1 2 3 7

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Gente linda que nos quiere

Donde mas estamos