Paginar resultados con php

Sigo haciendo preguntas en este sitio por que me ha dado buenos resultado y ahora quiero saber como paginar mis resultados de una consulta realizada por medio de php a mysql

2 Respuestas

Respuesta
1
Tendrías que usar la función LIMIT de MySQL.
De modo, que pases a la consulta el intervalo entre el que quieres presentar datos.
Por ejemplo... imagina que quieres que la base de datos te devuelva los registros en las posiciones 30 y 40. Tendrías que hacer:
SELECT * FROM TABLA LIMIT 30-40
Así, imagina que tienes el listado de los elementos del 1 al 20 en la pantalla...
Debajo un enlace que apuntaría a la misma página pero pasándole los indices siguientes:
<a href="paginalistados.php?indiceInferior=20&indiceSuperior=30">Más Resultados</a>
La query genérica quedaría así:
$query = "SELECT * FROM TABLA LIMIT " . $_GET["indiceInferior"] . "-" . $_GET["indiceSuperior"];
Respuesta
1
Tienes un buen ejemplo en la siguiente web:
http://programacion.com/php/codigo/34/
Te voy a poner el código que aparece en esa página para explicártelo, aunque es muy sencillo de entender:
<html>
<head>
<title>Páginación de resultados</title>
</head>
<body bgcolor=#FFFFFF>
<?
// Datos de conexión a la base
$base=\"nombredelabase\";
$con=mysql_connect(servidor,usuario,password);
mysql_select_db($base,$con);
if (!isset($pg))
$pg = 0; // $pg es la pagina actual
$cantidad=10; // cantidad de resultados por página
$inicial = $pg * $cantidad;
$pegar = \"SELECT * FROM tabla ORDER BY titulo LIMIT $inicial,$cantidad\";
$cad = mysql_db_query($base,$pegar) or die (mysql_error());
$contar = \"SELECT * FROM tabla ORDER BY titulo\";
$contarok= mysql_db_query($base,$contar);
$total_records = mysql_num_rows($contarok);
$pages = intval($total_records / $cantidad);
// Imprimiendo los resultados
while($array = mysql_fetch_array($cad)) {
echo $array[\'titulo\'].\"<br>\";
}
// Cerramos la conexión a la base
$con=mysql_close($con);
// Creando los enlaces de paginación
echo \"<p>\";
if ($pg <> 0)
{
$url = $pg - 1;
echo \"<a href=\'paginar.php?pg=\".$url.\"\'>« Anterior</a> \";
}
else {
echo \" \";
}
for ($i = 0; $i<($pages + 1); $i++) {
if ($i == $pg) {
echo \"<font face=Arial size=2 color=ff0000><b> $i </b></font>\";
}
else {
echo \"<a href=\'paginar.php?pg=\".$i.\"\'>\".$i.\"</a> \";
}
}
if ($pg < $pages) {
$url = $pg + 1;
echo \"<a href=\'paginar.php?pg=\".$url.\"\'>Siguiente »</a>\";
}
else {
echo \" \";
}
echo \"</p>\";
?>
</body>
</html>
Primero conectas con la base de datos. Se van a mostrar páginas de 10 resultados, aunque lo puedes variar modificando una variable. Debes tener una variable con el número de página que quieres mostrar. Luego se calcula a partir de esa variable los resultados a mostrar y se obtienen de la base de datos usando una consulta SELECT ... LIMIT. También hay que contar el número total de resultados para luego poner los enlaces a las siguientes páginas. Ahora es cuando se muestran todos los resultados, y a continuación los enlaces al resto de páginas. En cada enlace le tienes que pasar como parámetro GET el número de página a mostrar para poder calcular los resultados que se muestren.
Como ves, es bastante sencillo de entender, no creo que tengas ningún problema, pero si lo tienes me lo comentas.
Hola muchas gracias por todas tus respuestas espero no desesperarte con tantas preguntas principalmente mi siguiente duda es que en mi consulta están implicadas 4 tablas y no todas tienen un campo en común estoy tomando el campo que es más común entre tres tablas.
Otra pregunta es que tengo mi consulta empleo una condición quiero saber si esta va antes del ORDER BY o después del ORDER BY
Todo el código que te puse arriba pertenece al script llamado páginas.php. Con ese sólo archivo tienes suficiente, no necesitas nada más. Por eso está la variable pg que se pasa con cada llamada y que indica qué elementos tiene que mostrar. Si te das cuenta, lo único que cambia son los 10 resultados a mostrar, el resto del código sería igual, y como esos resultados los obtienes de la base de datos de forma dinámica, basta con tener el número del registro a mostrar.
También puedes usar varias consultas a varias tablas de la misma base de datos. Por ejemplo:
$pegar = \"SELECT * FROM Tabla1, Tabla2 ORDER BY titulo LIMIT $inicial,$cantidad\";
Tanto tabla1 como tabla2 deben tener un campo llamado titulo.
Hola antes que nada muchas gracias el código para paginar funciona muy bien
pero tengo otras dudas
La primera es:
En las siguientes lineas
else {
echo \"<a href=\'paginar.php?pg=\".$i.\"\'>\".$i.\"</a> \";
}
}
if ($pg < $pages) {
$url = $pg + 1;
echo \"<a href=\'paginar.php?pg=\".$url.\"\'>Siguiente »</a>\";
}
se supone o quiero pensar que la pagina de paginar.php? las tengo que crear yo pero si voy a tener varios resultados tengo que crear varias paginas o solo una.
La segunda es que si puedo implementar este código para una consulta donde interviene más de una tabla de mi base de datos
Este es el query de mi consulta y no se donde utilizar el ORDER BY
SELECT mprop.folio, mprop.registro, mprop.foja, mprop.tomo, mprop.volumen, mprop.seccion, mprop.serie, inprop.ubicacion, consulprop.codigopostal, mun.descripcion FROM mprop, prop, inprop, mun, consulprop WHERE ( mprop.folio = consulprop.folio ) AND ( mprop.folio = inprop.folio ) AND ( mprop.folio = prop.folio ) AND ( inprop.clv = mun.clv )AND (prop.nombre = '$p1') ORDER BY mprop.folio LIMIT $inicial,$cantidad";
La consulta para las 4 tablas depende de lo que quieras hacer y los campos que tenga cada una. Pero si todas perteneces a lo mismo deberían tener por lo menos un campo común, ya sea un titulo, o número, o categoría, etc. Necesitaría saber qué quieres hacer, y de cada tabla los campos que tienen y su tipo.
Respecto al ordens, siempre se suele poner ORDER BY detrás de la condición, pero creo que funcionaría igualmente si lo pones delante.
La estructura de esa consulta es correcta. Lo único que tienes que comprobar es que las condiciones sean correctas dependiendo del significado de cada campo. El ORDER BY está bien situado detrás de todas las condiciones y LIMIT está detrás de ORDER BY. He realizado algunas pruebas y ese es la posición correcta ya que si pones las condiciones WHERE detrás de ORDER BY da error y si pones LIMIT antes de ORDER BY también da error.
La consulta es sintácticamente correcta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas