Foros del Web » Programando para Internet » PHP »

problema paginación y búsqueda

Estas en el tema de problema paginación y búsqueda en el foro de PHP en Foros del Web. Hola amigos, espero que me puedan ayudar. Supongo que mi problema tiene que ser una tontería pero algo se me está pasando por alto. Tengo ...
  #1 (permalink)  
Antiguo 14/11/2010, 12:40
 
Fecha de Ingreso: abril-2009
Mensajes: 233
Antigüedad: 15 años
Puntos: 5
problema paginación y búsqueda

Hola amigos, espero que me puedan ayudar. Supongo que mi problema tiene que ser una tontería pero algo se me está pasando por alto.

Tengo este código de paginación que funciona perfecto, el problema es que me muestra todas las páginas de anuncios que tengo dentro de una tabla de la base de datos (pg: 1,2,3,4...) y yo quiero que me muestre solo los anuncios que le he pasado por un cuadro de búsqueda, es decir que si hay un total de 40 y me muestra diez página (4 páginas), pero que cuando yo haga una búsqueda y solo haya 20 anuncios para esa bésqueda me muestre solo 2 páginas, no como ahora que me muestra 2 página llenas y otras 2 vacias, ya que no hay anuncios para esas dos páginas.

Espero haberme explicado...si no me han entendido pregunten sin problemas!

Código PHP:
<?php

# aqui se extrae la cantidad de registros totales
$rsC mysql_query("Select count(*) from coches");
$resultC mysql_fetch_array($rsC);
$count $resultC[0];
 
# Aqui se pone la cantidad de registros por pagina
# que se quieren mostrar
$hasta 10;
 
if(
$pag==""){
 
$desde 0;
 
$pag 1;    
}
else{
 
$pag $_GET["pag"];
 
$pagS $pag 1;
 
$desde $hasta $pagS;    
}


