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");
}