No veo la dependencia entre
$cad1 y
$cad2, lo único que te está complicando la consulta es que siempre incluyes
and y en el for tienes que eliminar el agregado en la última iteración.
Código PHP:
Ver original<?php
//recibo variables
$fecha = $_GET['fecha'];
$anio = $_GET['anio'];
$trim = $_GET['trim'];
$clases = $_GET['clases']; //arreglo
$query = "select * from tabla where "; //esta linea siempre sera igual
$filtros = array("id='$id'"); // Inicializas filtros con ID
// Utiliza if's anidados, el código queda más legible
if($fecha!="s"){
//si el input de fecha no esta vació
$filtros[] = "fecha='$fecha' ";
} else if($anio!="s" && $trim!="s"){
//si el usuario elige año y trimestre
//entonces yo armo la fecha de inicio y la fecha final en base al trimestre correspondiente
$trim = explode("/",$trim); //recibo el trimestre: mm-dd/mm-dd $trim_ini = $trim[0];
$trim_fin = $trim[1];
$fecha_ini = $anio."-".$trim_ini;
$fecha_fin = $anio."-".$trim_fin;
//hago la condición de la consulta
$filtros[] = "fecha between '$fecha_ini' and '$fecha_fin' ";
} else if($anio!="s"){
//si solo eligio el año
$filtros[] = "left(fecha, 4)='$anio' ";
}
// Segunda parte
// Recorres $clase directamente, con foreach(), no necesitas contar los elementos
// $i es el índice que usabas en el for, $valor corresponde a $clase[$i]
foreach($clase as $i => $valor) {
if($clase[$i] != 's') {
$filtros[] = "id_{$array_clases[$i]} = '$valor'";
}
}
// No necesitas comparar cad1 y cad2, sólo concatenas lo que haya en $filtros
$query .= implode(' and ', $filtros);
//concluyo la consulta con un order by
$query .= " order by id_arch ASC";
La lógica siguie siendo la misma, excepto por la complicación que tenías con $cad1 y $cad2