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.
Como siempre, lo primero:
Con los implementos listos, manos a la obra:
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:
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.
1:13:29 pm
tengo un problema bastante gordo. resulta que el codigo que pusiste funciona a la perfeccion pero y si yo quiero crear un buscador tipo Softonic, es decir, que tiene paginacion pero que al cambiar de pagina osea de consulta(ejemplo de la 1 a la 2) no se me borre el codigo html que he puesto en el resultado de busqueda. es decir que se mantenga constante. he probado poniendo el resultado del buscador en un iframe pero nada de nada, no funciona, pork la pagina 2 de la paginacion es diferente a la 1 luego pierde toda la cabecera en html, los estilos css de los divs de los lados…alguna solucion? puede que me digan que use ajax para eso pero me gustaria saber si hay otra solucion.
7:16:20 pm
gracias excelente tutorial, como siempre.
12:22:38 am
gracias por el tutorial,muy practico y sencillo
2:21:14 am
Buenos días, quiero ante todo agredecerles por este excelente recurso, pues ayuda mucho con la realización de proyectos en la web.
Llegando al punto, quiesiera saber por qué’me resulta un error de sintáxis en la linea 12 donde ocurre un T_string inesperado.
la linea es donde> se da la siguiente variable //$comienzo = ($num_pag – 1) * $cant_reg; quiesiera saber cual seria la solución pues me urge porque me encuentro en el desarrollo de un proyecto y este es el único recurso que he hallado mas más correcto y práctico. agradezco enormemente su respuesta. chao.
7:32:02 pm
Coloca un ejemplo hecho!
7:33:52 pm
genial, pon un ejemplo jajaja
1:56:49 pm
Impresionante tutorial, lo he utilizado para aprender el funcionamiento básico y es super sencillo de implementar con nuevas opciones, un saludo y un abrazo grande
3:06:23 pm
Hola, me tira un error en la linea 20 donde esta el
else
{
$comienzo = ($num_pag – 1) * $cant_reg;
}
Que puede ser?
Gracias
1:11:27 am
Que error?
1:29:38 am
De ante mano muchas gracias muy bueno el tutorial.
Pero tengo una pregunta, cuando 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);
Donde dice URL de la BD, que pongo en ese campo no tengo la menor idea de cual es esa URL.
Gracias 😀