Paginación en PHP

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.

Compartir

4 comentarios

  1. Henry

    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!!!!

  2. Fernando

    Muchas gracias, voy a probar con tu ejemplo. Gracias.

  3. Fabian

    Hola! Gracias pero la parte de la paginación no esta funcionando correctamente puede ser?

  4. Tiago

    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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *