Ir al contenido


Foto

¿Cómo realizar el paginado de resultados en PHP?


  • Por favor identifícate para responder
5 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 marzo 2009 - 05:41

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
  • 0

#2 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

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  8o|, 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.





  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 marzo 2009 - 07:02

Excelente Héctor, trataré de avanzar algo con las ideas que me acabas de dar. ;)

Saludos.
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

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" :D

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,
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 10 marzo 2009 - 08:02

Hola, logré hacer el paginado de resultados con php, lo hice de esta manera:

Aquí­ hago las consultas:


php
  1. $registros = 15;
  2.  
  3. $pagina = $_GET["pagina"];
  4.  
  5. if (!$pagina) {
  6. $inicio = 0;
  7. $pagina = 1;
  8. }
  9. else {
  10. $inicio = ($pagina - 1) * $registros;
  11. }
  12.  
  13. $Total = mysql_query("select * from {$db_prefix}noticias");
  14. $total_registros = mysql_num_rows($Total);
  15.  
  16.   $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";
  17.       $resultado=mysql_query($consulta);
  18.   $total_paginas = ceil($total_registros / $registros);



Aquí­ muestro las páginas estilo: "<< Anterior 1 2 3 Siguiente >>"


php
  1. if($total_registros) {
  2.  
  3.     echo '<table width="100%" border="0" cellspacing="0" cellpadding="0">
  4.       <tr>
  5.         <th height="30" scope="col">';
  6.  
  7. if(($pagina - 1) > 0) {
  8. echo '<a href="',$scripturl,'?action=portal;pagina='.($pagina-1).'"><< Anterior</a> ';
  9. }
  10.  
  11. for ($i=1; $i<=$total_paginas; $i++){
  12. if ($pagina == $i) {
  13. echo '<b>',$pagina,' </b>';
  14. } else {
  15. echo '<a href="',$scripturl,'?action=portal;pagina=',$i,'">',$i,' </a>';
  16. }
  17. }
  18.  
  19. if(($pagina + 1)<=$total_paginas) {
  20. echo ' <a href="',$scripturl,'?action=portal;pagina='.($pagina+1).'">Siguiente >></a>';
  21. }
  22.   }



Hasta ahora me ha funcionado de pelos :D

Saludos.
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 10 marzo 2009 - 08:34

Me alegro que funcione :)
Mejor simple que antes complicarlo ;).

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.