Foros del Web » Programando para Internet » PHP »

Paginación resultados

Estas en el tema de Paginación resultados en el foro de PHP en Foros del Web. Hola, antes que nada gracias desde ya!!! El código que está situado más abajo es el que utilizo para la paginación de los resultados de ...
  #1 (permalink)  
Antiguo 24/07/2003, 13:29
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 21 años, 5 meses
Puntos: 2
Paginación resultados

Hola, antes que nada gracias desde ya!!!

El código que está situado más abajo es el que utilizo para la paginación de los resultados de mis busquedas en la db, el problema es que cuando ha encontrado por ejemplo 7 registros cuando el limite es 4 por página, me crea el indice de paginación correctamente pero cuando avando en el indice dando a un número del indice o dandole al enlace Siguiente >> al abrir dicha página en el nuevo documento me saca todos los registros de la tabla con todos los indices necesarios para la paginación, mi pregunta es porque se produce este error... , he revisado el código y la verdad no me lo explico si en un principio hace bien la paginación porque cuando avanzo por dicha paginación se estrope más adelante.


Espero haberme explicado claramente... a continuación pego el código.


Código PHP:
  # definimos las variables iniciales de la paginación
                   
if (!isset($pg))
                   
$pg 0// $pg es la pagina actual
                   
$cantidad=4// cantidad de resultados por página
                   
$inicial $pg $cantidad;
                  
                 
                  
// se concatena la secuencias de campo LIKE '%palabra%' AND .. con el SQL
                  // si hace falta mas parámetros o condiciones .. añadir al final ...
                  
$sql "SELECT * FROM $tabla WHERE ".$secuencia_total." ORDER BY Titulo LIMIT $inicial,$cantidad";

                   
                                                
                   
# establecemos el criterio de seleccion
                   
$resultado mysql_query($sql$conexion) or die ("Error en la consulta:\n<br><b>$sql</b><br>\nMySQL dice: ".mysql_error());
                   
                   
                   
# contamos todos los registros de la tabla
                   
$contar "SELECT * FROM $tabla WHERE ".$secuencia_total." ORDER BY Titulo"
                   
$contarokmysql_query($contar$conexion);
                   
$total_records mysql_num_rows($contarok);
                   
$pages intval($total_records $cantidad);


                   
# CREAMOS UNA CABEZERA DE UNA TABLA (codigo HTML)

                   
echo "<table width='90%'cellpadding='0' cellspacing='0' align=center bgcolor='#EFEFEF' border=0>";

                   
# establecemos un bucle que recoge en un array
                   # cada una de las LINEAS DEL RESULTADO DE LA CONSULTA
                   # utilizamos en esta ocasión <<myslq_fetch_array>>
                   # recuerda que esta ultima función devuelve un array escalar
                   # y otro asociativo con los resultados
                   
                   
while ($encontrados mysql_fetch_array($resultado)){
                   echo 
"<tr><td height='20'>&nbsp;</td></tr>";
                   echo 
"<tr><td height='20' valign='middle' bgcolor='#003366'>&nbsp;<font face='arial' size='1'><strong><a href='".$encontrados['Url']."'>".$encontrados['Titulo']."</a></strong></font></td></tr>";
                   echo 
"<tr><td></td></tr>";
                   echo 
"<tr><td><font face='arial' size='1'><strong>".$encontrados['Descripcion'].".</strong></font></td></tr>";
                   echo 
"<tr><td><br></td></tr>";
                   }
                   echo 
"</table>";
                   
                  
                  
# filtramos mediante un if (){...}else{... que no haya menos de 11 registros para no hacer la paginación 
                  
if ($pages 1){
                  echo 
"";
                  }else{                    
                  
                  
# creando los enlaces de paginación
                  
echo "<br><div align='center'><font face='Tahoma' size='1' color='#003366'><strong>Página de resultados</strong></font></div><div align='center'>";
                  if (
$pg <> 0)
                  {
                  
$url $pg 1;
                  echo 
"<a href='".$_SERVER[PHP_SELF]."?pg=".$url."'><font face='Arial' size='1' color='#FF0000'><strong>&laquo;Anterior</strong></font></a>&nbsp;";
                  }
                  else {
                  echo 
"";
                  }
                  for (
$i 0$i<($pages 1); $i++) {
                  if (
$i == $pg) {
                  echo 
"<font face='Tahoma' size=1 color='#003366'><strong>".($i+1)."&nbsp;</strong></font>";
                  }
                  else {
                  echo 
"<a href='".$_SERVER[PHP_SELF]."?pg=".$i."'><font face='Arial' size='1' color='#FF0000'><strong>".($i+1)."</strong></font></a>&nbsp;";
                  }
                  }
                  if (
$pg $pages) {
                  
$url $pg 1;
                  echo 
"<a href='".$_SERVER[PHP_SELF]."?pg=".$url."'><font face='Arial' size='1' color='#FF0000'><strong>Siguiente&raquo;</strong></font></a>";
                  }
                  else {
                  echo 
" ";
                  }
                  echo 
"</div>";
                  
                  }
                  
                  
