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

que tal forer@s!!!

Estoy tratando de optimizar y mejorar una consulta dinamica que voy armando depende de las variables que me manden, espero que me puedan aconsejar y dar su punto vista sobre mi codigo y si se puede mejorar se los agradecere.

Veran, tengo un formulario con los siguientes campos:

año: [combo de años desde 1990 a 2012]
trimestre: [combo de los 4 trimestres del año]
o Seleccione la fecha: [input con formato de fecha 2012-10-29]

después puede haber o no (uno o muchos) los siguientes combos:

Estatus: [combo con los valores, por ejemplo: en mantenimiento, acabado]
Tipo: [combo con los valores, por ejemplo: mantenimiento, soporte]
...pueden haber mas combos o uno o ninguno => los valores estos combos los meto en un arreglo, por ejemplo si tengo dos combos queda, dependiendo de la opción que elijan [1,2]

entonces mis parámetros son:

año, trimestre, fecha y arreglo de combos (en todos los campos si no son seleccionados se les pone el valor s por default)

por el momento la consulta la hago con la siguiente lógica:

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. if($fecha!="s"){ //si el input de fecha no esta vació
  11.    $query .= "fecha='$fecha' ";
  12. } else{
  13.     //si el usuario elige año y trimestre
  14.     if($anio!="s" && $trim!="s"){
  15.          //entonces yo armo la fecha de inicio y la fecha final en base al trimestre correspondiente
  16.          $trim = explode("/",$trim); //recibo el trimestre: mm-dd/mm-dd
  17.          $trim_ini = $trim[0];
  18.          $trim_fin = $trim[1];
  19.          $fecha_ini = $anio."-".$trim_ini;
  20.          $fecha_fin = $anio."-".$trim_fin;
  21.          //hago la condición de la consulta
  22.          $query .= "fecha between '$fecha_ini' and '$fecha_fin' ";
  23.    }
  24.    else{
  25.        //si solo eligio el año
  26.        if($anio!="s"){
  27.             $query .= "left(fecha, 4)='$anio' ";
  28.        }
  29.    }
  30. }
  31. ?>

ahora si el arreglo es diferente de s, que significa que esta vacio, a lo anterior le sumo:

Código PHP:
Ver original
  1. <?php
  2. $clase = explode(",",$clases);
  3. $NroClases = count($clase)
  4.     for($i=0;$i<$NroClases;$i++){
  5.     if($clase[$i]!="s"){
  6.         $query .= " and ";
  7.         $query .= "clase='".$clase[$i]."' ";
  8.     }
  9. }
  10.  
  11. //finalmente
  12. $query .= "order by id ASC";
  13. $rs3 = mysql_query($query) or die(mysql_error());
  14. while($row3 = mysql_fetch_array($rs3, MYSQL_ASSOC)){
  15.       //imprimo los valores
  16.       echo $row3['id'];
  17.       ....
  18. }
  19. ?>

Bueno los detalles que le veo a mi código actualmente es que la consulta forzosamente tiene que pasar por tener fecha o año para desplegar la consulta, es decir si yo quiero consultar solo los combos que forman el arreglo la consulta no se hace por que al armar el query les pongo que empiecen con "and" y entonces ya hay error en la sintaxis

me gustaría poder seleccionar primero cualquiera de la dos alternativas (año-trimestre/fecha o arreglo de combos) para que la consulta se lance sin problemas.

Tambien espero que me digan si habra mejor forma de hacer esto, o de optimizar mi codigo o de plano si es una aberración a la programacion lo que estoy haciendo

o si voy bien

bueno cabe aclarar que como lo tengo si funciona bien, salvo que me gustaria mejorar lo que ya les comente

gracias

Última edición por catpaw; 29/10/2012 a las 20:18