if(
$_GET["pag"]>=1){
$rs mysql_query("select * from coches INNER JOIN ciudades ON coches.idciudad = ciudades.idciudad INNER JOIN marcas ON coches.idmarca = marcas.idmarca INNER JOIN modelos ON coches.idmodelo = modelos.idmodelo WHERE coches.idmarca = $_SESSION[marca] AND coches.idciudad = $_SESSION[ciudad] AND precio>= $_SESSION[precio1] AND precio<= $_SESSION[precio2] limit $desde,$hasta");    
while(
$registro=mysql_fetch_array($rs)){
     
$nombre $registro['imagen1']; 
$id $registro['id']; 
$idmarca $registro['idmarca'];
?>

<div id="cada_coche">

<img style="border:1px solid #D5D5D5;" align=left height="60" width="80" vspace="4" hspace="10"src="/anunciar-coches/upload/<?php echo $nombre;?>" width="100" height="75"/>
<b><a href="/coches-de-segunda-mano/detalle-coche.php?id_coche=<?php echo $id;?>">Coche&nbsp;<?php echo $registro['marca']; ?>&nbsp;<?php echo $registro['modelo']; ?>&nbsp;de segunda mano&nbsp;-&nbsp;<?php echo htmlentities($registro['ciudad']); ?></a></b><br>
Precio:&nbsp;<?php echo $registro['precio']; ?>&nbsp;&euro;&nbsp;
Fecha:&nbsp;<?php echo $registro['date']; ?>&nbsp;<br>
<?php
// Inicializamos las variables
$tamano 75// tamaño máximo
$contador 0;
$texto htmlentities($registro['descripcion']);
 
// Cortamos la cadena por los espacios
$arrayTexto split(' ',$texto);
$texto '';
 
// Reconstruimos la cadena
while($tamano >= strlen($texto) + strlen($arrayTexto[$contador])){
    
$texto .= ' '.$arrayTexto[$contador];
    
$contador++;
}
echo 
$texto?>...
</div>
<br><br><br><br>

<?php
 

}else{    

$idmarca $_POST['marca'];
$_SESSION["marca"] = $idmarca

$idciudad $_POST['ciudad'];
$_SESSION["ciudad"] = $idciudad;

$precio $_POST['precio1'];
$_SESSION["precio1"] = $precio

$precio $_POST['precio2'];
$_SESSION["precio2"] = $precio
        
$rs mysql_query("select * from coches INNER JOIN ciudades ON coches.idciudad = ciudades.idciudad INNER JOIN marcas ON coches.idmarca = marcas.idmarca INNER JOIN modelos ON coches.idmodelo = modelos.idmodelo WHERE coches.idmarca = '$idmarca' AND coches.idciudad = '$idciudad' AND precio>='$precio1' AND precio<='$precio2' limit $desde,$hasta");
while(
$registro=mysql_fetch_array($rs)){

$nombre $registro['imagen1']; 
$id $registro['id']; 
$idmarca $registro['idmarca'];
?>

<div id="cada_coche">

<img style="border:1px solid #D5D5D5;" align=left height="60" width="80" vspace="4" hspace="10"src="/anunciar-coches/upload/<?php echo $nombre;?>" width="100" height="75"/>
<b><a href="/coches-de-segunda-mano/detalle-coche.php?id_coche=<?php echo $id;?>">Coche&nbsp;<?php echo $registro['marca']; ?>&nbsp;<?php echo $registro['modelo']; ?>&nbsp;de segunda mano&nbsp;-&nbsp;<?php echo htmlentities($registro['ciudad']); ?></a></b><br>
Precio:&nbsp;<?php echo $registro['precio']; ?>&nbsp;&euro;&nbsp;
Fecha:&nbsp;<?php echo $registro['date']; ?>&nbsp;<br>
<?php
// Inicializamos las variables
$tamano 75// tamaño máximo
$contador 0;
$texto htmlentities($registro['descripcion']);
 
// Cortamos la cadena por los espacios
$arrayTexto split(' ',$texto);
$texto '';
 
// Reconstruimos la cadena
while($tamano >= strlen($texto) + strlen($arrayTexto[$contador])){
    
$texto .= ' '.$arrayTexto[$contador];
    
$contador++;
}
echo 
$texto?>...
</div>
<br><br><br><br>

<?php
  
}
 }
mysql_close($link);
?>

<?php
# aqui se llama a la funcion que muestra los links por paginas
# la variable $extra_variables es para anexar mas variables al url
# si es necesario para los querys que hagan.
# Solo se debe concatenar los datos nombre1=valor1&nombre2=value2
# NOTA: puede ubicar en cualquier parte de su codigo esta funcion
# para que aparesca dentro de la celda que desee.
# link totales es una variable al ser definida le dices a la funcion
# cuantos links quieres que aparescan por pantalla ya que si tienes
# 100 paginas no deberas ver los 100 links y solo muestres los necesarios
$link_totales 4;
# se llama la funcion paginar
# los links si tiene un css podran tomar la estructura y color que le pongas
## Inicia Paginador
paginar($count,$hasta,$pag,$link_totales,$extra_variables);
 
# Funcion paginar
# Inicia
function paginar($count,$hasta,$pag,$link_totales,$extra_variables){
    if(
$link_totales==1)$link_totales=2;
    
$links $count $hasta;
    
$arriba $link_totales 2;
    
$abajo $pag 1;
    if(
$abajo==0)$abajo 1;
    
$temp_r $links $pag;
    if(
$temp_r>=$arriba){
     
$link_break $pag $arriba;
    }
    else{
     
$link_break $links;
     
$abajo $pag $arriba;
     if(
$pag==$links-1)$abajo $pag $arriba;
     if(
$pag==$links)$abajo $pag $arriba;
    }
 
    if(
$pag==1)$link_break $link_totales;
    if(
$abajo==0)$abajo=1;
    if(
strlen($extra_variables)!=0$extra_variables "&".$extra_variables;
 
    if(
$pag==1){
     
$anterior 1;    
    }
    else{
    
$anterior $pag 1;    
    }
    if(
$pag!=1){
    echo 
"<a href=".$_SERVER['PHP_SELF']."?pag=".$anterior.$extra_variables."><< Anterior | </a>";
    }
 
    for(
$i=$abajo;$i<=$links;$i++){
     if(
$link_break<$i){
      break;
     }
     else{
        if(
$pag==$i){
        echo 
$i." | ";    
        }
        else{
        echo 
"<a href='".$_SERVER['PHP_SELF']."?pag=".$i.$extra_variables."'>";
        echo 
$i;
        echo 
" | </a>";
        }
     }
    }
    if(
$pag==$links){
    
$siguiente $links;
    }
    else{
    
$siguiente $pag 1;
    }
    if(
$pag!=$links){
    echo 
"<a href=".$_SERVER['PHP_SELF']."?pag=".$siguiente.$extra_variables.">Siguiente >></a>";
    }
}
?>
Saludos y gracias!
  #2 (permalink)  
Antiguo 14/11/2010, 12:43
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 16 años, 6 meses
Puntos: 48
Respuesta: problema paginación y búsqueda

En

Código PHP:
$rsC mysql_query("Select count(*) from coches"); 
obtienes el total de registros que hay en la tabla coches, pero tu debes calcular el total en base al filtro de búsqueda, para que así obtengas el total de registros de la consulta que realizo el usuario.

Saludos!
__________________
El problema de nuestra época consiste en que sus hombres no quieren ser útiles sino importantes.

Winston Churchill
  #3 (permalink)  
Antiguo 14/11/2010, 12:54
 
Fecha de Ingreso: abril-2009
Mensajes: 233
Antigüedad: 15 años
Puntos: 5
Respuesta: problema paginación y búsqueda

Es lo que he probado de esta forma:

Código PHP:
$rsC mysql_query("Select count($_SESSION[marca], $_SESSION[ciudad], $_SESSION[precio1], $_SESSION[precio2]) from coches"); 
Pero me sigue mostrando las mismas páginas...
Alguna idea de porque? o que hago mal?
  #4 (permalink)  
Antiguo 14/11/2010, 13:49
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: problema paginación y búsqueda

Prueba con esto:

Código PHP:
$rsC mysql_query("Select count() from coches WHERE coches.idmarca = " $_SESSION[marca] . " AND coches.idciudad = " $_SESSION[ciudad] . "  AND precio>=" .  $_SESSION[precio1] . " AND precio<=" $_SESSION[precio2]); 
En remplazo de:
Código PHP:
$rsC mysql_query("Select count(*) from coches"); 
  #5 (permalink)  
Antiguo 14/11/2010, 14:08
 
Fecha de Ingreso: abril-2009
Mensajes: 233
Antigüedad: 15 años
Puntos: 5
Respuesta: problema paginación y búsqueda

He probado tal cual has dicho y me da el siguiente error:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/ernesto/public_html/coches-de-segunda-mano/anuncios-coches.php on line 203

He probado a cambiar varias y sigue sin funcionar...pero tengo una duda, si no ponemos nada dentro de count() como va a saber cuantas páginas mostrar? si no le damos nada a count()?
  #6 (permalink)  
Antiguo 14/11/2010, 14:10
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: problema paginación y búsqueda

Cierto, he olvidado incluir el asterisco dentro de count(), prueba añadiéndolo.
  #7 (permalink)  
Antiguo 14/11/2010, 14:39
 
Fecha de Ingreso: abril-2009
Mensajes: 233
Antigüedad: 15 años
Puntos: 5
Respuesta: problema paginación y búsqueda

Ahora funciona a media...para explicarme mejor acudir por favor, acudir a esta página e intentar realizar una busqueda, da igual que no haya resultados, siempre sale, 1,2,siguiente...

Dejo el link para que lo veáis por vosotros mismo:

http://cochesyocasion.com/coches-de-...ios-coches.php

No entiendo donde está el fallo...
  #8 (permalink)  
Antiguo 14/11/2010, 15:19
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: problema paginación y búsqueda

¿que valor devuelve $count?
No he revisado tu función de paginar, puede que ahí este el problema.
  #9 (permalink)  
Antiguo 14/11/2010, 15:32
 
Fecha de Ingreso: abril-2009
Mensajes: 233
Antigüedad: 15 años
Puntos: 5
Respuesta: problema paginación y búsqueda

El problema no es del count, devuel los resultados correctos...es decir si para esa búsqueda hay 23 anuncios devuelve 23 anuncios...pero sin embargo la paginación es lo que falla...intentaré leer el código con detenimiento!

Muchas gracias de todas formas, me has ayudado mucho con el count()!
  #10 (permalink)  
Antiguo 14/11/2010, 15:38
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: problema paginación y búsqueda

Simplifique un poco la función paginar, creo que funciona bien (aun que no entiendo para que sirve $link_totales)

Código PHP:
function paginar($count,$hasta,$pag,$link_totales,$extra_variables){ 

    
$totpag $count/$hasta;

    if(
$pag 1){
        
$anterior $pag-1
        
echo "<a href='" $_SERVER['PHP_SELF'] . "?pag=$anterior$extra_variables'><< Anterior</a> | ";
    }

    for(
$i=1$i<=$count,$i++){
        echo 
"<a href='" $_SERVER['PHP_SELF'] . "?pag=$i$extra_variables'>$i</a> | ";
    }

    if(
$pag $totpag){
        
$siguiente $pag+1
        
echo "<a href='" $_SERVER['PHP_SELF'] . "?pag=$anterior$extra_variables'>Siguiente >></a> | ";
    }


  #11 (permalink)  
Antiguo 14/11/2010, 16:01
 
Fecha de Ingreso: noviembre-2010
Ubicación: /home/RD/Villa_Altagracia
Mensajes: 18
Antigüedad: 13 años, 5 meses
Puntos: 4
Respuesta: problema paginación y búsqueda

Cita:
Iniciado por arquidea Ver Mensaje
Hola amigos, espero que me puedan ayudar. Supongo que mi problema tiene que ser una tontería pero algo se me está pasando por alto....

Saludos y gracias!
Nota: estuve revisando tu site, y tiene por defecto listar los dirrectorios, deberias restringir esto asi te evitas los hacks que pueden aver, si quieres prueba entrar a esta dirrecion

http://cochesyocasion.com/coches-de-segunda-mano/

puedes hacer con .httacces o podrias para mas seguridad agregarle un index.html vacio a cada subdirectorio
  #12 (permalink)  
Antiguo 14/11/2010, 16:17
 
Fecha de Ingreso: abril-2009
Mensajes: 233
Antigüedad: 15 años
Puntos: 5
Respuesta: problema paginación y búsqueda

xcorpion, he probado tu código y me daba errores de punto y coma, una vez los he colocado me muestra 23 páginas en la paginación... (1,2,3,4,5,6,7.....23,siguiente)

Código PHP:
function paginar($count,$hasta,$pag,$link_totales,$extra_variables){ 

    
$totpag $count/$hasta;

    if(
$pag 1){
        
$anterior $pag-1;
        echo 
"<a href='" $_SERVER['PHP_SELF'] . "?pag=$anterior$extra_variables'><< Anterior</a> | ";
    }

    for(
$i=1$i<=$count$i++){
        echo 
"<a href='" $_SERVER['PHP_SELF'] . "?pag=$i$extra_variables'>$i</a> | ";
    }

    if(
$pag $totpag){
        
$siguiente $pag+1;
        echo 
"<a href='" $_SERVER['PHP_SELF'] . "?pag=$anterior$extra_variables'>Siguiente >></a> | ";
    }




Para acidlake:

Muchas gracias por avisarme, la verdad es que de momento me centro en que todo funcione y luego lo antes posible restringiré el listar los directorios!
  #13 (permalink)  
Antiguo 14/11/2010, 16:20
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: problema paginación y búsqueda

Ya veo donde esta el error, que tonto soy :P

En esta linea:
for($i=1; $i<=$count; $i++){

cambia $count por $totpag

$totpag es el numero total de paginas(calculado asi: $totpag = $count/$hasta)
  #14 (permalink)  
Antiguo 14/11/2010, 16:28
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: problema paginación y búsqueda

Cambia tambien esta linea para redondear fracciones hacia arriba:

$totpag = $count/$hasta;

por:

$totpag = ceil($count/$hasta);


Que mal programo cuando lo hago deprisa :P
  #15 (permalink)  
Antiguo 14/11/2010, 16:30
 
Fecha de Ingreso: abril-2009
Mensajes: 233
Antigüedad: 15 años
Puntos: 5
Respuesta: problema paginación y búsqueda

Sigue sin funcionar...no te preocupes, me lo revisaré entero con tranquilidad de arriba abajo y te comento!
  #16 (permalink)  
Antiguo 14/11/2010, 16:32
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: problema paginación y búsqueda

Si redondeaste con ceil()
  #17 (permalink)  
Antiguo 14/11/2010, 16:36
 
Fecha de Ingreso: abril-2009
Mensajes: 233
Antigüedad: 15 años
Puntos: 5
Respuesta: problema paginación y búsqueda

Eres un maestro!!!!!!

Ya funciona a la perfección!

Ese xcorpion para moderador! ese xcorpion para moderador!!


Jejejeje muchas gracias amigo, de verdad!
  #18 (permalink)  
Antiguo 14/11/2010, 16:37
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: problema paginación y búsqueda

Gracias por las porras jeje :P
  #19 (permalink)  
Antiguo 14/11/2010, 16:57
Avatar de jaao_death  
Fecha de Ingreso: abril-2009
Ubicación: Murcia/españa
Mensajes: 229
Antigüedad: 15 años
Puntos: 6
Respuesta: problema paginación y búsqueda

les recuerdo que el total de páginas es igual a:

($cantanunc / $numdeanuncporpag) + ((($cantanunc % $numdeanuncporpag)>0)? 1:0);

no olviden que la divición no es exacta, pero hay que rescatar los anuncios que quedan sueltos, no desecharlos (se supone que todos tienen la misma importancia).

EDITO: sorry, con ceil te ahorras el trabajo, no leí todo.. jejej (no borro para que la gente aprenda de los errores y de las alternativas)
__________________
Mucha seguridad nunca es suficiente.... Por una red segura
El señor ilustre obscurece nuestras mentes
Usas Linux? http://www.dudalibre.com/gnulinuxcounter

Etiquetas: Ninguno
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 16:24.