Antes de comenzar con este tutorial, el cual será el último de este año 2015, quisiera agradecer a todos los que han compartido y comentado los tutoriales aquí expuestos. Más de 16.000 visitas avalan la confianza que ustedes, los lectores, tienen en estos textos.
Sin más dilación: pasemos a crear una paginación simple basada en PHP y MySQL.
¿Cómo crear una paginación?
Personalmente seguiré desarrollando en local, utilizando XAMPP (Apache y MySQL con PHPMyAdmin) en Windows.
1 de 3: MySQL
A diferencia de otros tutoriales, esta vez empezaré por la base de datos, pues es de ahí de donde debemos obtener los datos necesarios para proceder. Como siempre, estoy trabajando sobre una base de datos llamada mmv con cotejamiento utf8_spanish_ci. Dentro tengo una tabla llamada mmv004 que tiene tres columnas. El motor de almacenamiento es InnoDB.
- id -> INT(5) -> A_I -> primaria
- nombre -> varchar(20) -> utf8_spanish_ci
- edad -> INT(2)
Para este ejemplo necesitaré tener algunos datos en la tabla. Generaré nombres al azar con uinames y las edades serán creadas por mí al azar (simplemente pulsando teclas numéricas). La consulta SQL será algo así:
INSERT INTO `mmv004` (nombre, edad) VALUES ('Pablo Ramos', '22'), ('Cecilia Moyano', '22'), ('Benjamín Gómez', '33'), ('Pamela Díaz', '28'), ('Franco Campos', '34'), ('Patricia López', '29'), ('Nicolás Peralta', '19'), ('Sofía Ramírez', '26'), ('Isabella Hernández', '34'), ('Laura Sánchez', '35')
2 de 3: HTML y PHP
Una vez tenemos los datos, vamos a recuperarlos y crear la paginación per se.
Para eso, lo primero que haré es crear un archivo llamado index.php (debe ser PHP). Este debe tener una estructura HTML básica. Preferiblemente HTML5.
Entonces le decimos al documento que vamos a escribir PHP y requerimos nuestro archivo de conexión a la BBDD. También aclaramos que no queremos que no muestre errores por variables vacías. Esto sería justo encima de la declaración doctype de HTML.
<?php //Conectamos a la base de datos require('../conexion.php'); //Evitamos que salgan errores por variables vacías error_reporting(E_ALL ^ E_NOTICE); ?> <!DOCTYPE HTML>
A continuación debemos definir la cantidad de resultados que queremos por página. En mi caso, serán 3 personas por página.
<?php
//Conectamos a la base de datos
require('../conexion.php');
//Evitamos que salgan errores por variables vacías
error_reporting(E_ALL ^ E_NOTICE);
//Cantidad de resultados por página (debe ser INT, no string/varchar)
$cantidad_resultados_por_pagina = 3;
?>
Después comprobamos los datos que entrarán desde el GET de HTTP.
<?php
//Conectamos a la base de datos
require('../conexion.php');
//Evitamos que salgan errores por variables vacías
error_reporting(E_ALL ^ E_NOTICE);
//Cantidad de resultados por página (debe ser INT, no string/varchar)
$cantidad_resultados_por_pagina = 3;
//Comprueba si está seteado el GET de HTTP
if (isset($_GET["pagina"])) {
//Si el GET de HTTP SÍ es una string / cadena, procede
if (is_string($_GET["pagina"])) {
//Si la string es numérica, define la variable 'pagina'
if (is_numeric($_GET["pagina"])) {
//Si la petición desde la paginación es la página uno
//en lugar de ir a 'index.php?pagina=1' se iría directamente a 'index.php'
if ($_GET["pagina"] == 1) {
header("Location: index.php");
die();
} else { //Si la petición desde la paginación no es para ir a la pagina 1, va a la que sea
$pagina = $_GET["pagina"];
};
} else { //Si la string no es numérica, redirige al index (por ejemplo: index.php?pagina=AAA)
header("Location: index.php");
die();
};
};
} else { //Si el GET de HTTP no está seteado, lleva a la primera página (puede ser cambiado al index.php o lo que sea)
$pagina = 1;
};
//Define el número 0 para empezar a paginar multiplicado por la cantidad de resultados por página
$empezar_desde = ($pagina-1) * $cantidad_resultados_por_pagina;
?>
Una vez tengamos esto definido, debemos seleccionar todos los datos desde la tabla y mostrarlos. Esto se realizará en el interior del body de HTML.
<body> <?php //Obtiene TODO de la tabla $obtener_todo_BD = "SELECT * FROM mmv004"; //Realiza la consulta $consulta_todo = mysqli_query($conexion, $obtener_todo_BD); //Cuenta el número total de registros $total_registros = mysqli_num_rows($consulta_todo); //Obtiene el total de páginas existentes $total_paginas = ceil($total_registros / $cantidad_resultados_por_pagina); //Realiza la consulta en el orden de ID ascendente (cambiar "id" por, por ejemplo, "nombre" o "edad", alfabéticamente, etc.) //Limitada por la cantidad de cantidad por página $consulta_resultados = mysqli_query($conexion, " SELECT * FROM `mmv004` ORDER BY `mmv004`.`id` ASC LIMIT $empezar_desde, $cantidad_resultados_por_pagina"); //Crea un bluce 'while' y define a la variable 'datos' ($datos) como clave del array //que mostrará los resultados por nombre while($datos = mysqli_fetch_array($consulta_resultados)) { ?> <span class="persona"> <p><strong><?php echo $datos['nombre']; ?></strong> <br> <?php echo $datos['edad']; ?></p> </span> <?php }; ?> </body>
Ahora vamos a mostrar la paginación. Y listo, ya está hecho.
<body>
<?php
//Obtiene TODO de la tabla
$obtener_todo_BD = "SELECT * FROM mmv004";
//Realiza la consulta
$consulta_todo = mysqli_query($conexion, $obtener_todo_BD);
//Cuenta el número total de registros
$total_registros = mysqli_num_rows($consulta_todo);
//Obtiene el total de páginas existentes
$total_paginas = ceil($total_registros / $cantidad_resultados_por_pagina);
//Realiza la consulta en el orden de ID ascendente (cambiar "id" por, por ejemplo, "nombre" o "edad", alfabéticamente, etc.)
//Limitada por la cantidad de cantidad por página
$consulta_resultados = mysqli_query($conexion, "
SELECT * FROM `mmv004`
ORDER BY `mmv004`.`id` ASC
LIMIT $empezar_desde, $cantidad_resultados_por_pagina");
//Crea un bluce 'while' y define a la variable 'datos' ($datos) como clave del array
//que mostrará los resultados por nombre
while($datos = mysqli_fetch_array($consulta_resultados)) {
?>
<span class="persona">
<p><strong><?php echo $datos['nombre']; ?></strong> <br>
<?php echo $datos['edad']; ?></p>
</span>
<?php
};
?>
<hr><!----------------------------------------------->
| <?php
//Crea un bucle donde $i es igual 1, y hasta que $i sea menor o igual a X, a sumar (1, 2, 3, etc.)
//Nota: X = $total_paginas
for ($i=1; $i<=$total_paginas; $i++) {
//En el bucle, muestra la paginación
echo "<a href='?pagina=".$i."'>".$i."</a> | ";
}; ?>
</body>
3 de 3: Ejemplos
Una vez hecho todo lo anterior, podemos observar los resultados finales. Yo no lo he aplicado ningún estilo, pero se puede hacer sin problemas.
Conclusión:
Esta paginación contiene un filtro para el GET de la petición HTTP para comprobar si la string que recibe es numérica, pero lo más importante es la consulta que declara la cantidad de resultados por página. Si te sirvió, por favor, compártelo.
Espero que el tutorial haya sido de utilidad. Nos leemos, ¡saludos!
Perfecto,muchas gracias
Me gustaMe gusta
Me alegra que te haya servido 😀
Me gustaMe gusta
Me da el siguiente error a la hora de tratar de regresar a la pagina 1 amigo:
Warning: Cannot modify header information – headers already sent
Es en esta parte:
//Si la petición desde la paginación es la página uno
//en lugar de ir a ‘index.php?pagina=1’ se iría directamente a ‘index.php’
if ($_GET[«pagina»] == 1) {
header(«Location: noticias.php»);
die();
}
Sabes que podra ser?
Me gustaMe gusta
Te recomiendo buscar ese Warning en Google para saber como resolverlo.
Me gustaMe gusta
Al parecer hay un problema con otra redirección de cabecera o algo que esta afectando el header de la web, lo que yo utilicé como alternativa, fue remplazar header(«Location: usuarios.php»); por echo ‘window.location.assign(«usuarios.php»);’;
Me gustaMe gusta
Gracias por el tutorial me servira para aplicarlo en mi proyecto; es un sistema de prestamos de libros.
Me gustaMe gusta
Hola 🙂
Me alegra que te haya sido útil. Muchos éxitos!
Me gustaMe gusta
Gracias por tu ayuda Me sirvió mucho
Me gustaMe gusta
Gracias por comentar 🙂
Me gustaMe gusta
Gracias! Me funcionó de lujo :)!
Me gustaMe gusta
Me alegra 🙂
Saludos!
Me gustaMe gusta
Muchas Gracias!, Me ha ayudado a implementar una pagina de noticias, tuve que cambiar algunas partes que me causaban conflicto pero, me ayudo bastante.
Me gustaMe gusta
Gracias a vos!
Saludos.
Me gustaMe gusta
Claro como el agua, mil gracias
Me gustaMe gusta
Te agradezco un montón !! estuve 2 días seguidos buscando una buena explicación de paginacion pero ninguna tan buena como ésta, me sirvio demasiado para mi proyecto Saludos !!! frecuentaré mas la pagina para mas contenido, super agradecido!
Me gustaMe gusta
Me alegra que te haya servido 😀
Me gustaMe gusta
Excelente hace dias estaba por hacer algo parecido y lo he encontrado
Me gustaMe gusta
Sencillo, didáctico, elegante y funcional. No se puede pedir más. Muchas gracias por compartir.
Me gustaMe gusta
Muchas gracias por tu comentario 🙂
Me gustaMe gusta
gracias por el ejemplo!!, facil y sencillo
Me gustaMe gusta
¡Gracias por tu comentario! 🙂
Me gustaMe gusta
Excelente tutorial, muchas gracias por el aporte! 🙂
Me gustaMe gusta
Brother te doy gracias, realmente hizo volar mi mente. aprendí mucho, y me esta sirviendo en un proyecto real… mil gracias…
Me gustaMe gusta
Gracias por tu comentario 😀
Me gustaMe gusta
Muchas Gracias Bro … mas claro ni el agua. Saludos !!
Me gustaMe gusta
Muchas gracias, tu código me ha salvado mi practica. Increíble que aun funcione luego de tanto años, eres un maquina!
Me gustaMe gusta
Muchas gracias! Me alegra que te haya servido 🙂
Me gustaMe gusta
me salvaste de un apuro gracias
Me gustaMe gusta