# comprobamos que no nos ha devuelto ningun resultado
                  
                  
if($vacio=mysql_num_rows($contarok)==0){
                   echo 
"<br><br><font face='arial' size='1'><strong>No se han encontrado coincidencias con la cadena <font color='#FF0000'>".$BUSCADOR."</font>.</strong></font>";
                   }
                                                         
                                                                                                                   
                  
# cerramos la conexión

                  
mysql_close();
                  
?> 
  #2 (permalink)  
Antiguo 24/07/2003, 13:54
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

¿Que es $secuencia_total o de donde sale ese valor? Parece que estas haciendo una especie de busqueda, ¿llamas a este script desde un formulario? Si es asi, le estas pasando un(os) parametro(s) al script inicialmente que no estas pasando por el link de la paginacion. Debes propagar esos valores por el link. Suponiendo que el parametro es ese $secuencia_total, tendrias que modificar los links de paginacion para propagarlo:
Código PHP:
echo "<a href='".$_SERVER[PHP_SELF]."?pg=".$url."&secuencia_total=".$secuencia_total."'><font face='Arial' size='1' color='#FF0000'><strong>&laquo;Anterior</strong></font></a>&nbsp;"
y asi con el resto de links. Si eran otros los parametros que pasabas desde el formulario, deberias propagarlos de igual forma &nombre_parametro=valor_parametro . Si recoges esos valores con $_POST cuando lo lees del formulario, recuerda que los que pases con link lo debes recoger con $_GET (aunque por tu codigo parece que tienes register globals a on).

Espero haber sido de ayuda.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 24/07/2003, 14:45
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 21 años, 5 meses
Puntos: 2
Hola Josemi, a continuación te pego todo el código para que puedas evuluarlo mejor, gracias por tu interes.

Código PHP:
   // obtener el array de un string .. Usamos el espacio como separador o identenficador de palabras.
                   
$array_palabras=explode(" ",$_POST['BUSCADOR']);
                   
                   
//contar el total de "palabras" q tiene el string (el total de elementos del array)
                   
$total_palabras=count($array_palabras)-1;

                   
// se recorre el array generado por el explode ..
                   
for ($indice=0$indice<=$total_palabras$indice++){
                   
$secuencia_buscar="Claves LIKE '%".$array_palabras[$indice]."%'";
                  
                   
// se mira si es la ultima palabra a poner . en tal caso no se pone el OR ..
                   
if ($indice $total_palabras){
                   
$condicion=" OR ";
                   } else {
                   
$condicion="";
                   }
                  
                  
// se concatena (he de ahí el .= la secuencia anterior con el comando de la condicion ..
                  
$secuencia_total .= $secuencia_buscar.$condicion;
                  }
                  
                  
                  
# definimos las variables iniciales de la paginación
                   
if (!isset($pg))
                   
$pg 0// $pg es la pagina actual
                   
$cantidad=4// cantidad de resultados por página
                   
$inicial $pg $cantidad;
                  
                 
                  
// se concatena la secuencias de campo LIKE '%palabra%' AND .. con el SQL
                  // si hace falta mas parámetros o condiciones .. añadir al final ...
                  
$sql "SELECT * FROM $tabla WHERE ".$secuencia_total." ORDER BY Titulo LIMIT $inicial,$cantidad";

                   
                                                
                   
# establecemos el criterio de seleccion
                   
$resultado mysql_query($sql$conexion) or die ("Error en la consulta:\n<br><b>$sql</b><br>\nMySQL dice: ".mysql_error());
                   
                   
                   
# contamos todos los registros de la tabla
                   
$contar "SELECT * FROM $tabla WHERE ".$secuencia_total." ORDER BY Titulo"
                   
$contarokmysql_query($contar$conexion);
                   
$total_records mysql_num_rows($contarok);
                   
$pages intval($total_records $cantidad);


                   
# CREAMOS UNA CABEZERA DE UNA TABLA (codigo HTML)

                   
echo "<table width='90%'cellpadding='0' cellspacing='0' align=center bgcolor='#EFEFEF' border=0>";

                   
# establecemos un bucle que recoge en un array
                   # cada una de las LINEAS DEL RESULTADO DE LA CONSULTA
                   # utilizamos en esta ocasión <<myslq_fetch_array>>
                   # recuerda que esta ultima función devuelve un array escalar
                   # y otro asociativo con los resultados
                   
                   
while ($encontrados mysql_fetch_array($resultado)){
                   echo 
"<tr><td height='20'>&nbsp;</td></tr>";
                   echo 
"<tr><td height='20' valign='middle' bgcolor='#003366'>&nbsp;<font face='arial' size='1'><strong><a href='".$encontrados['Url']."'>".$encontrados['Titulo']."</a></strong></font></td></tr>";
                   echo 
"<tr><td></td></tr>";
                   echo 
"<tr><td><font face='arial' size='1'><strong>".$encontrados['Descripcion'].".</strong></font></td></tr>";
                   echo 
"<tr><td><br></td></tr>";
                   }
                   echo 
"</table>";
                   
                  
                  
