Paginación con PHP y MySQL

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.

  1. id -> INT(5) -> A_I -> primaria
  2. nombre -> varchar(20) -> utf8_spanish_ci
  3. 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.

Paginación con PHP y MySQL

Paginación con PHP y MySQL

Demostración de la consulta SQL $consulta_resultados

Demostración de la consulta SQL $consulta_resultados

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!

FELICES FIESTAS y FELIZ 2016 🙂

28 comentarios

  1. Carlos · marzo 24, 2016

    Perfecto,muchas gracias

    Me gusta

  2. Agustin Acosta · abril 13, 2016

    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 gusta

    • Rocanrol · abril 15, 2016

      Te recomiendo buscar ese Warning en Google para saber como resolverlo.

      Me gusta

    • Groxor · junio 9, 2016

      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 gusta

  3. marianaghdz · May 8, 2016

    Gracias por el tutorial me servira para aplicarlo en mi proyecto; es un sistema de prestamos de libros.

    Me gusta

  4. jonnatan ruiz · May 25, 2016

    Gracias por tu ayuda Me sirvió mucho

    Me gusta

  5. Groxor · junio 9, 2016

    Gracias! Me funcionó de lujo :)!

    Me gusta

  6. Daniel Ramírez · junio 10, 2016

    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 gusta

  7. Nicolas · agosto 8, 2016

    Claro como el agua, mil gracias

    Me gusta

  8. Victor · septiembre 7, 2016

    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 gusta

    • Rocanrol · septiembre 7, 2016

      Me alegra que te haya servido 😀

      Me gusta

  9. Erick Plaga · noviembre 2, 2016

    Excelente hace dias estaba por hacer algo parecido y lo he encontrado

    Me gusta

  10. Desi · diciembre 4, 2016

    Sencillo, didáctico, elegante y funcional. No se puede pedir más. Muchas gracias por compartir.

    Me gusta

    • Rocanrol · diciembre 5, 2016

      Muchas gracias por tu comentario 🙂

      Me gusta

  11. Cesar Augusto (@VallenillaC) · febrero 2, 2017

    gracias por el ejemplo!!, facil y sencillo

    Me gusta

    • Rocanrol · febrero 2, 2017

      ¡Gracias por tu comentario! 🙂

      Me gusta

  12. RicardoCardona · abril 13, 2017

    Excelente tutorial, muchas gracias por el aporte! 🙂

    Me gusta

  13. Jesus Anaya · junio 20, 2017

    Brother te doy gracias, realmente hizo volar mi mente. aprendí mucho, y me esta sirviendo en un proyecto real… mil gracias…

    Me gusta

    • Rocanrol · junio 20, 2017

      Gracias por tu comentario 😀

      Me gusta

  14. Fabricio Galindo Copado · octubre 24, 2017

    Muchas Gracias Bro … mas claro ni el agua. Saludos !!

    Me gusta

  15. Jacky Lp · julio 31, 2019

    Muchas gracias, tu código me ha salvado mi practica. Increíble que aun funcione luego de tanto años, eres un maquina!

    Me gusta

    • Rocanrol · julio 31, 2019

      Muchas gracias! Me alegra que te haya servido 🙂

      Me gusta

  16. mario fernandez · diciembre 8, 2019

    me salvaste de un apuro gracias

    Me gusta

Deja un comentario