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

19 comments

  1. Carlos · marzo 24

    Perfecto,muchas gracias

    Me gusta

  2. Agustin Acosta · abril 13

    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

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

      Me gusta

    • Groxor · junio 9

      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 · mayo 8

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

    Me gusta

  4. jonnatan ruiz · mayo 25

    Gracias por tu ayuda Me sirvió mucho

    Me gusta

  5. Groxor · junio 9

    Gracias! Me funcionó de lujo :)!

    Me gusta

  6. Daniel Ramírez · junio 10

    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

    Claro como el agua, mil gracias

    Me gusta

  8. Victor · septiembre 7

    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

      Me alegra que te haya servido😀

      Me gusta

  9. Erick Plaga · noviembre 2

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

    Me gusta

  10. Desi · 4 Days Ago

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

    Me gusta

    • Rocanrol · 4 Days Ago

      Muchas gracias por tu comentario🙂

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s