1 .
Mostrar los registros adecuados
2 .
Añadir los enlaces a otras páginas
Realizar una consulta a una base de datos MySQL desde PHP y presentarla es sencillo. El problema viene cuando debemos presentar 3000 registros y nos gustaría que el usuario no esperara hasta Nochebuena. En ese caso, se presenta un número menor de registros en la página (diez, viente) y se añaden enlaces para poder acceder a los demás. A esto se le llama paginación.
Mostrar los registros adecuados
Para poder paginar debemos recibir en la página, además de los parámetros que reciba normalmente, uno que indique la página de resultados que deseamos obtener. Por defecto será 1 y lo llamaremos pag. Supongamos que tenemos una página que devuelve el nombre de todos los clientes de una empresa. La llamaremos, en un alarde de originalidad, clientes.php. Sería algo así:
<html>
<body>
<?php
$link = mysql_connect("localhost", "nobody");
mysql_select_db("mydb", $link);
$result = mysql_query("SELECT nombre, apellidos FROM clientes", $link);
if (mysql_num_rows($result)){
echo "<table border = '1'> \n";
echo "<tr><td>Nombre</td><td>Apellidos</td></tr> \n";
while ($row = @mysql_fetch_array($result)) {
echo "<tr><td>".$row["nombre"].
"</td><td>".$row["email"]."</td></tr> \n";
}
echo "</table> \n";
}
else
echo "¡ No se ha encontrado ningún registro !";
?>
</body>
</html>
Para poder soportar paginación debemos, primero, decidir cuantos registros presentamos por página (por ejemplo, 10) y recibir el número de página que debemos presentar. Hay dos maneras de obtener el número de registros totales y los registros que necesitamos para presentar la página. Nosotros utilizaremos dos consultas. En la primera obtendremos el total de registros de la tabla y, en la segunda, cogeremos sólo los registros que necesitamos haciendo uso de LIMIT. Sustituiremos el código de la consulta por lo siguiente:
if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$result = mysql_query("SELECT COUNT(*) FROM clientes", $link);
list($total) = mysql_fetch_row($result);
$tampag = 10;
$reg1 = ($pag-1) * $tampag;
$result = mysql_query("SELECT nombre, apellidos FROM clientes
LIMIT $reg1, $tampag", $link);
Añadir los enlaces a otras páginas
La primera labor que vamos a hacer es crear una función abstracta que reciba el número de registros que en total devuelve la consulta, el tamaño de página, el número de la página actual, y el texto del enlace hasta insertar el número de página. Este último parámetro puede resultar un poco confuso. Pongamos un ejemplo. Si en nuestra página recibimos ese número por el parámetro pag, si quisieramos ver la página 2 escribiríamos:
clientes.php?pag=2
Por lo tanto, como debemos quitar el número de página, nos quedará:
clientes.php?pag=
La función deberá obtener primero el número total de páginas. Luego averiguará si existe una página anterior, escribiendo en enlace que va a esa página previa. Lo siguiente es escribir los enlaces a todas las páginas anteriores a la actual desde la 1. Luego escribe el número de la página actual, resaltado, pero sin enlace. Después escribe los números de las páginas posteriores y, finalmente, el enlace a la página posterior:
/******************************************************/
/* Funcion paginar
* actual: Pagina actual
* total: Total de registros
* por_pagina: Registros por pagina
* enlace: Texto del enlace
* Devuelve un texto que representa la paginacion
*/
function paginar($actual, $total, $por_pagina, $enlace) {
$total_paginas = ceil($total/$por_pagina);
$anterior = $actual - 1;
$posterior = $actual + 1;
if ($actual>1)
$texto = "<a href=\"$enlace$anterior\">«</a> ";
else
$texto = "<b>«</b> ";
for ($i=1; $i<$actual; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
$texto .= "<b>$actual</b> ";
for ($i=$actual+1; $i<=$total_paginas; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
if ($actual<$total_paginas)
$texto .= "<a href=\"$enlace$posterior\">»</a>";
else
$texto .= "<b>»</b>";
return $texto;
}
Además de incluir la función en nuestro script la tendremos que llamar después de cerrar la tabla:
echo paginar($pag, $total, $tampag, "clientes.php?pag=");
Y con esto ya tenemos un sistema de paginación que podremos utilizar en nuestras páginas.
Últimos comentarios
Últimos 5 comentarios
Ayuda (26/02/2008)
Por
necesito ayuda con una consulta
miren lo que pasa esque quiero realizar una consulta en php pero solo quiero que me pida el nombre de la persona y me enliste los datos de la misma en otro formulario
osea algo asi
nombre del usuario ********** buscar
que me pida el nombre cuando le introduzca el nombre y le de buscar que me saque los datos de esa persona si se encuentra en la base de datos esta en mysql o que me diga que no encontro a ese usuario si me pueden ayudar se los agradecere muchisimo
Funciona para cualquier numero de registros (31/10/2007)
Por
Muy buenas, excelente el código para paginar, no le encuentro la pega!
A partir de 1000 registros debería seguir funcionando igual, p ej, si paginamos cada 10 registros, y queremos ver la página 300, se aplica la fórmula bien indicada originalmente:
$reg1 = ($pag-1) * $tampag;
Que nos daría: $reg1=299*10, es decir, empezaría mostrando desde el registro 2990.
Yo creo q funciona bien sin cambios...
Un saludo a tod@s.
Una pulga.. al parecer... (26/07/2007)
Por
Tengo una base de datos > a 1000 registros y ocurre que no muestra los registros a partir de esos números. esto es que "$reg1 = ($pag-1) * $tampag;"
solo esta múltiplicando por 10, por lo tanto si queremos que funcione para más registros debemos agregar "$reg1 = (($pag-1) * $tampag)/10;"
Creo que por el momento es todo... ;) Saludos...
comentario.... (17/05/2007)
Por
Primero que todo esta bien el documento...felicitaciones a quien lo escribio, pero tambien lo invito a que se lea un poco sobre la Programacion Orientada a Objeto (POO), y alli sabra un poco sobre una funcion abstracta...
Para mi hizo falta añadirle una formula para saber la cantidad de paginas que tiene una consulta, es la siguiente:
$totalPages = ceil($totalRows/$noRowsXPage);
$totalRows : Esto es la cantidad de registros que arrojo una consulta.
$noRowsXPage :Esto es la cantidad de registros que va a tener cada pagina.
Para el que pregunto como mostrar los datos desde el ultimo al primero, la solucion mas sencilla es que ordene al contrario en el sql.
Hasta luego.-
excelente (09/05/2007)
Por
hola que tal!!!
ESta funcion para pa ginar esta excelente :) gracias por la ayuda... :)