-
ricerca con più valori
ciao, dunque...
sono giorni che ci lavoro... io ho un motore di ricerca interno... ho 3 parametri che corrispondono a 3 colonne in una tabella del db...
cioè
ricerca1 => colonna1
ricerca2 => colonna2
ricerca3 => colonna3
quindi io nel form per avviare la ricerca specifico i 3 ricerca... una volta avviato lo script mi deve cercare nella colonna1 il valore esatto specificato nel campo ricerca1... nella colonna2 in range tipo da 18 a 30 specificato nel campo ricerca2 e nella colonna3 il valore esatto specificato nel campo ricerca3...
poi per rendere il tutto più divertente mi servirebbe che se per esempio il campo ricerca2 fosse vuoto non deve cercare niente nella colonna2 e quindi la ricerca sarebbe solo nella colonna1,2 con i rispettivi valori da cercate passati dai campi ricerca1,2...
spero di essere stato chiaro... grazie... chi sapesse come risolvermi questo inconveniente avrebbe tutto il mio rispetto ed ammirazione... :lolloso:
-
Se ho capito bene dovrebbe essere una cosa di questo tipo....
$query = "";
/* costruisco la query se almeno una condizione è valorizzata */
if(!empty($ricerca1) || !empty($ricerca2) || !empty($ricerca3))
{
/*
N.B. la prima condizione 1=1 è sempre vera, nella costruzione dinamica
delle query, serve per non doversi preoccupare se mettere o meno il
primo AND
*/
$query = "select [campi] from [tabella] where 1=1";
if(!empty($ricerca1))
$query = $query." AND campo1 = ".$ricerca1;
if(!empty($ricerca2))
$query = $query." AND campo2 = ".$ricerca2;
if(!empty($ricerca3))
$query = $query." AND campo3 = ".$ricerca3;
/* Eseguo la query */
}
In questo modo le condizioni della query vengono create solo in base alla presenza di ogni singolo valore (se il valore non c'è la condizione non viene aggiunta).
Per il campo2 non ho capito cosa intendi, per effettuare una ricerca in range bisogna avere due valori, min e max (es. ricerca2_min e ricerca2_max):
e di solito la query si crea così:
if(!empty($ricerca2_min))
$query = $query." AND campo2 >= ".$ricerca2_min;
if(!empty($ricerca2_max))
$query = $query." AND campo2 <= ".$ricerca2_max;
in questo modo ci sono 3 condizioni:
1) ricerca2_min è valorizzato, ricerca2_max no:
il campo2 deve essere maggiore o uguale a ricerca2_min.
2) ricerca2_max è valorizzato, ricerca2_min no:
il campo2 deve essere minore o uguale a ricerca2_max.
3) sono valorizzati entrambi:
il campo2 deve essere un valore tra ricerca2_min e ricerca2_max compresi.
E' questo che intendevi?
-
si, quindi combinando tutta la pappardella che query dovrebbe uscire fuori?
-
Quindi è così:
/* costruisco la query se almeno una condizione è valorizzata */
if(!empty($ricerca1) || !empty($ricerca2_min) || !empty($ricerca2_max) || !empty($ricerca3))
{
/*
N.B. la prima condizione 1=1 è sempre vera, nella costruzione dinamica
delle query, serve per non doversi preoccupare se mettere o meno il
primo AND
*/
$query = "select [campi] from [tabella] where 1=1";
if(!empty($ricerca1))
$query = $query." AND campo1 = ".$ricerca1;
if(!empty($ricerca2_min))
$query = $query." AND campo2 >= ".$ricerca2_min;
if(!empty($ricerca2_max))
$query = $query." AND campo2 <= ".$ricerca2_max;
if(!empty($ricerca3))
$query = $query." AND campo3 = ".$ricerca3;
/* Eseguo la query */
}
Il risultato varia a seconda che ricerca1, ricerca2_min, ricerca2_max e ricerca3 siano valorizzati o meno.
quindi può uscire una query come:
select [campi] from [tabella] where 1=1 AND campo1 = $ricerca1
(se è valorizzato solo ricerca1)
o:
select [campi] from [tabella] where 1=1 AND campo1 = $ricerca1 AND campo2 >= $ricerca2_min AND campo2 <= $ricerca2_max AND campo3 = $ricerca3
(se sono valorizzati tutti i filtri)
-
grazie smilzooooooooooooooooooo