Foros del Web » Programando para Internet » PHP »

muchas opciones con poco codigo??

Estas en el tema de muchas opciones con poco codigo?? en el foro de PHP en Foros del Web. Que tal forer@s: resulta que estoy haciendo unos reportes y para esto tengo 5 combos, se supone que la mecanica de generar la consulta es ...
  #1 (permalink)  
Antiguo 18/10/2010, 12:56
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
muchas opciones con poco codigo??

Que tal forer@s:

resulta que estoy haciendo unos reportes y para esto tengo 5 combos, se supone que la mecanica de generar la consulta es la siguiente:

1. Si se oprime el boton enviar sin haber elegido alguna opcion de los combos, el resultado de la consulta debe traer todos los registros almacenados
2. Si se oprime una opcion de las 5, el resultado de la consulta debera regresar solo el los valores q cumplan con la opcion seleccionada (es decir en el where algo='$opcion')
3. Si se oprimen dos opciones, el resultado debera regresar los resultados q cumplan con las dos opciones seleccionadas (where algo='$opcion1' AND otro='opcion2')
4. Asi por las opciones q se seleccionen, si se seleccionaron las 5 pues el where tendra las 5 condiciones

El problema viene al saber que al tener 5 opciones las combinaciones que se producen son 25... y no quiero hacer 25 if para comprobar que opciones si se seleccionaron y cuales no, por que es muy tedioso y el codigo muy extenso
Entonces quisiera ver la opcion de que a alguien se le ocurra una mejor manera para comprobar q opciones se seleccionaron y en base a eso lanzar la consulta.
Este es el codigo que llevo... hasta ahora solo comprueba si no se seleccionaron las 5 opciones y si no se selecciono una pero las demas si:

Código PHP:
//aca recibo los valores de los 5 combos
$soctrim($_GET['soc']);
$divtrim($_GET['div']);
$cecotrim($_GET['ceco']);
$clasetrim($_GET['clase']);
$subclasetrim($_GET['subclase']);

//si no se seleeciono nada
if($soc==NULL && $div==NULL && $ceco==NULL && $clase==NULL && $subclase==NULL){
    
$sql_query "Select * from tb_resguardo_activofijo";
}
else{
      if(
$soc==NULL && $div!=NULL && $ceco!=NULL && $clase!=NULL && $subclase!=NULL){
            
//si seleccionaron todas menos $soc
            
$sql_query "Select * from tb_resguardo_activofijo where division='$div' AND ceco='$ceco' AND clase='$clase' AND subclase='$subclase'";
      }
      else{
             if(
$soc!=NULL && $div==NULL && $ceco!=NULL && $clase!=NULL && $subclase!=NULL){
                
//si seleccionaron todas menos $div
                
$sql_query "Select * from tb_resguardo_activofijo where sociedad='$soc' AND ceco='$ceco' AND clase='$clase' AND subclase='$subclase'";
             }
             else{
                     if(
$soc!=NULL && $div!=NULL && $ceco==NULL && $clase!=NULL && $subclase!=NULL){
                    
//si seleccionaron todas menos $ceco
                    
$sql_query "Select * from tb_resguardo_activofijo where sociedad='$soc' AND division='$div' AND clase='$clase' AND subclase='$subclase'";
                     }
                     else{
                     if(
$soc!=NULL && $div!=NULL && $ceco!=NULL && $clase==NULL && $subclase!=NULL){
                        
//si seleccionaron todas menos $clase
                        
$sql_query "Select * from tb_resguardo_activofijo where sociedad='$soc' AND division='$div' AND ceco='$ceco' AND subclase='$subclase'";
                     }
                     else{
                         if(
$soc!=NULL && $div!=NULL && $ceco!=NULL && $clase!=NULL && $subclase==NULL){
                            
//si seleccionaron todas menos $subclase
                            
$sql_query "Select * from tb_resguardo_activofijo where sociedad='$soc' AND division='$div' AND ceco='$ceco' AND clase='$clase'";
                         }
                      }
                }
            }
        }
    }
    