# filtramos mediante un if (){...}else{... que no haya menos de 11 registros para no hacer la paginación 
                  
if ($pages 1){
                  echo 
"";
                  }else{                    
                  
                  
# creando los enlaces de paginación
                  
echo "<br><div align='center'><font face='Tahoma' size='1' color='#003366'><strong>Página de resultados</strong></font></div><div align='center'>";
                  if (
$pg <> 0)
                  {
                  
$url $pg 1;
                  echo 
"<a href='".$_SERVER[PHP_SELF]."?pg=".$url."'><font face='Arial' size='1' color='#FF0000'><strong>&laquo;Anterior</strong></font></a>&nbsp;";
                  }
                  else {
                  echo 
"";
                  }
                  for (
$i 0$i<($pages 1); $i++) {
                  if (
$i == $pg) {
                  echo 
"<font face='Tahoma' size=1 color='#003366'><strong>".($i+1)."&nbsp;</strong></font>";
                  }
                  else {
                  echo 
"<a href='".$_SERVER[PHP_SELF]."?pg=".$i."'><font face='Arial' size='1' color='#FF0000'><strong>".($i+1)."</strong></font></a>&nbsp;";
                  }
                  }
                  if (
$pg $pages) {
                  
$url $pg 1;
                  echo 
"<a href='".$_SERVER[PHP_SELF]."?pg=".$url."'><font face='Arial' size='1' color='#FF0000'><strong>Siguiente&raquo;</strong></font></a>";
                  }
                  else {
                  echo 
" ";
                  }
                  echo 
"</div>";
                  
                  }
                  
                  
# comprobamos que no nos ha devuelto ningun resultado
                  
                  
if($vacio=mysql_num_rows($contarok)==0){
                   echo 
"<br><br><font face='arial' size='1'><strong>No se han encontrado coincidencias con la cadena <font color='#FF0000'>".$BUSCADOR."</font>.</strong></font>";
                   }
                                                         
                                                                                                                   
                  
# cerramos la conexión

                  
mysql_close();
                  
?> 

Un saludo.
  #4 (permalink)  
Antiguo 24/07/2003, 15:10
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Bueno, es lo que te he comentado antes. El parametro que debes propagar por la URL es BUSCADOR (el nombre de tu campo en el formulario. Como cuando lleges a la pagina de resultados desde el formulario lo tendras en $_POST, pero cuando lleges desde la URL lo tendras en $_GET, debes sustituir:
Código PHP:
 $array_palabras=explode(" ",$_POST['BUSCADOR']); 
por
Código PHP:
$palabras_buscador=(isset($_POST['BUSCADOR'])?$_POST['BUSCADOR']:$_GET['BUSCADOR'];  // el operador ternario ?: es como un if ... else ...
 
$array_palabras=explode(" ",$palabras_buscador); 
y luego en tus links poner:
Código PHP:
 echo "<a href='".$_SERVER[PHP_SELF]."?pg=".$url."&BUSCADOR=".urlencode($palabras_buscador)."'><font face='Arial' size='1' color='#FF0000'><strong>&laquo;Anterior</strong></font></a>&nbsp;"
Si en alguna otra parte del codigo posterior al explode usabas $_POST['BUSCADOR'], debes sustituirlo por $palabras_buscador. Mira urlencode() (www.php.net/urlencode) es para poder pasar bien los espacios por URL.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 24/07/2003, 15:15
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 21 años, 5 meses
Puntos: 2
Ok gracias Josemi,


Un saludo.
  #6 (permalink)  
Antiguo 24/07/2003, 16:55
 
Fecha de Ingreso: noviembre-2002
Mensajes: 571
Antigüedad: 21 años, 5 meses
Puntos: 2
Hola Josemi, gracias a ti consegui que me creará los indices correctamente cuando avanzaba o retrocedica por el indice de la paginación, ahora me ha surgido otro problema al cual tampoco le encuentro mucha explicación..., el problema es que si pongo por ejemplo el limite en 4 registros por página y por ejemplo me encuentra 8 me crea bien los indices de paginacion pero el ultimo que en este caso sería el 3 esta vacio...,
es decir no tiene ningun link ya que los 8 registros encontrados los ha devuelto en las 2 primeras páginas, en cambio si encuentra 9 o 7 registros me los creas perfecto..., me podrías decir como puedo modificar el código para que no me produzca este error???

Gracias desde ya!!!

Un saludo.
  #7 (permalink)  
Antiguo 24/07/2003, 17:17
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

Supongo que el problema esta en que usas:
Código PHP:
$pages intval($total_records $cantidad); 
y luego en el bucle recorres desde 0 hasta $pages+1. Asi, 8/4=2, 4/4=1 y recorres para 8 la pagina 0,1,2, pero 7/4=1.8=1, y recorres 0, 1. Normalmente se usa la funcion ceil() en lugar de intval y luego en el for recorrer hasta $pages:
Código PHP:
$pages ceil($total_records $cantidad);

// ....

for ($i 0$i<$pages$i++) {

                  if (
$i == $pg) { 
Asi, ceil(2)=2, ceil(1.8)=2, ceil(1)=1, ...

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:48.