Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/08/2011, 04:23
Avatar de vgonga1986
vgonga1986
 
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: ¿Delimitar enlaces paginación? y ¿Registros repetidos infinitamente?

He estado formateando tu código. Échale un ojo a la diferencia y verás como se lee mucho mejor. El tema de formatear bien los códigos parece una chorrada, pero cuando tienes que volver a mirar la clase después de un tiempo, te aseguro que te arrepentirás de no haberlo hecho. Además, no cuesta nada, lo vas haciendo según programas, sólo tienes que tener una metodología y mantenerla siempre.

Código PHP:
Ver original
  1. [HIGHLIGHT="PHP"]
  2. <!-- Listado (Empieza) -->
  3. <?
  4.     //AL PRINCIPIO COMPRUEBO SI HICIERON CLICK EN ALGUNA PÁGINA
  5.     if (isset($_GET['page'])) {
  6.         $page = $_GET['page'];
  7.     } else {
  8.     //SI NO DIGO QUE ES LA PRIMERA PÁGINA
  9.         $page=1;
  10.     }
  11.  
  12.     //AQUÍ SE SELECCIONAN TODOS LOS DATOS DE LA TABLA
  13.     $consulta = "SELECT PR.nombreempresa, PR.provprof, PR.pobprof, PR.descripciongym, PR.descuento, PV.idprovincia, PV.provincia, PO.idpoblacion, PO.poblacion ";
  14.     $consulta .= "FROM provincia PV, poblacion PO, profesionales PR WHERE PR.provprof = PV.idprovincia AND PR.pobprof = PO.idpoblacion ";
  15.     $consulta .= "ORDER BY fechaingreso ASC";
  16.     $datos = mysql_query($consulta, $conexion);
  17.  
  18.     //MIRO CUANTOS DATOS FUERON DEVUELTOS
  19.     $num_rows = mysql_num_rows($datos);
  20.  
  21.     //AQUÍ SE DECIDE CUANTOS RESULTADOS MOSTRAR POR PÁGINA , PONGO 5
  22.     $rows_per_page = 5;
  23.  
  24.     //CALCULO LA ÚLTIMA PÁGINA
  25.     $lastpage = ceil($num_rows / $rows_per_page);
  26.  
  27.     //COMPRUEBO QUE EL VALOR DE LA PÁGINA SEA CORRECTO Y SI ES LA ULTIMA PÁGINA
  28.     $page = (int)$page;
  29.     if ($page > $lastpage) {
  30.         $page= $lastpage;
  31.     }
  32.     if ($page < 1) {
  33.         $page=1;
  34.     }
  35.  
  36.     //CREO LA SENTENCIA LIMIT PARA AÑADIR A LA CONSULTA QUE DEFINITIVA
  37.     $limit = "SELECT PR.nombreempresa, PR.provprof, PR.pobprof, PR.descripciongym, PR.descuento, PV.idprovincia, PV.provincia, PO.idpoblacion, PO.poblacion ";
  38.     $limit .= "FROM provincia PV, poblacion PO, profesionales PR WHERE PR.provprof = PV.idprovincia AND PR = PO.idpoblacion ";
  39.     $limit .= "ORDER BY fechaingreso ASC ";
  40.     $limit .= "LIMIT " . ($page -1) * $rows_per_page . "," . $rows_per_page;
  41.  
  42.     //REALIZO LA CONSULTA QUE VA A MOSTRAR LOS DATOS (ES LA ANTERIOR + EL $limit)
  43.     $peliculas=mysql_query($limit, $conexion) or die('Invalid query: ' . mysql_error());
  44.  
  45.     //SI ES CORRECTA MUESTRO LOS DATOS
  46.     while ($registrolistado = mysql_fetch_array($peliculas)) {
  47. ?>
  48.     <!------- Div que repite por cada registro (Empieza) ---------->
  49.     <div id="tablaslistado">
  50.         <table class="generaltablist">
  51.             <tr>
  52.                 <th rowspan="4" scope="col"><img src="http://www.forosdelweb.com/images/fotosprof/ejemplo.gif" width="100px" height="100px" style="padding-top:22px;" alt="ejemplo gimnasio" align="left" /></th>
  53.                 <th height="20" scope="col" align="left"><?php echo $registrolistado["nombreempresa"]; ?></th>
  54.                 <th scope="col">Descuento:</th>
  55.             </tr>
  56.             <tr>
  57.                 <td rowspan="2"><?php echo $registrolistado["descripciongym"]; ?></td>
  58.                 <td class="celdadescuento" width="70" height="70px"><?php echo $registrolistado["descuento"]; ?>%</td>
  59.             </tr>
  60.             <tr>
  61.                 <td rowspan="2" align="center"><a href="">+ info</a></td>
  62.             </tr>
  63.             <tr>
  64.                 <td align="left"><?php echo $registrolistado["provincia"]; ?> | <?php echo $registrolistado["poblacion"]; ?></td>
  65.             </tr>
  66.         </table>
  67.     </div>
  68.     <div class="clear"></div>
  69.     <!------- Div que repite por cada registro (Termina) ---------->
  70. <?php  
  71.     }
  72. ?>
  73.     <!------- Paginación (Empieza) ---------->  
  74. <?php
  75.     //UNA VEZ QUE MUESTRO LOS DATOS TENGO QUE MOSTRAR EL BLOQUE DE PAGINACIÓN SIEMPRE Y CUANDO HAYA MÁS DE UNA PÁGINA
  76.     if ($num_rows != 0) {
  77.         $nextpage = $page + 1;
  78.         $prevpage = $page - 1;
  79. ?>
  80.     <ul id="pagination-digg">
  81. <?php
  82.     //SI ES LA PRIMERA PÁGINA DESHABILITO EL BOTON DE ANTERIOR, MUESTRO EL 1 COMO ACTIVO Y MUESTRO EL RESTO DE PÁGINAS
  83.     if ($page == 1) {
  84. ?>
  85.         <li class="previous-off">&laquo; Anterior</li>
  86.         <li class="active">1</li>
  87. <?php
  88.         for($i = $page + 1; $i <= $lastpage; $i++) {
  89. ?>
  90.         <li><a href="index.php?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
  91. <?php
  92.         }
  93.         //Y SI LA ULTIMA PÁGINA ES MAYOR QUE LA ACTUAL MUESTRO EL BOTON SIGUIENTE O LO DESHABILITO
  94.         if ($lastpage > $page) {
  95. ?>      
  96.         <li class="next"><a href="?page=<?php echo $nextpage; ?>">Siguiente &raquo;</a></li>
  97. <?php
  98.         } else {
  99. ?>
  100.         <li class="next-off">Siguiente &raquo;</li>
  101. <?php
  102.         }
  103.     } else {
  104.     //EN CAMBIO SI NO ESTAMOS EN LA PÁGINA UNO HABILITO EL BOTON DE ANTERIOR Y MUESTRO LAS DEMÁS
  105. ?>
  106.         <li class="previous"><a href="?page=<?php echo $prevpage; ?>"  >&laquo; Anterior</a></li>
  107. <?php
  108.         for ($i = 1; $i <= $lastpage ; $i++) {
  109.             //COMPRUEBO SI ES LA PÁGINA ACTIVA O NO
  110.             if ($page == $i) {
  111. ?>
  112.         <li class="active"><?php echo $i; ?></li>
  113. <?php
  114.             } else {
  115. ?>
  116.         <li><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
  117. <?php
  118.             }
  119.         }
  120.         //SI NO ES LA ÚLTIMA PÁGINA ACTIVO EL BOTON SIGUIENTE
  121.         if ($lastpage > $page ) {
  122. ?>
  123.         <li class="next"><a href="?page=<?php echo $nextpage; ?>">Siguiente &raquo;</a></li>
  124. <?php
  125.         } else {
  126. ?>
  127.         <li class="next-off">Siguiente &raquo;</li>
  128. <?php
  129.         }
  130.     }
  131. }
  132. ?>
  133.     </ul>
  134.     </div>
  135.     <!------- Paginación (Termina) ---------->
  136. </div>
  137. <!-- Listado (Termina) -->
