Hola colegas, ¿pues eso cómo realizarlo?, sé que en una consulta se usa la función LIMIT, pos hasta ahí llego yo, he intentado buscar en la red pero no queda nada claro, a ver si alguien me puede aclarar mejor. Lo que ando buscando es paginar los resultados de una consulta limitandolo como por ejemplo a 10 por página y que al pie de la página algo como 1 2 3 4 5 ...9. Espero que se entienda :$
Saludos

¿Cómo realizar el paginado de resultados en PHP?
Comenzado por
enecumene
, mar 09 2009 05:41
5 respuestas en este tema
#1
Escrito 09 marzo 2009 - 05:41
#2
Escrito 09 marzo 2009 - 06:49
Hola Fernando
Te puedo ayudar con eso de la paginación. Es una lástima que por el momento estoy algo presionado por un trabajo que debo entregar el próximo jueves
, sino podría hacerte un ejemplito. Pero bueno, intentaremos recopilar algunas ideas y estoy seguro que lo podrás sacar tu mismo.
Efectivamente la idea es utilizar las cláusulas LIMIT que ofrece MySQL.
Lo primero es conocer cuántos registros te devuelve la consulta, en seguida debemos definir cuántos registros van por página (esto puede ser una constante).
Tu script en PHP debe recibir el parámetro que te diga qué página deseas visualizar. Lo siguiente es calcular a partir de qué número de registro comienza la página y después calcular el último registro de la misma. Luego generas la consulta utilizando LIMIT.
Si te parece vamos poco a poco, por lo pronto comenzamos con esto y luego vemos cómo agregarle un paginador, es decir, algunos botones para avanzar la página y retroceder.
Por lo pronto prueba a que tu SCRIPT reciba el número de página y a ver que te muestre solamente esos registros.
Saludos.
Te puedo ayudar con eso de la paginación. Es una lástima que por el momento estoy algo presionado por un trabajo que debo entregar el próximo jueves

Efectivamente la idea es utilizar las cláusulas LIMIT que ofrece MySQL.
Lo primero es conocer cuántos registros te devuelve la consulta, en seguida debemos definir cuántos registros van por página (esto puede ser una constante).
Tu script en PHP debe recibir el parámetro que te diga qué página deseas visualizar. Lo siguiente es calcular a partir de qué número de registro comienza la página y después calcular el último registro de la misma. Luego generas la consulta utilizando LIMIT.
Si te parece vamos poco a poco, por lo pronto comenzamos con esto y luego vemos cómo agregarle un paginador, es decir, algunos botones para avanzar la página y retroceder.
Por lo pronto prueba a que tu SCRIPT reciba el número de página y a ver que te muestre solamente esos registros.
Saludos.
#3
Escrito 09 marzo 2009 - 07:02
Excelente Héctor, trataré de avanzar algo con las ideas que me acabas de dar. 
Saludos.

Saludos.
#4
Escrito 10 marzo 2009 - 07:58
Hola Fernando,
Yo de PHP estoy con ceros a la izquierda... pero viéndolo desde el aspecto lógico no creo que sea tan complicado.
Si me independizo del lenguaje... ¿no hay problema?
Veamos el asunto: primero hay que tener presente dos cosas:
1. La cantidad de enlaces a mostrar en el "paginador"
2. La cantidad de páginas que componen el paginador.
No es lo mismo, hay una pequeña diferencia...
Dices que quieres limitar a 10, Es decir agrupar en el paginador de a 10 páginas. Esto sería el caso 2: 1,2,3..9. Esto significa que en la página N que estás visitando sólo puedes estar viendo las 10 paginas del rango en donde está N. Por ejemplo: si estás en la página 23, el rango debería ir desde 20 a 30.
El primer caso indica los enlaces vivos hacia las páginas. En tu ejemplo parecería ser 4: sólo se muestran los enlaces de 1,2,3 y 9. En mi ejemplo, si estás en la 23 debería verse tal vez: 21,22,24..29.
¿Se entiende? Por como lo veo se necesita dos constantes, o variables:
Una para determinar el agrupamiento, y otra que nos indique la cantidad de páginas que se enlazan o se muestran. Por darles un nombre digamos que son: CONST_RANGO_AGRUPAMIENTO, y CONST_CANT_PAG respectivamente. Necesariamente CONST_CANT_PAG debe ser menor o cuanto mucho igual a CONST_RANGO_AGRUPAMIENTO.
Teniendo como punto estas dos cosas, ahora hay que considerar algunos escenarios:
1) La cantidad de páginas a mostrar es inferior CONST_CANT_PAG: sólo se mostrarán entonces las cantidades necesarias.
2) La cantidad de páginas a mostrar es superior a CONST_CANT_AGRUPAMIENTO se necesita determinar entonces las CONST_CANT_PAG que páginas se van a mostrar.
En este segundo escenario debe considerarse los siguientes puntos:
a. ¿Es necesario contar con un enlace hacia la anterior?
b. ¿Es necesario contar con un enlace hacia la siguiente?
c. ¿Es necesario mostrar los extremos módulos CONT_RANGO_AGRUPAMIENTO?
d. ¿Que páginas se muestran si la página X (la página que se está viendo) es la correspondiente al punto extremo del agrupamiento?
Estas preguntas pueden parecer triviales pero se ven influenciadas por CONST_CANT_PAG. Por ejemplo, supongamos el siguiente caso: Sea X = 25, CONST_CANT_PAG = 4, y CONST_PAG_AGRUPAMIENTO = 10. ¿Qué paginas se mostrarán?
Opción 1: 23,24,26..29. Tiene precedencia la superior e inferior y en segundo criterio, se considera el extremo superior del agrupamiento permitido.
Opción 2: 20,24,26..29. Tiene precedencia el extremo inferior del agrupamiento, y luego se muestran las páginas superior e inferior.
Ahora, si X es por ejemplo 20. ¿Cuáles van?
Opcion 3: 21,22,23..29
Opcion 4: 19,21,22..29
Como vez, en la opción 4 se está mostrando una página que coresponde a un nivel de agrupamiento inferior (10..19) ¿Eso será permitido?
3). La cantidad de páginas es superior a CONST_CANT_PAG pero inferior a CONST_RANGO_AGRUPAMIENTO. Aquí se ven consideraciones parecidas...
4). Analizar los casos extremos:
4.1. Sea X la primera página (X = 1)
4.2. Sea X la última página (X = M)
En fin a lo que quiero llegar es las páginas a mostrar dependen de muchos factores
... pero estoy seguro que ya lo estuviste analizando...
Ahora como "Plus", si se le quiere complicar la cosa:
¿Es necesario (y tal vez una obligación) mostrar un enlace hacia la primera y última página?
¿Si hay muchísimas páginas, se desea disponer de enlaces que nos lleven a niveles de agrupamiento superiores e inferiores? Esto te lo digo por si después lo quieres ampliar...
Hay sitios que muestran los enlaces de esta forma:
1..9,10,20,21,[22],23..29,30,80..87
Como puedes ver aquí, este es un caso bastante complejo. Por lo que pareciera ser hay 87 páginas. Se muestran las extremas (1 y 87), se aplica un agrupamiento de 10, y a su vez, dentro del grupo se analizan los puntos extremos (como el caso del 1..9 y 80..87) y los inmediatos a la página visitada (21,23). Tal parece que se muestran de 5 páginas por grupo. E incluso se ve que muestra enlaces para ir a grupos inferiores y superiores, por lo visto se muestra 5 agrupamientos: el primer agrupamiento (1..9), el último (80..87), los inmediatos al de X (10 y 30) y el del agrupamiento de X (20..29).
A este ejemplo lo inventé pero existen sitios que lo muestran así, creo que ilustra la magnitud de hasta donde llegar.
Como dice Héctor, vayamos despacio... creo que por el momento lo más fácil de hacer es tal vez el simple "X de Y"
No se si lo que he dicho ayuda... pero tal vez con lo dicho sirve como para pensar en un posible algoritmo inicial:
MostrarPaginador(PaginaActual)
1. TotalPag = TotalPaginas()
2. ¿TotalPag < CONST_RANGO_AGRUPAMIENTO?
SI: 2.1. Mostrar(PaginaActual, TotalPag)
NO: MostrarPaginaRango(PaginaActual, TotalPag)
Mostrar() se emplea en los casos en que existan menos páginas a mostrar que en un agrupamiento, mientras MostrarPaginaRango se emplearía en los casos en que existan más páginas que lo permitido por el agrupamiento.
Espero haber sido de ayuda en algo, muy seguramente ya hay algo ya hecho o algún sitio que explique esto. Habiendo una comunidad muy grande de desarrolladores web en PHP no debería resultar difícil hallar algún foro, post, o comentarios sobre esto.
Saludos,
Yo de PHP estoy con ceros a la izquierda... pero viéndolo desde el aspecto lógico no creo que sea tan complicado.
Si me independizo del lenguaje... ¿no hay problema?
Veamos el asunto: primero hay que tener presente dos cosas:
1. La cantidad de enlaces a mostrar en el "paginador"
2. La cantidad de páginas que componen el paginador.
No es lo mismo, hay una pequeña diferencia...
Dices que quieres limitar a 10, Es decir agrupar en el paginador de a 10 páginas. Esto sería el caso 2: 1,2,3..9. Esto significa que en la página N que estás visitando sólo puedes estar viendo las 10 paginas del rango en donde está N. Por ejemplo: si estás en la página 23, el rango debería ir desde 20 a 30.
El primer caso indica los enlaces vivos hacia las páginas. En tu ejemplo parecería ser 4: sólo se muestran los enlaces de 1,2,3 y 9. En mi ejemplo, si estás en la 23 debería verse tal vez: 21,22,24..29.
¿Se entiende? Por como lo veo se necesita dos constantes, o variables:
Una para determinar el agrupamiento, y otra que nos indique la cantidad de páginas que se enlazan o se muestran. Por darles un nombre digamos que son: CONST_RANGO_AGRUPAMIENTO, y CONST_CANT_PAG respectivamente. Necesariamente CONST_CANT_PAG debe ser menor o cuanto mucho igual a CONST_RANGO_AGRUPAMIENTO.
Teniendo como punto estas dos cosas, ahora hay que considerar algunos escenarios:
1) La cantidad de páginas a mostrar es inferior CONST_CANT_PAG: sólo se mostrarán entonces las cantidades necesarias.
2) La cantidad de páginas a mostrar es superior a CONST_CANT_AGRUPAMIENTO se necesita determinar entonces las CONST_CANT_PAG que páginas se van a mostrar.
En este segundo escenario debe considerarse los siguientes puntos:
a. ¿Es necesario contar con un enlace hacia la anterior?
b. ¿Es necesario contar con un enlace hacia la siguiente?
c. ¿Es necesario mostrar los extremos módulos CONT_RANGO_AGRUPAMIENTO?
d. ¿Que páginas se muestran si la página X (la página que se está viendo) es la correspondiente al punto extremo del agrupamiento?
Estas preguntas pueden parecer triviales pero se ven influenciadas por CONST_CANT_PAG. Por ejemplo, supongamos el siguiente caso: Sea X = 25, CONST_CANT_PAG = 4, y CONST_PAG_AGRUPAMIENTO = 10. ¿Qué paginas se mostrarán?
Opción 1: 23,24,26..29. Tiene precedencia la superior e inferior y en segundo criterio, se considera el extremo superior del agrupamiento permitido.
Opción 2: 20,24,26..29. Tiene precedencia el extremo inferior del agrupamiento, y luego se muestran las páginas superior e inferior.
Ahora, si X es por ejemplo 20. ¿Cuáles van?
Opcion 3: 21,22,23..29
Opcion 4: 19,21,22..29
Como vez, en la opción 4 se está mostrando una página que coresponde a un nivel de agrupamiento inferior (10..19) ¿Eso será permitido?
3). La cantidad de páginas es superior a CONST_CANT_PAG pero inferior a CONST_RANGO_AGRUPAMIENTO. Aquí se ven consideraciones parecidas...
4). Analizar los casos extremos:
4.1. Sea X la primera página (X = 1)
4.2. Sea X la última página (X = M)
En fin a lo que quiero llegar es las páginas a mostrar dependen de muchos factores

