Ciao a tutti,
ho un problema con una form per una ricerca di immagini, in cui ogni campo è facoltativo. Se non riempio nessun campo vengono restituiti tutti i risultati, esattamente come desidero. Se compilo uno o più campi invariabilmente la query mi restituisce sempre tutte i record della tabella.

A livello PHP controllo se ogni campo è stato compilato con isset(), se sì assegno il suo valore a una variabile, altrimenti alla variabile assegno NULL o '' (stringa vuota, ho provato in entrambi i modi ma la query mi restituisce comunque tutti i risultati).

Veniamo alla query: premetto che, eseguendola da phpmyadmin, la query restituisce i risultati giusti. Ci sarà qualche errore a livello di php che non riesco a trovare!

La query è:

Codice PHP:
$sql "SELECT DISTINCT opere.id, opere.titolo, opere.thumb FROM opere JOIN tags ON opere.id = tags.opera WHERE ( (opere.titolo LIKE '%$titolo%') or  (opere.publisher LIKE '%$autore%')) or    (opere.categoria LIKE '%$categoria%') or (data_pubblicazione BETWEEN '$data_da' and '$data_a'))"
I vari $titolo, $categoria e $autore... se i campi non sono stati compilati corrispondono a NULL (o a '', come vi spiegavo sopra). Eseguendo le query da phpmyadmin i risultati sono sempre corretti se simulo questi valori, considerando che uso LIKE: '%''%', '%NULL%' , '%%' mi danno sempre ciò che voglio ottenere.

Se nella query cerco solo sul campo data_pubblicazione ottengo i risultati giusti, se abbino in OR per esempio il campo titolo ottengo di nuovo tutto la roba in tabella.

Perché? E' un problema di condizioni nella clausola WHERE? Faccio male a settare i campi non compilati come NULL o ''? Strategie alternative che mi suggerite?

Grazie in anticipo, sto davvero sclerando con questa roba da giorni e mi sfugge proprio dove sta il problema.

Codice php (scusate ridondanza, poca pulizia, poca eleganza e varie ed eventuali: sono autodidatta, se avete suggerimenti sono sempre graditi):

Codice PHP:
//CONTROLLI SULL'INVIO EFFETTIVO DEI PARAMETRI  
function check_titolo($i) {     
if (isset(
$i) and !empty($i)) {return $i;}     
else {return 
NULL;}} 

function 
check_autore($i) {     
if (isset(
$i) and !empty($i)) {return $i;}     
else {return 
NULL;}     


function 
check_categoria($i) { 
if (isset(
$i) and trim($i)) {return $i;}     
else {return 
NULL;}     
return 
$categoria; } 

function 
controlla_data_da($g$m$a) { 
    
$s checkdate($m,$g,$a);     
if (
$s) {         
$data_da date("$a-$m-$g");     
}     
else {         
$data_da NULL;     
}         
return 
$data_da
}  

function 
controlla_data_a($g$m$a) {     
$s checkdate($m,$g,$a);     
if (
$s) {         
$data_a date("$a-$m-$g");     
}     
else {         
$data_a NULL
}     
return 
$data_a; } 

 
//RESTITUISCE I RISULTATI 
if (isset($_POST['submit'])) { 
    if (     
(!isset (
$_POST['titolo']) || !trim ($_POST['titolo'])) and     
(!isset (
$_POST['autore']) || !trim ($_POST['autore'])) and 
(!isset (
$_POST['categoria']) || !trim ($_POST['categoria'])) and     
(!isset (
$_POST['da_giorno']) || $_POST['da_giorno'] == '-1') and     (!isset($_POST['da_mese']) || $_POST['da_mese'] == '-1') and     (!isset($_POST['da_anno']) || $_POST['da_anno'] == '-1') and      (!isset($_POST['a_giorno'])|| $_POST['a_giorno'] == '-1') and
(!isset(
$_POST['a_mese']) || $_POST['a_mese'] == '-1') and     
(!isset(
$_POST['a_anno']) || $_POST['a_anno'] == '-1') and     
(!isset(
$_POST['tag']) || !trim ($_POST['tag'])) and     (!isset($_POST['myCheck']) || empty($_POST['myCheck']))     ) { 
echo 
"Nessun criterio selezionato. Torna alla <a href=\"ricercaavanzata.php\">ricerca avanzata</a>.";         
include(
"risultatiricercaopere.php");     }     
else { 
$titolo check_titolo($_POST['titolo']);         
$autore check_autore($_POST['autore']);         
$categoria check_categoria($_POST['categoria']);         
include(
"connessionedb.php");                  
// verifica se le date sono corrette e crea le variabili per la query                  

$data_da controlla_data_da($_POST['da_giorno'],$_POST['da_mese'],$_POST['da_anno']);         $data_a controlla_data_a($_POST['a_giorno'],$_POST['a_mese'],$_POST['a_anno']);          

$sql "SELECT DISTINCT opere.id, opere.titolo, opere.thumb FROM opere JOIN tags ON opere.id = tags.opera WHERE (         
(data_pubblicazione BETWEEN '
$data_da' and '$data_a') or (opere.titolo LIKE '%$titolo%') or (opere.publisher LIKE '%$autore%') or (opere.categoria LIKE '%$categoria%'))";              
$res mysql_query($sql,$conn) or die ("Errore" .mysql_error());         

echo 
"<table class=\"anteprime\">\n";         
while(
$results mysql_fetch_array($res)) {             
echo 
"<tr><td><a href='opera.php?id=$results[id]'>[img]".$results[[/img]
$results[titolo]</a></td></tr>";             
}         
echo "
</table>";         
echo "
Criterio/i selezionato/i."."Torna alla <a href=\"ricercaavanzata.php\">ricerca avanzata</a>.";
 } 

else {     
include(
"formcercaopere.php");