query che non riesco a far funzionare

megarospo

Utente Attivo
25 Set 2007
147
0
0
Ho una query che non riesco a far funzionare correttamente.
Il risultato che voglio ottenere è che un utente non immetta nulla e ottenga tutti i record.
Ciò non avviene perché vengono esclusi quelli “NULL”.
Pensavo fosse banale ma non ci riesco! Sing!

Partiamo del form.
Questo ha solo tre campi.

<form action="editaoggetto2.php" method="post" enctype="multipart/form-data" name="formricerca" id="formricerca">
<label align="center"><div align="center">
<span class="oggettotesto">
<table align="center" style="text-align: left; width: 600px;" border="0"
cellpadding="2" cellspacing="2">
<tr>
<td colspan="1" rowspan="1" style="vertical-align: top;"><p align="left"><span class="oggettotestomedio"><strong>Ricerca</strong><br></p>

Nome Oggetto
<input name="nome" type="text" id="nome" size="50" />
</div>
</label>
<p align="left">
<label>Formato Oggetto
<select name="formato" id="formato">
<option value="%" selected>Tutti</option>
<option value="OGGETTO1">OGGETTO1</option>
<option value="OGGETTO2">OGGETTO2</option>
</select>
</label>
</p>
<p align="left">
<label>Descrizione Oggetto
<input name="descrizione" type="text" id="descrizione" size="50" />
</label>
</p></span>
<p align="left">
<label></label>
<label>
<input type="submit" name="Submit" value=" Ricerca " />
</label>
</td>
<tr>
</tr>
</table>
</form>





La query successiva è questa:
…..
if (isset($_POST['nome'])) {
$varnome_ricerca = (get_magic_quotes_gpc()) ? $_POST['nome'] : addslashes($_POST['nome']);
echo "<br> ----$varnome_ricerca----<br>";
}else {$varnome_ricerca = "%";}


if (isset($_POST['formato'])) {
$varformato_ricerca = (get_magic_quotes_gpc()) ? $_POST['formato'] : addslashes($_POST['formato']);
echo "<br> ----$varformato_ricerca----<br>";
}else {$varformato_ricerca= "%";}

$vardescrizione_ricerca = "%";
if (isset($_POST['descrizione'])) {
$vardescrizione_ricerca = (get_magic_quotes_gpc()) ? $_POST['descrizione'] : addslashes($_POST['descrizione']);
echo "<br> ----$vardescrizione_ricerca----<br>";
}
…..

$query_ricerca = "SELECT oggetto.id, oggetto.nome, oggetto.formato, oggetto.descrizione, oggetto.altrooggetto, user.nick, user.colore, user.dimensioni, user.email, user.altrouser FROM oggetto INNER JOIN user ON oggetto.id_user=user.id WHERE oggetto.nome LIKE '%$varnome_ricerca%' AND oggetto.formato LIKE '%$varformato_ricerca%' AND oggetto.descrizione LIKE '%$vardescrizione_ricerca%' AND oggetto.id_user LIKE '%$risultatoid%' ORDER BY oggetto.nome";

Ho dovuto togliere prima di SELECT, il “sprintf “. Mi dava degli errori. (parametri insufficienti)

Da cosa può dipendere? Come devo impostare la query?
Mille grazie per l’aiuto.
 
ciao
potresti con una serie di if costruirti la clausola whwre, es.

f($_POST['nome']==""){
$clausola="";// li cerca tutti
}else{//io ho messo else, ma se servono ifelse
$clausola=" WHERE pinco='".$_POST['nome']."'";
}

poi la query diventa

$query_ricerca = "SELECT oggetto.id,ecc ecc ".$clausola." ORDER BY oggetto.nome";

qundi ti costruisci il where in funzione dei vari input
 
Si! Ci avevo pensato ma mi è sembrata una strada non corretta.
Capisci? intendo dire che la soluzione che hai proposto è valida, ma io vorrei capire se è possibile ottenere il risultato direttamente tramite query. Se sono io che sbaglio ad impostarla o proprio non ce modo di farla.
Teoricamente sembrava semplice.
Pensavo: se nel campo 'nome' trovi una corrispondenza, AND se nel campo 'formato' trovi una corrispondenza AND nel campo 'descrizione' trovi una corrispondenza, stampa il risultato della ricerca.
Il punto del problema è che per la query un campo vuoto, che da origine a sua volta ad una variabile vuota ( $variabile = "" ) non corrisponde a NULL.

