PHP

Ξ 62 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

62 Comentarios

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

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

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

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

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

  • la verdad me ayudo mucho gracias

  • 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

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

    Saludos.

  • 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

  • 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

1 2 3 4 7

Responder a marco Cancelar respuesta

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