[/HIGHLIGHT]

Además, te comento algunos fallos y mejoras:
- Al ejecutar una consulta de MySQL puedes poner el or die() en la misma línea, así te ahorras un if.
- En una tabla HTML, sólo un tag <tr> puede tener tags <th> dentro, los demás tienen que ser <td>. Si no haces esto, no te validará.
- En la tabla HTML creo que tienes líneas con diferente número de columnas, cuídate de esto y ten orden con los rowspan y colspan. Te lo he puesto como creo que es, pero sin verlo es difícil, pégale un repaso.
- Nunca utilices tags reducidos (<?), utiliza siempre <?php, porque los otros funciones si el servidor los tiene activados, pero puede que muevas el código a otro server, te deje de funcionar todo y te vuelvas loco.
- Para conseguir lo que quieres, que la paginación empiece en la página siguiente a la que estás tienes que modificar el segundo for:
Código PHP:
Ver original
  1. for ($i = 1; $i <= $lastpage ; $i++)
Por:
Código PHP:
Ver original
  1. for ($i = $page + 1; $i <= $lastpage ; $i++)
- Para conseguir que sólo llegue hasta un número de páginas, el límite del for tiene que ser más bajo, ya que tal y como lo tienes siempre llegará hasta la última (esto para los dos for):
Código PHP:
Ver original
  1. for($i = $page + 1; $i <= $lastpage; $i++)
Por:
Código PHP:
Ver original
  1. for($i = $page + 1; $i <= $page + 8; $i++)
Esto imprimirá desde la página siguiente a la que estás hasta la 7 posiciones más alante. Pero esto te genera un gran problema. Tienes que controlar que realmente existan 7 páginas delante de la que estás, si no lo haces, te imprimirá hasta la que marque, pero al pulsar el link te enviará a la última, y que lo que si tienes hecho es el control de que se ponga un número mayor que el posible. Mucho ojo con esto.
- Por cierto, cuando tienes que abrir y cerrar tags de PHP cada dos líneas queda todo un poco ilegible. Yo prefiero hacer echo desde el código PHP. Sería cambiar esto:
Código PHP:
Ver original
  1. if ($page == $i) {
  2. ?>
  3.         <li class="active"><?php echo $i; ?></li>
  4. <?php
  5.             } else {
  6. ?>
  7.         <li><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
  8. <?php
  9.             }
Por esto:
Código PHP:
Ver original
  1. if ($page == $i) {
  2.                 echo '      <li class="active">' . $i . '</li>';
  3.             } else {
  4.                 echo '      <li><a href="?page=' . $i . '">' . $i . '</a></li>';
  5.             }
Yo por lo menos lo veo más limpio

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?

Última edición por vgonga1986; 05/08/2011 a las 04:29 Razón: Último añadido