Newsgroup: it.comp.www.php
Titolo: Query dinamica 2

Cambio thread sperando che qualcuno mi aiuti  ;))
In un form, devo integrare una ricerca per parola chiave nel campo cv. Nel
codice qui sotto ho cercato di farlo con if...else, in modo che, se non
viene inserita nessuna parola chiave, la query salta il capo e applica solo
le altre condizioni. Se invece  ($chiave!="")  , cioè se è stato inserito
qualcosa, esegue questa parte della query, per poi eseguire le altre (filtro
per provincia etc.).
Quando non ci sono parole chiave, tutto bene, quando ce ne sono, o applica
solo la condizione della key o solo quella su provincia etc. Ci deve essere
un problema di struttura, che non riesco a trovare... qualcuno mi da' una
mano?
if($chiave!="") {
$keys = explode (" ", $chiave);
$sql = "";
reset ($keys);
while (list(,$parola) = each ($keys))
{ $parola = trim($parola);
if ($parola != "")
$sql .= "cv LIKE '%$parola%' OR qualifica LIKE '%$parola%' OR";
}
$sql .= "0";
$sql="SELECT * FROM annunci WHERE " . $sql;
if ($eta!="Tutte"||$provincia!="Qualsiasi"||$qualifica!="Tutte") {
 $par='';
 if($eta!="Tutte") {
  $sql.=" ".$par." eta='$eta'";
  $par='AND';
  }
 if($provincia!="Qualsiasi") {
  $sql.=" ".$par." provincia='$provincia'";
  $par='AND';
  }
 if($qualifica!="Tutte") {
  $sql.=" ".$par." qualifica='$qualifica'";
  }
 }
}
else
{
$sql="SELECT * FROM annunci ";
if ($eta!="Tutte"||$provincia!="Qualsiasi"||$qualifica!="Tutte") {
 $par='WHERE';
 if($eta!="Tutte") {
  $sql.=" ".$par." eta='$eta'";
  $par='AND';
  }
 if($provincia!="Qualsiasi") {
  $sql.=" ".$par." provincia='$provincia'";
  $par='AND';
  }
 if($qualifica!="Tutte") {
  $sql.=" ".$par." qualifica='$qualifica'";
  }
 }
}
$result=mysql_db_query("test",$sql, $db);
--
M  a  r  c  o    S  a  l  i  s            
marc...@tin.it
www.fidalnet.com
 - 
www.atleticaoristano.f2s.com
www.musix4u.com
 - il forum dedicato alla musica!

 mano?
Innanzi tutto, ti consiglio di inserire un echo per visualizzare $sql e
controllare che non ci siano errori nella query. Ad esempio, se salti anche
uno spazio o una virgola la query non funge.
Se però la query non ti dà errori, ma semplicemente non fa quello che ti
aspetti, allora probabilmente la query è mal formulata. Ad esempio,
potrebbero servire delle parentesi per spiegare al DBMS l'ordine con cui
elaborare le condizioni.
Comunque, anche in questo caso, manda in echo il contenuto di $sql, e magari
postalo: sarà più facile darti una mano. Ho cercato di spulciarmi il codice
ma mi sono un po' perso...

 $result=mysql_db_query("test",$sql, $db);
Non ho guardato il tuo codice (un po' disordinato :-) ma due cose:
mysql_db_query e' una funzione non da utilizzare (vedi manuale
http://www.php.net/manual/it/function.mysql-db-query.php
)
Poi dovresti SEMPRE controllare se una query ti da un errore e visualizzare
la tipologia:
$result=mysql_query($sql) or die ("Errore query! Riga:". __LINE__
."<BR>".mysql_error());

 ti aspetti, allora probabilmente la query è mal formulata.
C'è un problema di formulazione, ho incasinato molto il codice :)))
La query, utilizzando entrambi i criteri di ricerca (menu a tendina
+ parole chiave) è un pasticcio.........
SELECT * FROM annunci WHERE cv LIKE '%esempio%' OR qualifica LIKE
'%esempio%' OR0 eta='< 20 anni' AND qualifica='Animatore'
!!!
Aggiungere lo zero dopo OR è un trucco per chiudere la query che ho trovato
in una FAQ di 
phpfree.html.it
 ma evidentemente serve solo ad incasinare le
cose...
La query corretta _dovrebbe_ essere:
SELECT * FROM annunci WHERE eta='< 20 anni' AND qualifica='Animatore' AND
cv LIKE '%parolachiave%' OR qualifica LIKE '%parolachiave%'
oppure (se non viene inserita parola chiave):
SELECT * FROM annunci WHERE eta='< 20 anni' AND qualifica='Animatore'
oppure (se l'unico criterio da applicare è la parola chiave):
SELECT * FROM annunci WHERE cv LIKE '%parolachiave%' OR qualifica LIKE
'%parolachiave%'
Ma il blocco if...else che ho impostato mi sa che è sbagliato :))
Aiuto!!


Allora: ho sistemato 1 po' le cose, anche se il codice non è molto ordinato.
La query funziona in tutti i casi, tranne quello in cui l'unico valore da
ricercare è la parola chiave (perchè gli altri sono  ''), perchè rimane un
AND alla fine della query:
SELECT * FROM annunci WHERE cv LIKE '%esempio%' AND
Come posso fare per rimuoverlo, magari inserendo un    qualifica='%'    che
non avrebbe effetto ai fini della ricerca? Ho provato con
if($sql=="%AND ") {
$sql.="qualifica='%'";
     }
