Hola a todos, hoy os voy a explicar como funciona la paginación en PHP.
Cuando tenemos una aplicación PHP, es normal que al mostrar datos, queramos mostrar los datos paginados.
La estrategia que usaremos seria con un parámetro GET llamado pag (lo puedes llamar como quieras), donde calcularemos los registros que mostraremos, el truco esta en usar LIMIT de MySQL.
Al final de este manual, os dejaré el ejemplo completo para descargar con la base de datos incluida.
Este sería nuestro conexion.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
define("HOST_DB", "localhost"); define("USER_DB", "root"); define("PASS_DB", ""); define("NAME_DB", "personas"); $conexion = new mysqli( constant("HOST_DB"), constant("USER_DB"), constant("PASS_DB"), constant("NAME_DB") ); ?> |
Vamos a ver como recoger el paramento pag y con ese parametro calcular los registros a mostrar.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
require "conexion.php"; $numElementos = 5; // Recogemos el parametro pag, en caso de que no exista, lo seteamos a 1 if (isset($_GET['pag'])) { $pagina = $_GET['pag']; } else { $pagina = 1; } // (($pagina - 1) * $numElementos) me indica desde donde debemos empezar a mostrar registros $sql = "SELECT * FROM personas LIMIT " . (($pagina - 1) * $numElementos) . "," . $numElementos; // Ejecutamos la consulta $resultado = mysqli_query($conexion, $sql); // Contamos el número total de registros $sql = "SELECT count(*) as num_personas FROM personas"; // Ejecutamos la consulta $resultadoMaximo = mysqli_query($conexion, $sql); // Recojo el numero de registros de forma rápida $maximoElementos = mysqli_fetch_assoc($resultadoMaximo)['num_personas']; ?> |
Ahora veremos como mostrar los datos:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<table> <tr> <th>DNI</th> <th>Nombre</th> <th>Edad</th> </tr> while ($fila = mysqli_fetch_assoc($resultado)) { echo " echo " " . $fila['DNI'] . " | "; echo " " . $fila['nombre'] . " | "; echo " " . $fila['edad'] . " | "; echo " } ?> </table> |
Ahora veremos como poner los botones de navegación:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<div> // Si existe el parametro pag if (isset($_GET['pag'])) { // Si pag es mayor que 1, ponemos un enlace al anterior if ($_GET['pag'] > 1) { ?> <a href="index.php?pag= echo $_GET['pag'] - 1; ?>"><button>Anterior</button></a> // Sino deshabilito el botón } else { ?> <a href="#"><button disabled>Anterior</button></a> } ?> } else { // Sino deshabilito el botón ?> <a href="#"><button disabled>Anterior</button></a> } // Si existe la paginacion if (isset($_GET['pag'])) { // Si el numero de registros actual es superior al maximo if ((($pagina) * $numElementos) < $maximoElementos) { ?> <a href="index.php?pag= echo $_GET['pag'] + 1; ?>"><button>Siguiente</button></a> // Sino deshabilito el botón } else { ?> <a href="#"><button disabled>Siguiente</button></a> } ?> // Sino deshabilito el botón } else { ?> <a href="index.php?pag=2"><button>Siguiente</button></a> } ?> </div> |
Aquí os dejo el ejemplo completo:
— conexion.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
define("HOST_DB", "localhost"); define("USER_DB", "root"); define("PASS_DB", ""); define("NAME_DB", "personas"); $conexion = new mysqli( constant("HOST_DB"), constant("USER_DB"), constant("PASS_DB"), constant("NAME_DB") ); ?> |
— index.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Ejemplo de paginacion</title> </head> <body> require "conexion.php"; $numElementos = 5; // Recogemos el parametro pag, en caso de que no exista, lo seteamos a 1 if (isset($_GET['pag'])) { $pagina = $_GET['pag']; } else { $pagina = 1; } // (($pagina - 1) * $numElementos) me indica desde donde debemos empezar a mostrar registros $sql = "SELECT * FROM personas LIMIT " . (($pagina - 1) * $numElementos) . "," . $numElementos; // Ejecutamos la consulta $resultado = mysqli_query($conexion, $sql); // Contamos el número total de registros $sql = "SELECT count(*) as num_personas FROM personas"; // Ejecutamos la consulta $resultadoMaximo = mysqli_query($conexion, $sql); // Recojo el numero de registros de forma rápida $maximoElementos = mysqli_fetch_assoc($resultadoMaximo)['num_personas']; ?> <table> <tr> <th>DNI</th> <th>Nombre</th> <th>Edad</th> </tr> while ($fila = mysqli_fetch_assoc($resultado)) { echo " echo " " . $fila['DNI'] . " | "; echo " " . $fila['nombre'] . " | "; echo " " . $fila['edad'] . " | "; echo " } ?> </table> <div> // Si existe el parametro pag if (isset($_GET['pag'])) { // Si pag es mayor que 1, ponemos un enlace al anterior if ($_GET['pag'] > 1) { ?> <a href="index.php?pag= echo $_GET['pag'] - 1; ?>"><button>Anterior</button></a> // Sino deshabilito el botón } else { ?> <a href="#"><button disabled>Anterior</button></a> } ?> } else { // Sino deshabilito el botón ?> <a href="#"><button disabled>Anterior</button></a> } // Si existe la paginacion if (isset($_GET['pag'])) { // Si el numero de registros actual es superior al maximo if ((($pagina) * $numElementos) < $maximoElementos) { ?> <a href="index.php?pag= echo $_GET['pag'] + 1; ?>"><button>Siguiente</button></a> // Sino deshabilito el botón } else { ?> <a href="#"><button disabled>Siguiente</button></a> } ?> // Sino deshabilito el botón } else { ?> <a href="index.php?pag=2"><button>Siguiente</button></a> } ?> </div> </body> </html> |
Este es el resultado:

Aquí puedes descargar el ejemplo completo.
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
Quiero saber si mysqli_query no tiene problemas de seguridad, soy novato pero he leido algo asi
Otra cosa amigo, esta genial el ejemplo, no seria mucha molestia que puedas hacerlo como wordpress, que tenga numeros ?
Gracias!!!!
Muchas gracias, voy a probar con tu ejemplo. Gracias.
Hola! Gracias pero la parte de la paginación no esta funcionando correctamente puede ser?
Genial funciona!!.
Consulta único que me falta donde puedo colocar un ORDER BY id_personas DESC porque me salen los id más antiguos necesito que salgan primero los últimos ingresados a la base.
Saludos!
Tiago