Per informazione ho provato a trasformare la variabile vuota in altre cose tipo:

if($_POST['nome']==""){
$clausola="NULL";}

oppure

if($_POST['nome']==""){
$clausola="%";} // che dovrebbe corrispondere a "cerca tutto" giusto?

ma non ha funzionato!
Ciao!
 
ciao
forse avevo capito male, intendi dire che (vedo il campo in grassetto nella quary)

...$varformato_ricerca%' AND oggetto.descrizione LIKE '%$vardescrizione_ricerca%' AND oggetto.id_user LIKE ...

quindi ti riferisci al campo che può essere vuoto? e qundi la like non funzia?

non postrest mettere un OR

...$varformato_ricerca%' AND (oggetto.descrizione LIKE '%$vardescrizione_ricerca%' OR oggetto.descrizione='') AND oggetto.id_user LIKE ...
 
Si. Avevo provato ma non funzionava correttamente. Comunque ne ho provate talmente tante e una in fila all'altra che non escudo che abbia fatto confusione e piccoli errori. Appena ho un pò di tranquillità ci riprovo con calma. Grazie mille :book:
 
Nopn ho resistito e ho dovuto provare subito :)

Questa è la query. Purtroppo confermo che non mi funziona.
Intendiamoci, non da nessun errore, ma esclude i record dove il campo descrizione è NULL. :confused:

$query_ricerca = "SELECT oggetto.id, oggetto.nome, oggetto.descrizione, user.nick, user.email, FROM oggetto INNER JOIN user ON oggetto.id_user=user.id WHERE oggetto.nome LIKE '%$varnome_ricerca%' AND (oggetto.descrizione LIKE '%$vardescrizione_ricerca%' OR oggetto.descrizione='') AND oggetto.id_user LIKE '%$risultatoid%' ORDER BY oggetto.nome";

Ciao
 
Ho trovato la soluzione.
questa è la chiave del problema:
AND (oggetto.descrizione LIKE '%$vardescrizione_ricerca%' OR oggetto.descrizione IS NULL)

quindi ...OR oggetto.descrizione IS NULL)... va scritto senza il segno uguale e senza apici.

Grazie per l'aiuto!! :book:

P.S. MI CORREGO.
Così impostata, la query restituisce "sempre" i record dove 'descrizione' è "null".
Visto il particolare modo di scrivere sulla query la caratteristica 'IS NULL' inizio proprio a pensare che l'unica soluzione sia applicare un 'if' fuori dalla query che ne modifichi dinamicamente il contenuto a seconda che l'utente inserisca nel campo 'descrizione', un dato oppure no.
per farla breve così:

if (isset($_POST[descrizione]))
{
$var_descrizione = (get_magic_quotes_gpc()) ? $_POST['descrizionea'] : addslashes($_POST['descrizione' ]);
if ($var_descrizione=='')
{ $testo_query="oggetto.descrizione IS NULL";} else{$testo_query="oggetto.descrizione LIKE '%$var_descrizione_ricerca%'"}
}

e poi inserisco '$testo_query' dentro la query.
secondo voi c'è un'altra soluzione?
 
Ultima modifica:
Anche questa soluzione da dei problemi. In particolare con la paginazione. Al click per richiamare la seconda pagina non viene valorizzata la variabile che si inserisce nella query e viene mostrato un errore.
Secondo voi come posso superare questo altro problema?
P.s. per la paginazione uso il codice dell'articolo di scritto da Claudio Garau il 01/11/2007 "Gestire la paginazione dei records di MySQL con una classe PHP"

:book:
 
scusate l'intromissione, non suggerisco soluzioni perchè non ho capito bene quale sia il problema, però mi pare che qui si parli di null come di valore vuoto equiparandoli.
La differenza tra una variabile vuota e una nulla è moooolto grande in qualsiasi linguaggio.
Una variabile vuota è definita e non valorizzata, una nulla non è definita.
Il principio vale anche in SQL e, ad ogni modo è sicuro che al 100% una query del tipo
Codice:
SELECT campo FROM tab WHERE (campo='valore' OR campo IS NULL)
restituisce SIA i campi col valore impostato, SIA i campi nulli.

Per quello che dicevo prima attenzione che 'campo IS NULL' è molto diverso da 'campo=""'.
 

Discussioni simili