Paginación de resultados con PHP y MySQL.
Se podría decir que cualquier página web necesita un sistema de paginación de resultados, pues en éste artículo vamos a tratar este tema de principio a fin.
Primero vamos a analizar el archivo PHP que va a mostrar los resultados paginados, este archivo lo llamaremos contenido.php
contenido.php
- Creamos una función para mostrar el contenido y otra para contar el total de registros a paginar.
function mostrar_contenido($min,$max){ $con = mysqli_connect("localhost","usuario","contraseña","base-de-datos"); //comprobamos la conexión if (mysqli_connect_errno()){ echo "Error al conectar " . mysqli_connect_error(); } $result = mysqli_query($con,"SELECT * FROM tabla ORDER BY id DESC LIMIT ".$min.",".$max.""); while($row = mysqli_fetch_array($result)) { echo $row['nombre'] . " " . $row['apellidos']; } mysqli_close($con); } function contar_contenido(){ $con = mysqli_connect("localhost","usuario","contraseña","base-de-datos"); //comprobamos la conexión if (mysqli_connect_errno()){ echo "Error al conectar " . mysqli_connect_error(); } $result = mysqli_query($con,"SELECT * FROM tabla "); $total = mysql_num_rows($result); mysqli_close($con); return $total; }
Lo adecuado sería crear una clase con éstos métodos y después llamarlos en contenido.php, pero pongo este pequeño código por no poner la clase entera en el artículo.
El LIMIT de la consulta es el encargado de controlar los resultados que se muestran, lo que hace es decirle a la consulta, muéstrame desde el registro X al Y, esto varía dependiendo de la página en la que se encuentre el usuario. Es decir, si tenemos nuestro límite de registros por página a 5 y estamos en la primera página pues muestra de 0 a 5 registros, si estamos en la segunda página muestra de 5 a 10, así sucesivamente.
$maxreg = 12;
$pag = $_GET['pag'];
if(!isset($pag) || empty($pag)){ $min = 0; $pag = 1; }else{ if($pag == 1){ $min = 0; }else{ $min = $maxreg * $pag; $min = $min - $maxreg; } }
include("class.AutoPagination.php"); $obj = new AutoPagination(contar_contenido(), $pag);
mostrar_contenido($min,$maxreg);
echo $obj->_paginateDetails();
Aquí incluimos el archivo class.AutoPagination.php, la cual es una clase escrita por un programador Indio llamado Nitesh Apte que la pone a disposición de cualquiera con licencia GPL en PHP Classes. Para los vagos que no quieran registrarse en PHP Clases pondré un enlace de descarga al final del post para obtener esta clase desde Mediafire.
El archivo contenido.php quedaría así:
function mostrar_contenido($min,$max){ $con = mysqli_connect("localhost","usuario","contraseña","base-de-datos"); //comprobamos la conexión if (mysqli_connect_errno()){ echo "Error al conectar " . mysqli_connect_error(); } $result = mysqli_query($con,"SELECT * FROM tabla ORDER BY id DESC LIMIT ".$min.",".$max.""); while($row = mysqli_fetch_array($result)) { echo $row['nombre'] . " " . $row['apellidos']; } mysqli_close($con); } function contar_contenido(){ $con = mysqli_connect("localhost","usuario","contraseña","base-de-datos"); //comprobamos la conexión if (mysqli_connect_errno()){ echo "Error al conectar " . mysqli_connect_error(); } $result = mysqli_query($con,"SELECT * FROM tabla "); $total = mysql_num_rows($result); mysqli_close($con); return $total; } $maxreg = 12; $pag = $_GET['pag']; if(!isset($pag) || empty($pag)){ $min = 0; $pag = 1; }else{ if($pag == 1){ $min = 0; }else{ $min = $maxreg * $pag; $min = $min - $maxreg; } } include("class.AutoPagination.php"); $obj = new AutoPagination(contar_contenido(), $pag); mostrar_contenido($min,$maxreg); echo $obj->_paginateDetails();
class.AutoPagination.php
En la clase tan sólo deberemos configurar el número de registros por página (deberá ser igual que el que pusimos en el archivo contenido.php) y el número de páginas que se muestra en la paginación, es decir, esto será por si nuestro sitio web tiene 200 páginas no se muestren las 200 páginas una detrás de otra, sino que muestre el número de páginas que le pongamos, por ejemplo si ponemos 10 páginas y estamos en la página 15 mostraría lo siguiente:
En la clase habría que cambiar lo siguiente:
define('PAGE_LIMIT', 12); //límite de registros por página define('PAGE_RANGE', 10); //el número de páginas que muestra en la paginación
Esto es todo amigos, cualquier cosa pregunten.