jueves, 31 de enero de 2013

Paginación en PHP

Buenas a tod@s!!!

Hoy traigo un método eficaz para hacer una paginación de distintos elementos en PHP y mysqli. Aunque el ejemplo esté en mysqli el método es compatible en otras versiones de mysql, solo varían las funciones utilizadas para las consultas (las querys son las mismas).

Para simplificar dividiremos el método en dos partes: La obtención de datos y el proceso para mostrarlos.

Obtención de datos:

obtener_elementos.php

$limite_elementos_pagina=20;
//obtenemos por get la pagina que queramos consultar, la primera vez la pagina será 0
if(isset($_GET["pagina"])){
$pagina=(int)$_GET["pagina"];
}
else {
$pagina=0;
}
$pagina_actual=$pagina;
$pagina_elemento=$pagina*$limite_elementos_pagina;
//con esta query obtendremos los elementos pertenecientes a la página del GET
$query="SELECT * FROM `elementos` ORDER BY elementos.id ASC LIMIT ".$pagina_elemento.",".$limite_elementos_pagina.";";
$query.="SELECT count(*) AS `count` FROM `elementos`";
if($mysqli->multi_query($query)){
//en $elementos tendremos guardados los elementos requeridos
if($elementos = $mysqli->store_result()) {
$mysqli->next_result();
if($result = $mysqli->store_result()) {
if($row = $result->fetch_array(MYSQLI_ASSOC)) {
//obtenemos el número de páginas que hay, la función ceil redondea por arriba
$numero_paginas=ceil($row['count']/$limite_elementos_pagina);
//llamamos al archivo php para mostrar los elementos
include("mostrar_elementos.php");
}
}
}
}

El código está bastante comentado, pero hay un par de apuntes que aclarir:
La función isset comprueba si existe la variable y devuelve cierto en dicho caso.
Mysqli permite las sentencias múltiples, en este caso tenemos un poco de caos en el código; lo que hacemos solamente es obtener los elementos en referencia a la página de la base de datos y obtener el número de elementos que hay.
Para obtener el número de páginas, dividimos el número de elementos totales entre el limite de elementos por página; hay un dato importante y es que tenemos que redondear por arriba, ya que, si el número resultante es decimal, indicará que habrá una página con un número de elementos inferior al límite.
Finalmente la función include, nos incluye el código del archivo seleccionado consecutivamente a esa función (include).

Ahora procedemos a mostrar los elementos:

mostrar_elementos.php

<html>
<head>
</head>
<body>
<div>
<?php while($row = $elementos->fetch_array(MYSQLI_ASSOC)) { ?>
<p> <?php echo $row['id'].' '$row['atributo1'].' '$row['atributo2'];?> </p>
<?php } ?>
</div>
<div>
<?php $i=0;
while($i<$numero_paginas){ ?>
<?php if($i==$pagina_actual) { ?>
<label> <?php echo $pagina_actual+1; $i++; ?> </label>
<?php }
else {?>
<a href="obtener_elementos.php?page=<?php echo $i; ?>"> <?php echo $i+1; $i=$i+1; ?> </a>
<?php
}
}?>
</div>
</body>
</html>

Para mostrar los elementos intercalamos html y php.
Dentro del primer DIV, en el while recorremos todos los elementos pertenecientes a la página actual, obtenidos anteriormente y mostramos sus atributos.
En el segundo DIV, vamos de 0 hasta el número de páginas-1 (ya que la página 0 cuenta): En el caso de que la página sea la actual no permitiremos acceder a ella (label), en el caso de que no lo sea crearemos un link para obtener los elementos de dicha página, dónde le pasaremos por GET el número de página que se corresponda.
Cabe indicar que el número de página que mostramos es una unidad superior al número de página real, ya que no tiene mucho sentido que el usuario vea la página número 0.

Espero no dejarme nada, cualquier cosa, comentario!!!

Un saludo!!!

No hay comentarios:

Publicar un comentario