$res=mysql_query($sql_query) or die('Error en la consulta'.mysql_error()); 

Última edición por catpaw; 18/10/2010 a las 13:04
  #2 (permalink)  
Antiguo 18/10/2010, 13:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: muchas opciones con poco codigo??

al ver que casi todas las consultas son parecidas lo mejor sería implementar algo mas flexible:
Código PHP:
$candy['foo'] = ! empty($_GET['foo'])? $_GET['foo']: '';
$candy['bar'] = ! empty($_GET['bar'])? $_GET['bar']: '';

$where = array();
foreach (
$candy as $key => $val)
{
  if (
strlen(trim($val)) === 0) continue;
  if ( ! 
is_numeric($val)) $val "'$val'";
  
$where []= "`$key`=$val";
}

$sql "SELECT * FROM tabla\n";
if ( ! empty(
$where)) $sql .= "WHERE\n" join("\nAND\n"$where); 
la idea es sencilla:

- estableces un arreglo con clave/valor que serían los nombres de columna/valores recibidos
- iteras tu arreglo y mientras algún valor no venga vacío lo agregamos como comparación WHERE

finalmente unimos las condiciones a la consulta de SQL original, ojala te oriente un poco...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 18/10/2010 a las 13:26 Razón: olvide el AND
  #3 (permalink)  
Antiguo 18/10/2010, 13:15
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: muchas opciones con poco codigo??

Hola cat, en realidad sólo necesitas hacer 5 lineas de código. Supongamos que ya tienes tu form con las opciones y que se mandan por $_POST, cada opcion seleccionada aplica un filtro. En el script que recoge los valores haces algo así, digamos que estamos seleccionando usarios de una tabla:


Código PHP:
<?PHP
$and 
"";
if(isset(
$_POST['jefe'])) $and "AND usuario_jefe = '1'";
if(isset(
$_POST['admin'])) $and .= "AND usuario_esadmin = '1'";
if(isset(
$_POST['oficina'])) $and .= "AND usuario_oficina is not null";
if(isset(
$_POST['autorizado'])) $and .= "AND autorizado = '1'";
if(isset(
$_POST['nivel'])) $and .= "AND usuario_nivel > '2'";

$sql "SELECT * FROM usuarios WHERE usuario_activo = 1 $and";

?>
Cada opcion enviada alarga el string $and que finalmente se concatena con la query principal, pruebalo a ver que tal.salu2
  #4 (permalink)  
Antiguo 18/10/2010, 13:41
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: muchas opciones con poco codigo??

Woow muchas gracias a los dos no me esperaba respuestas tan rapido y tan efectivas ;)

Tomando la primera, pateketrueke, ya la pobre... funciona ok cuando selecciono una opcion pero cuando pongo 2 me manda error, ya que no esta concatenando el AND, imprimi el $sql para ver como estaba mandando la consulta:

SELECT * FROM tb_resguardo_activofijo WHERE ceco=0000046532 subclase='EQ02'

el meollo del asunto es que cuando haya solo una opcion seleccionada no concatene el AND y cuando haya mas de una si lo concatene...

Pero no se... como puedo implementar eso??

Gracias
  #5 (permalink)  
Antiguo 18/10/2010, 13:46
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: muchas opciones con poco codigo??

Cita:
Iniciado por catpaw Ver Mensaje
Tomando la primera, pateketrueke, ya la pobre... funciona ok cuando selecciono una opcion pero cuando pongo 2 me manda error, ya que no esta concatenando el AND
ya edite mi mensaje anterior, solo se debe emplear el AND al concatenar con join()
Código PHP:
$sql .= "WHERE\n" join("\nAND\n"$where); 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 18/10/2010, 13:50
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: muchas opciones con poco codigo??

Perfecto... funciona ok

Muchas gracias!!

Etiquetas: muchas, opciones
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 23:26.