Ahora como "Plus", si se le quiere complicar la cosa:
¿Es necesario (y tal vez una obligación) mostrar un enlace hacia la primera y última página?
¿Si hay muchísimas páginas, se desea disponer de enlaces que nos lleven a niveles de agrupamiento superiores e inferiores? Esto te lo digo por si después lo quieres ampliar...
Hay sitios que muestran los enlaces de esta forma:
1..9,10,20,21,[22],23..29,30,80..87
Como puedes ver aquí, este es un caso bastante complejo. Por lo que pareciera ser hay 87 páginas. Se muestran las extremas (1 y 87), se aplica un agrupamiento de 10, y a su vez, dentro del grupo se analizan los puntos extremos (como el caso del 1..9 y 80..87) y los inmediatos a la página visitada (21,23). Tal parece que se muestran de 5 páginas por grupo. E incluso se ve que muestra enlaces para ir a grupos inferiores y superiores, por lo visto se muestra 5 agrupamientos: el primer agrupamiento (1..9), el último (80..87), los inmediatos al de X (10 y 30) y el del agrupamiento de X (20..29).
A este ejemplo lo inventé pero existen sitios que lo muestran así, creo que ilustra la magnitud de hasta donde llegar.
Como dice Héctor, vayamos despacio... creo que por el momento lo más fácil de hacer es tal vez el simple "X de Y"

