Cargando



Cómo paginar datos usando PHP

En este tutorial verás cómo crear una paginación a tus datos con PHP


jul 06 2016 13:46
Avanzado
jul 07 2016 10:21

Si estás interesado en hacer que la base de datos te devuelva el contenido dividido en páginas, este es tu tutorial. Hoy vamos a ver cómo hacer paginación en PHP. La paginación es el proceso de tomar un conjunto de resultados y la expansión de estos a lo largo de las páginas para que los resultados sean más fáciles de leer y tengamos una presentación adecuada de ellos.

 

Para este ejemplo he creado una tabla llamada localizar en la base de datos que contiene 4 columnas:

  • id
  • Pais
  • Capital
  • Continente

 

A continuación pongo la imagen de la tabla:

 

paginacion-PHP-1.jpg

 

El contenido de ésta será el siguiente:

 

paginacion-PHP-2.jpg

 

Vamos a crear una web que tenga una tabla que muestre los resultados de 5 en 5. Nos ayudaremos de Bootstrap para dar unos pequeños estilos, y poner un par de barras para navegar por las páginas de resultados, también se puede hacer a mano, pero esto no es lo importante del código.

 

El código es bastante corto y sencillo, será una clase PHP y una página HTML, vamos a empezar.

 

Código PHP

Primeramente ponemos el código, para después explicar brevemente.
<?php
    class Paginar {
    
        private $conexion;
        private $limite = 5;
        private $pagina;
        private $consulta;
        private $total;

        public function __construct($conex, $cons) {     
            $this->conexion = $conex;
            $this->consulta = $cons;
            $respuesta = $this->conexion->query($this->consulta);
            $this->total = $respuesta->num_rows;   
        }

        public function getDatos($p) {     
            $this->pagina = $p;
            $inicio = ( $this->pagina - 1 ) * $this->limite ;
                
            if($inicio < 0){
                $inicio = 0;
                $this->pagina = 1;
            }

            if($inicio > ($this->total-$this->limite)){
                $inicio = $this->total-$this->limite;
                $this->pagina = $this->pagina-1;
            }

            $consultar = $this->consulta.' limit '.$inicio.','.$this->limite;
            $respuesta = $this->conexion->query($consultar);   

            while($row = $respuesta->fetch_assoc()) 
                $resultados[]  = $row;
                
            $result = new stdclass();
            $result->pagina = $this->pagina;
            $result->limite = $this->limite;
            $result->total = $this->total;
            $result->datos = $resultados;

            return $result;
        }

        public function crearLinks( $enlaces ) {
            $ultimo  = ceil( $this->total / $this->limite);
            $comienzo = (($this->pagina - $enlaces) > 0) ? $this->pagina-$enlaces : 1;
            $fin  = (($this->pagina + $enlaces ) < $ultimo) ? $this->pagina+$enlaces : $ultimo;
            $clase = ($this->pagina == 1) ? "disabled" : "";
            $html = '<li class="'.$clase.'"><a href="?limit='.$this->limite.'&page='.($this->pagina-1).'">&laquo;</a></li>';
                
            if($comienzo > 1) {
                $html  .= '<li><a href="?limit='.$this->limite.'&page=1">1</a></li>';
                $html  .= '<li class="disabled"><span>...</span></li>';
            }
                
            for($i = $comienzo ; $i <= $fin; $i++) {
                $clase  = ( $this->pagina == $i ) ? "active" : "";
                $html  .= '<li class="'.$clase.'"><a href="?limit='.$this->limite.'&page='.$i.'">'.$i.'</a></li>';
            }
                
            if($fin < $ultimo) {
                $html  .= '<li class="disabled"><span>...</span></li>';
                $html  .= '<li><a href="?limit='.$this->limite.'&page='.$ultimo.'">'.$ultimo.'</a></li>';
            }
                
            $clase  = ( $this->pagina == $ultimo ) ? "disabled" : "enabled";
            $html  .= '<li class="'.$clase.'"><a href="?limit='.$this->limite.'&page='.($this->pagina+1).'">&raquo;</a></li>';
            return $html;
        }
    }
