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
<?php 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.
<?php 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:
<table> <tr> <th>DNI</th> <th>Nombre</th> <th>Edad</th> </tr> <?php while ($fila = mysqli_fetch_assoc($resultado)) { echo "<tr>"; echo "<td>" . $fila['DNI'] . "</td>"; echo "<td>" . $fila['nombre'] . "</td>"; echo "<td>" . $fila['edad'] . "</td>"; echo "</tr>"; } ?> </table>
Ahora veremos como poner los botones de navegación:
<div> <?php // 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=<?php echo $_GET['pag'] - 1; ?>"><button>Anterior</button></a> <?php // Sino deshabilito el botón } else { ?> <a href="#"><button disabled>Anterior</button></a> <?php } ?> <?php } else { // Sino deshabilito el botón ?> <a href="#"><button disabled>Anterior</button></a> <?php } // 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=<?php echo $_GET['pag'] + 1; ?>"><button>Siguiente</button></a> <?php // Sino deshabilito el botón } else { ?> <a href="#"><button disabled>Siguiente</button></a> <?php } ?> <?php // Sino deshabilito el botón } else { ?> <a href="index.php?pag=2"><button>Siguiente</button></a> <?php } ?> </div>
Aquí os dejo el ejemplo completo:
— conexion.php
<?php 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
<!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> <?php 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> <?php while ($fila = mysqli_fetch_assoc($resultado)) { echo "<tr>"; echo "<td>" . $fila['DNI'] . "</td>"; echo "<td>" . $fila['nombre'] . "</td>"; echo "<td>" . $fila['edad'] . "</td>"; echo "</tr>"; } ?> </table> <div> <?php // 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=<?php echo $_GET['pag'] - 1; ?>"><button>Anterior</button></a> <?php // Sino deshabilito el botón } else { ?> <a href="#"><button disabled>Anterior</button></a> <?php } ?> <?php } else { // Sino deshabilito el botón ?> <a href="#"><button disabled>Anterior</button></a> <?php } // 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=<?php echo $_GET['pag'] + 1; ?>"><button>Siguiente</button></a> <?php // Sino deshabilito el botón } else { ?> <a href="#"><button disabled>Siguiente</button></a> <?php } ?> <?php // Sino deshabilito el botón } else { ?> <a href="index.php?pag=2"><button>Siguiente</button></a> <?php } ?> </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