No se si lo que he dicho ayuda... pero tal vez con lo dicho sirve como para pensar en un posible algoritmo inicial:
MostrarPaginador(PaginaActual)
1. TotalPag = TotalPaginas()
2. ¿TotalPag < CONST_RANGO_AGRUPAMIENTO?
SI: 2.1. Mostrar(PaginaActual, TotalPag)
NO: MostrarPaginaRango(PaginaActual, TotalPag)
Mostrar() se emplea en los casos en que existan menos páginas a mostrar que en un agrupamiento, mientras MostrarPaginaRango se emplearía en los casos en que existan más páginas que lo permitido por el agrupamiento.
Espero haber sido de ayuda en algo, muy seguramente ya hay algo ya hecho o algún sitio que explique esto. Habiendo una comunidad muy grande de desarrolladores web en PHP no debería resultar difícil hallar algún foro, post, o comentarios sobre esto.
Saludos,
#5
Escrito 10 marzo 2009 - 08:02
Hola, logré hacer el paginado de resultados con php, lo hice de esta manera:
Aquí hago las consultas:
Aquí muestro las páginas estilo: "<< Anterior 1 2 3 Siguiente >>"
Hasta ahora me ha funcionado de pelos
Saludos.
Aquí hago las consultas:
php
$registros = 15; $pagina = $_GET["pagina"]; if (!$pagina) { $inicio = 0; $pagina = 1; } else { $inicio = ($pagina - 1) * $registros; } $consulta ="select CONCAT(CAST(noticia AS CHAR(1000)),'...') as Texto, titulo, autor, fecha,id_noticia from {$db_prefix}noticias ORDER BY fecha DESC LIMIT $inicio, $registros";
Aquí muestro las páginas estilo: "<< Anterior 1 2 3 Siguiente >>"
php
if($total_registros) { echo '<table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <th height="30" scope="col">'; if(($pagina - 1) > 0) { echo '<a href="',$scripturl,'?action=portal;pagina='.($pagina-1).'"><< Anterior</a> '; } for ($i=1; $i<=$total_paginas; $i++){ if ($pagina == $i) { echo '<b>',$pagina,' </b>'; } else { echo '<a href="',$scripturl,'?action=portal;pagina=',$i,'">',$i,' </a>'; } } if(($pagina + 1)<=$total_paginas) { echo ' <a href="',$scripturl,'?action=portal;pagina='.($pagina+1).'">Siguiente >></a>'; } }
Hasta ahora me ha funcionado de pelos

Saludos.
#6
Escrito 10 marzo 2009 - 08:34
Me alegro que funcione 
Mejor simple que antes complicarlo
.
Saludos,

Mejor simple que antes complicarlo

Saludos,