Foros del Web » Programando para Internet » PHP »

Evitar tantos if

Estas en el tema de Evitar tantos if en el foro de PHP en Foros del Web. Amigos les presento una duda que tengo miren este es el caso Código PHP: if ( $_POST  ==  NULL ) {  // if NULL $q  =  $db -> query ...
  #1 (permalink)  
Antiguo 20/10/2008, 22:32
 
Fecha de Ingreso: julio-2007
Ubicación: /home/victor
Mensajes: 114
Antigüedad: 16 años, 9 meses
Puntos: 0
Evitar tantos if

Amigos les presento una duda que tengo miren este es el caso
Código PHP:
if ($_POST == NULL) { // if NULL
$q $db->query("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_est_id = 1
ORDER BY ini.ini_fecha_creacion ASC"
); 
}

if (
$_POST[filtrar]) { // if NULL
$q $db->query("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_est_id = 1
ORDER BY ini.ini_fecha_creacion ASC"
); 
}

if (
$_POST[institucion]) { // if institucion
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_inst_id = '$_POST[institucion]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[estado]) { // if estado
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_est_id = '$_POST[estado]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[region]) { // if region
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_reg_id = '$_POST[region]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[desde] and $_POST[hasta]) { // desde - hasta
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_fecha_creacion 
BETWEEN '$_POST[desde]' 
AND '$_POST[hasta]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[institucion] and $_POST[region]) { // institucion y region
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_inst_id = '$_POST[institucion]'
AND ini.ini_reg_id = '$_POST[region]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[institucion] and $_POST[estado]) { // institucion y estado
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_inst_id = '$_POST[institucion]'
AND ini.ini_est_id = '$_POST[estado]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[estado] and $_POST[region]) { // estado,region
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_reg_id = '$_POST[region]'
AND ini.ini_est_id = '$_POST[estado]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[estado] and $_POST[desde] and $_POST[hasta]) { // estado,desde,hasta
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_est_id = '$_POST[estado]'
AND ini.ini_fecha_creacion 
BETWEEN '$_POST[desde]' 
AND '$_POST[hasta]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[institucion] and $_POST[desde] and $_POST[hasta]) { // institucion,desde,hasta
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_inst_id = '$_POST[institucion]'
AND ini.ini_fecha_creacion 
BETWEEN '$_POST[desde]' 
AND '$_POST[hasta]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[region] and $_POST[desde] and $_POST[hasta]) { // institucion,desde,hasta
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_reg_id = '$_POST[region]'
AND ini.ini_fecha_creacion 
BETWEEN '$_POST[desde]' 
AND '$_POST[hasta]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}

if (
$_POST[institucion] and $_POST[region] and $_POST[desde] and $_POST[hasta]) { // institucion,region,desde,hasta 
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_reg_id = '$_POST[region]'
AND ini.ini_inst_id = '$_POST[institucion]'
AND ini.ini_fecha_creacion 
BETWEEN '$_POST[desde]' 
AND '$_POST[hasta]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}


if (
$_POST[institucion] and $_POST[estado] and $_POST[region]) { // institucion,estado,region
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_est_id = '$_POST[estado]'
AND ini.ini_reg_id = '$_POST[region]'
AND ini.ini_inst_id = '$_POST[institucion]'
ORDER BY ini.ini_fecha_creacion ASC"
);
}


if (
$_POST[institucion] and $_POST[desde] and $_POST[hasta] and $_POST[estado] and $_POST[region]) { // if todos
$q $db->query ("SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
AND ini.ini_reg_id = reg.reg_id
AND ini.ini_est_id = '$_POST[estado]'
AND ini.ini_reg_id = '$_POST[region]'
AND ini.ini_inst_id = '$_POST[institucion]'
AND ini.ini_fecha_creacion 
BETWEEN '$_POST[desde]' 
AND '$_POST[hasta]'
ORDER BY ini.ini_fecha_creacion ASC"
);

Pregunta, existe alguna manera de evitar tantos if

Gracias
Salu2...
  #2 (permalink)  
Antiguo 20/10/2008, 23:51
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Evitar tantos if

Usa un switch, aunque de igual manera seria igual de frustrante.

Trata ir creando la consulta dependiendo de lo seleccionado.
Agrupa todo lo que sea igual, y ahorrate unas cuantas lineas:

Cita:
SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg
WHERE ini.ini_inst_id = ins.inst_id
  #3 (permalink)  
Antiguo 21/10/2008, 15:00
 
Fecha de Ingreso: julio-2007
Ubicación: /home/victor
Mensajes: 114
Antigüedad: 16 años, 9 meses
Puntos: 0
Respuesta: Evitar tantos if

en fin

salu2
  #4 (permalink)  
Antiguo 21/10/2008, 15:11
nfo
 
Fecha de Ingreso: octubre-2008
Ubicación: EsPaCiO TiEmPo
Mensajes: 408
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Evitar tantos if

puedes usar un switch y meter todas las consultas en funciones.... asi te ahorrarias los if pero vamos... que por lo que veo... no te vas ha ahorrar muchas lineas
  #5 (permalink)  
Antiguo 21/10/2008, 15:24
Avatar de Snd234  
Fecha de Ingreso: mayo-2007
Ubicación: Frente al PC
Mensajes: 413
Antigüedad: 17 años
Puntos: 2
Respuesta: Evitar tantos if

No se si en menos if, pero si menos lineas.

La estructura de la consulta son muy parecidas, podrías simplemente, en cada IF, concatenar la parte de la consulta que difiere de las demás y pertenece a la opción seleccionada, por ejemplo;

Código PHP:
$sql "SELECT ini.*,ins.*,reg.* FROM iniciativa ini,institucion ins,region reg WHERE ini.ini_inst_id = ins.inst_id ";
// Aqui tus Ifs concatenando el resto de la consulta
$sql .= " ORDER BY ini.ini_fecha_creacion ASC";
$q $db->query($sql); 
__________________
KIBIT.cl
  #6 (permalink)  
Antiguo 24/10/2008, 14:07
 
Fecha de Ingreso: julio-2007
Ubicación: /home/victor
Mensajes: 114
Antigüedad: 16 años, 9 meses
Puntos: 0
Respuesta: Evitar tantos if

muchas gracias.
problema solucionado..

Salu2!
  #7 (permalink)  
Antiguo 07/11/2008, 16:37
 
Fecha de Ingreso: julio-2007
Ubicación: /home/victor
Mensajes: 114
Antigüedad: 16 años, 9 meses
Puntos: 0
Respuesta: Evitar tantos if

lo reduci.. gracias por los consejos

Código PHP:
// Selecciono las tablas y columanas
$sql " SELECT ini.ini_id,to_char(ini.ini_fecha_creacion, 'DD-MM-YYYY'),ini.ini_codigo,ini.ini_nombre,
ins.*,reg.*,est.*  FROM iniciativa ini,institucion ins,region reg, estado est "
;

// comienzo a concatenar 
$sql .= " WHERE ini.ini_inst_id = ins.inst_id ";
$sql .= " AND ini.ini_reg_id = reg.reg_id ";
$sql .= " AND ini.ini_est_id = est.est_id ";


if (
$_POST[desde] and $_POST[hasta]) { // por fechas 
$sql .= " AND ini.ini_fecha_creacion BETWEEN '$_POST[desde]' AND '$_POST[hasta]' ";
}

if (
$_POST[institucion]) { // por institucion
$sql .= " AND ini.ini_inst_id = '$_POST[institucion]'  ";
}

if (
$_POST[region]) { // por region
$sql .= " AND ini.ini_reg_id = '$_POST[region]' ";
}

if (
$_POST[estado]) { // por estado 
$sql .= " AND ini.ini_est_id = '$_POST[estado]' ";
}


$sql .= " ORDER BY ini.ini_fecha_creacion DESC "// el orden 

$q $db->query($sql); // la ejecuto

if ($_POST['borrar']) {

$lista implode(',',$_POST['seleccion']); // implode los separa por coma para hacer un delete where id IN
$borrar $db->query("UPDATE iniciativa SET ini_est_id = 3 WHERE ini_id IN($lista)");

$q $db->query("$sql"); 

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 22:44.