?>
En este código tenemos un constructor y 2 funciones. En el constructor se realiza la primera consulta y obtenemos el número de filas de datos que hay en la BD.

 

Nota
En una aplicación real necesitarías hacer las comprobaciones pertinentes. Aquí se han omitido para no complicar el código.

 

La función getDatos es la encargada de hacer las consultas a la BD, cómo puedes ver lo hará con un límite y desde una posición inicial, una sentencia de ejemplo:

SELECT * FROM localizar LIMIT 10, 5
Lo que nos va a devolver son 5 filas de la tabla a partir de la 10, es decir nos devolverá la fila 11, 12, 13, 14 y 15 (si no hay 5 elementos devolverá hasta donde pueda).

 

Por último la función crearLinks se encargará de crear los números de paginación que puedes ver en la siguiente imagen por encima y debajo de la tabla (existen 2 tipos, simplemente para que puedas elegir, son estilos de Bootstrap):

 

paginacion-PHP-3.jpg

 

Los números corresponderán con el total de páginas, al inicio y al final de esta lista usamos (<<, >>), que son las flechas que permiten ir adelante y atrás.

 

Código HTML

Vamos a ver lo fácil que es el código HTML.
<?php
    require_once 'Paginar.php';
 
    $conexion = new mysqli( '127.0.0.1', 'root', '', 'Solvetic');
    $conexion->query("SET NAMES 'utf8'");
 
    $pagina       = ( isset( $_GET['page'] ) ) ? $_GET['page'] : 1;
    $enlaces      = ( isset( $_GET['enlaces'] ) ) ? $_GET['enlaces'] : 5;
    $consulta      = "SELECT * FROM localizar";
    
    $paginar  = new Paginar($conexion, $consulta);
    $resultados    = $paginar->getDatos($pagina);
?>
    <head>
        <title>Paginación en PHP</title>

        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" 
        integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" 
        crossorigin="anonymous">

        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <div class="container">
                <div class="col-md-12 ">
                    <h1 style="text-align:center">Test Páginacion en PHP</h1>
                    <ul class="pager">
                        <?php echo $paginar->crearLinks( $enlaces); ?>
                    </ul>
                    <table class="table table-hover table-condensed table-bordered ">
                            <thead>
                                <tr style="background:#337ab7; color:white;">
                                    <th width="30%">País</th>
                                    <th width="30%">Capital</th>
                                    <th width="30%">Continente</th>
                                </tr>
                            </thead>
                            <tbody>
                                <?php for( $i = 0; $i < count($resultados->datos); $i++ ): ?>
                               <tr>
                                            <td><?php echo $resultados->datos[$i]['Pais']; ?></td>
                                            <td><?php echo $resultados->datos[$i]['Capital']; ?></td>
                                            <td><?php echo $resultados->datos[$i]['Continente']; ?></td>
                                    </tr>
                                <?php endfor; ?>
                            </tbody>
                    </table>
                    <ul class="pagination">
                        <?php echo $paginar->crearLinks( $enlaces); ?>
                    </ul>
              
                </div>
        </div>
        </body>
</html>
Se crea una tabla para almacenar los datos de la BD, y arriba y abajo ponemos las barras de navegación de números comentadas antes (la única diferencia que tienen es la clase de bootstrap aplicada). La primera parte del código es PHP, ahí se establece la conexión a la BD, usando la librería MySQLi. Se crea el objeto Paginar (recuerda la clase de PHP vista antes), y se realiza la primera consulta, que por defecto se pedirá la página 1.

 

A continuación dejo una captura de pantalla de consultar la página 2 de las 3 que hay actualmente:

 

[color=#a9a9a9]Pulsa imagen para ampliar[/color]


¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X