Ver Mensaje Individual
  #3 (permalink)  
Antiguo 01/11/2012, 09:51
Avatar de catpaw
catpaw
 
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años, 6 meses
Puntos: 23
Respuesta: armar consulta dinámica con múltiples parametros

hola triby gracias por tu respuesta y disculpa la tardanza de la mia,

Es verdad que usar filtros es lo mas recomendable como me planteas, pero el problema es que yo antes de armar la consulta tengo que validar las variables que llegan para decidir como crear la consulta, aunque me parece de maravilla como usaste el implode

pues resulta que hice algunos cambios y ya me da el resultado que esperaba, aunque sigo con mis dudas sobre la programacion, en fin hice lo siguiente:

En la primer parte hice un pequeño cambio, en lugar de concatenar en la cadena que guarda la consulta, concateno en una cadena auxiliar

Código PHP:
Ver original
  1. <?php
  2. //recibo variables
  3. $fecha = $_GET['fecha'];
  4. $anio = $_GET['anio'];
  5. $trim = $_GET['trim'];
  6. $clases = $_GET['clases']; //arreglo
  7.  
  8. $query = "select * from tabla where id='$id' and "; //esta linea siempre sera igual
  9.  
  10. $cad1 = ""; //cadena auxiliar 1
  11. if($fecha!="s"){ //si el input de fecha no esta vació
  12.    $cad1 .= "fecha='$fecha' ";
  13. } else{
  14.     //si el usuario elige año y trimestre
  15.     if($anio!="s" && $trim!="s"){
  16.          //entonces yo armo la fecha de inicio y la fecha final en base al trimestre correspondiente
  17.          $trim = explode("/",$trim); //recibo el trimestre: mm-dd/mm-dd
  18.          $trim_ini = $trim[0];
  19.          $trim_fin = $trim[1];
  20.          $fecha_ini = $anio."-".$trim_ini;
  21.          $fecha_fin = $anio."-".$trim_fin;
  22.          //hago la condición de la consulta
  23.          $cad1 .= "fecha between '$fecha_ini' and '$fecha_fin' ";
  24.    }
  25.    else{
  26.        //si solo eligio el año
  27.        if($anio!="s"){
  28.             $cad1 .= "left(fecha, 4)='$anio' ";
  29.        }
  30.    }
  31. }
  32. ?>

el problema era como armaba la segunda parte, que estaba atenida a la primera, por lo que, agregue una segunda cadena auxiliar para concatenar la parte de los arreglos:

Código PHP:
Ver original
  1. <?php
  2. $clase = explode(",",$clases);
  3.  
  4. $cad2 = ""; //cadena auxiliar 2
  5. $NroClases = count($clase); //cuantos valores trae el arreglo
  6. if($NroClases!="0"){ //si el arreglo no esta vacio
  7.     for($i=0;$i<$NroClases;$i++){
  8.         if($clase[$i]!="s"){
  9.             //concateno en la cadena auxiliar
  10.             $cad2 .= "id_".$array_clases[$i]."='".$clase[$i]."' ";
  11.             $cad2 .= "and ";
  12.         }    
  13.     }
  14.     $cad2 = substr($cad2,0, -4); //le quito el ultimo and    
  15. }
  16.  
  17. //armo la otra parte del where de la consulta dependiendo de si hay cad1 y/o cad2
  18. if($cad1!="" && $cad2!=""){
  19.     $query .= $cad1." and ".$cad2;
  20. } else{
  21.     if($cad1!="" && $cad2==""){
  22.         $query .= $cad1;
  23.     } else{
  24.         if($cad2!="" && $cad1==""){
  25.             $query .= $cad2;
  26.         }
  27.     }
  28. }
  29.  
  30. //concluyo la consulta con un order by
  31. $query .= " order by id_arch ASC";
  32.  
  33. $rs3 = mysql_query($query) or die(mysql_error());
  34. while($row3 = mysql_fetch_array($rs3, MYSQL_ASSOC)){
  35.       //imprimo los valores
  36.       echo $row3['id'];
  37.       ....
  38. }
  39. ?>

Con esos cambios ya se hace la consulta ya sea con los primeros parámetros que recibo (fecha o año y/o trimestre) o con los parámetros del arreglo

Aunque para otros casos la solución idónea debería ser como lo planteas Triby gracias