prima di mysql_db_query, ma non funziona!!!
Ecco il codice completo:
<?
[cut]
$db=mysql_connect($host,$user,$pass) or die ("Errore durante la connessione
al database");
$sql="SELECT * FROM annunci ";
if($chiave!="") {
$keys = explode (" ", $chiave);
$sql = "";
reset ($keys);
while (list(,$parola) = each ($keys))
{ $parola = trim($parola);
if ($parola != "")
$sql.= "cv LIKE '%$parola%' AND ";
}
$sql="SELECT * FROM annunci WHERE " . $sql;
if ($eta!="Tutte"||$provincia!="Qualsiasi"||$qualifica!="Tutte") {
 $par='';
 if($eta!="Tutte") {
  $sql.=" ".$par." eta='$eta'";
  $par='AND';
  }
 if($provincia!="Qualsiasi") {
  $sql.=" ".$par." provincia='$provincia'";
  $par='AND';
  }
 if($qualifica!="Tutte") {
  $sql.=" ".$par." qualifica='$qualifica'";
  }
 }
  }
else
{
$sql="SELECT * FROM annunci ";
if ($eta!="Tutte"||$provincia!="Qualsiasi"||$qualifica!="Tutte") {
 $par='WHERE';
 if($eta!="Tutte") {
  $sql.=" ".$par." eta='$eta'";
  $par='AND';
  }
 if($provincia!="Qualsiasi") {
  $sql.=" ".$par." provincia='$provincia'";
  $par='AND';
  }
 if($qualifica!="Tutte") {
  $sql.=" ".$par." qualifica='$qualifica'";
  }
 }
}
echo "$sql";
$result=mysql_db_query("test",$sql,$db);
while ($row=mysql_fetch_array($result)) {
[cut]
?>


Ad esempi se usi una variabile d'appoggio che ti indica se hai gia' usato un
operatore
$primoOp=true;
if (...){
    $primoOp=false;
    $sql.=...
}
if (...) {
    if (!$primoOp) $sql.=" AND";
    else $primoOp=false;
    $sql.=...
}
if (...) {
    if (!$primoOp) $sql.=" AND";
    else $primoOp=false;
    $sql.=...
}

      }
Solo per la cronaca:
un AND 1 andrebbe anche bene (ma non e' il modo piu' elegante, vedi gli
altri post)...
;-)

 un AND 1 andrebbe anche bene [...]
Ho risolto!!! Ehm... in questo momento, dato che sono alle prime armi, mi
interessa più la funzionalità che l'eleganza... ;-)
Ho fatto diverse prove e tutto funziona come deve usando:
if ($eta=="Tutte"&&$provincia=="Qualsiasi"&&$qualifica=="Tutte") {
$sql.="1";
}
In questo modo viene aggiunto l'uno solo se tutti e tre i valori dei menu a
tendina sono nulli. Posto l'intero codice, non credo che servirà a qualcuno
visto che tutti qua siete più esperti di me, comunque...  ;))
[cut]
$db=mysql_connect($host,$user,$pass) or die ("Errore durante la connessione
al database");
$sql="SELECT * FROM annunci ";
if($chiave!="") {
$keys = explode (" ", $chiave);
$sql = "";
reset ($keys);
while (list(,$parola) = each ($keys))
{ $parola = trim($parola);
if ($parola != "")
$sql.= "cv LIKE '%$parola%' AND ";
}
$sql="SELECT * FROM annunci WHERE " . $sql;
if ($eta!="Tutte"||$provincia!="Qualsiasi"||$qualifica!="Tutte") {
 $par='';
 if($eta!="Tutte") {
  $sql.=" ".$par." eta='$eta'";
  $par='AND';
  }
 if($provincia!="Qualsiasi") {
  $sql.=" ".$par." provincia='$provincia'";
  $par='AND';
  }
 if($qualifica!="Tutte") {
  $sql.=" ".$par." qualifica='$qualifica'";
  }
 }
if ($eta=="Tutte"&&$provincia=="Qualsiasi"&&$qualifica=="Tutte") {
$sql.="1";
    }
  }
else
{
$sql="SELECT * FROM annunci ";
if ($eta!="Tutte"||$provincia!="Qualsiasi"||$qualifica!="Tutte") {
 $par='WHERE';
 if($eta!="Tutte") {
  $sql.=" ".$par." eta='$eta'";
  $par='AND';
  }
 if($provincia!="Qualsiasi") {
  $sql.=" ".$par." provincia='$provincia'";
  $par='AND';
  }
 if($qualifica!="Tutte") {
  $sql.=" ".$par." qualifica='$qualifica'";
  }
 }
}
$result=mysql_db_query("test",$sql,$db);
while ($row=mysql_fetch_array($result)) {
[...cut]


 ma non funziona. Devo modificare qualcos'altro?
Allora un esempio per come si potrebbe fare per usare query e numero
risultati:
$link = mysql_connect("localhost", "username", "password");
mysql_select_db("database", $link);
$result = mysql_query("SELECT * FROM table1", $link) or die (mysql_error());
$num_rows = mysql_num_rows($result);
oppure (se basta una connessione):
mysql_connect("localhost", "username", "password");
mysql_select_db("database");
$result = mysql_query("SELECT * FROM table1") or die (mysql_error());

 $result = mysql_query("SELECT * FROM table1") or die (mysql_error());
Ok, ti ringrazio. Ho risolto piů o meno cosě!
Ho provato ad usare la stringa seguente per contare i risultati:
mysql_num_rows($result);
echo("numero di risultati trovato: ".$result."");
... ma mi restituisce nell'output la scritta 'Resource id #2'.
Perchč???


 echo("numero di risultati trovato: ".$result."");
l'ultimo ."" non e' necessario.
E' sufficiente uno di queste forme qui:
    echo "numero di risultati trovato: ".$result;
    echo 'numero di risultati trovato: '.$result;
    echo "numero di risultati trovato: $result";
    echo "numero di risultati trovato: {$result}";
la terza forse [IMHO] la piu' leggibile.