Newsgroup: it.comp.www.php
Titolo: Cercare nel database tra più colonne... come?

ho provato questa query:
// con questi controlli inizializzo le variabili del form  di ricerca
// nel caso dovessero essere vuote
$artista  = isSet($_POST["artista"])  ? $_POST["artista"] : "";
$titolo  = isSet($_POST["titolo"])  ? $_POST["titolo"] : "";
$formato  = isSet($_POST["formato"])  ? $_POST["formato"] : "";
$anno   = isSet($_POST["anno"])  ? $_POST["anno"] : "";
$etichetta  = isSet($_POST["etichetta"])? $_POST["etichetta"] : "";
$stato   = isSet($_POST["stato"])  ? $_POST["stato"] : "";
$prezzo  = isSet($_POST["prezzo"])  ? $_POST["prezzo"] : "";
$genere  = isSet($_POST["genere"])  ? $_POST["genere"] : "";
$offerta  = isSet($_POST["offerta"])  ? $_POST["offerta"] : "";
// questa è la query
$tutto="SELECT * FROM mf_album WHERE (artista LIKE '%".$artista."%')
                        OR (titolo LIKE '%".$titolo."%')
                        OR (formato LIKE '".$formato."')
                        OR (anno LIKE '%".$anno."%')
                        OR (etichetta LIKE '".$etichetta."')
                        OR (stato LIKE '".$stato."')
                        OR (prezzo LIKE '%".$prezzo."%')
                        OR (genere LIKE '".$genere."')
                        OR (offerta LIKE '".$offerta."')
Ovviamente però mi restituisce tutti i dati della tabella mf_album.
avevo pensato di fare un controllo che rendesse query dinamiche contenenti
solo le richieste effettivamente espresse nel form di ricerca...
ma come farlo?
Luciano

                         OR (offerta LIKE '".$offerta."')
Hai provato ad usare AND al posto di OR?
 A | B | A or B
---+---+-------
 T | T |   T
 T | F |   T
 F | T |   T
 F | F |   F
SELECT *
FROM tabella
WHERE artista LIKE 'madonna'
OR anno LIKE '1990'
ti restituisce tutti i record di madonna OPPURE del 1990.
Quindi un'unione delle 2 clausole.
SELECT *
FROM tabella
WHERE artista LIKE 'madonna'
AND anno LIKE '1990'
ti restituisce tutti i record di madonna del 1990.
Quindi un'intersezione delle 2 clausole.
Ciao
Marco

Forse non sono stato chiaro...
certamente sarebbe utile un 'and' invece di un 'or'
ma se il campo corrispondente è vuoto il comando 'and' restituirebe 'falso'.
Ho bisogno di una query dinaminca che si modifichi a seconda dei campi
presenti all'interno del post del form.
del tipo:
$query="SELECT * FROM mf_album WHERE";
    if ( $_post["titolo"] !== " " ) {
        $query=. " titolo LIKE ' % " . $titolo . " % ' "
    }elseif ( $_post["formato"] !== " " ) {
        $query=. " titolo LIKE '  " . $formato . "  ' "
    }elseif ( $_post["anno"] !== " " ) {
        $query=. " titolo LIKE '  " . $anno . "  ' "
    }
$query=. "ORDER BY $ordine";
Luciano Amodio

mmmm,
forse invece di elseif dovrei fare solo tanti if differenti e indipendenti.

    }
anche tipo
$query = 'select * from mf_album where ';
$z = false;
foreach($_POST as $key=>$value) {
    if(strlen($value) == 0)
        continue;
    switch($key) {
        case 'titolo': 
        case 'formato':
        case 'anno':
            if($z)
                $query .= 'and ';
            $query .= "titolo like%${value}% ";
            $z = true;
            break;
    }
}
$query .= "order by ${_POST['ordine']}";
il tuo snippet usava uno strano mix tra reg globals e non, etc...cosi'
fa quello che pare tu voglia fare :)
ciao
- -- 
oggei
gpg --keyserver 
keys.indymedia.org
 --recv-keys eebb4d0d
-----BEGIN PGP SIGNATURE-----
iD8DBQE/9ZC8ZmjYv+67TQ0RAggIAJ9DU4JsUWcbGyIcErSy3iIBmESAngCdFF3r
kZOXoz+5eEbW7FHnggwM1/I=
=8Tn+
-----END PGP SIGNATURE-----

mmmm,
ci sono molti errori nella query postata precedentemente.
Li correggo:
$z = true;
$query="SELECT * FROM mf_album WHERE";
    if ( $_post["titolo"] !== " " ) {
        $query=. " titolo LIKE ' % " . $_post["titolo"]. " % ' AND "
        // ho corretto la variabile della query che per copia e
        // incolla si riferiva ad un altro metodo a controlli
    }
    if ( $_post["formato"] !== " " ) {
        // ho corretto il controllo in quanto elsif non aveva
        // ragione d'essere
        $query=. " formato LIKE '  " . $_post["formato"]. "  ' AND"
        // altro errore corretto: invece di titolo scrivo formato
        // ossia il nome della colonna nella quale cercare il valore
    }
    if ( $_post["anno"] !== " " ) {
        $query=. " anno LIKE '  " . $_post["anno"]. "  ' AND"
        // inoltre o aggiunto AND che avevo dimenticato
    }
$query=. " ." $z ." ORDER BY $_post["ordine"]";
         // $z serve per concludere il ciclo di AND
         // ho infine corretto $ordine per gli stessi motivi di cui sopra
Mi scuso per aver postato in questa maniera barbara...
Luciano Amodio

 etc...cosi' fa quello che pare tu voglia fare :)
be, in effetti avevi ragione in quanto la query da me postata era piena
zeppa di errori... l'ho corretta... ti prego di dargli un'occhiata..
Luciano Amodio

 ha scritto nel messaggio
news:TKgJb.19526$Jw2....@tornado.fastwebnet.it...


> Occhio, si dice correzione con una 'z' sola.
le doppie sono sempre state il mio problema...
a parte questo perchè hai quotato l'intero mio post?


Andavo di fretta scusami.

zeppa di errori... l'ho corretta... ti prego di dargli un'occhiata..
era sbagliato il codice, piu' che la query.
ciao
- -- 
oggei
gpg --keyserver 
keys.indymedia.org
 --recv-keys eebb4d0d
-----BEGIN PGP SIGNATURE-----
iD8DBQE/9ae0ZmjYv+67TQ0RAim9AJwPzmC0mBSkzanX4v+Vb9R4UvbHTgCgrnJI
Z2AhWMr95WmyETbEx4qCKBQ=
=ddef
-----END PGP SIGNATURE-----

Ho provato ma non funziona.
Di seguito il codice con le modifiche:
$query = 'select * from mf_album where ';
$z = false;
foreach($_POST as $key=>$value) {
    if(strlen($value) !== 0)
        // qui ho aggiunto ! perchè se non erro
        // strlen($value) == 0 restituisce true
        // se $value è nullo fermando dunque lo script
        continue;
    switch($key) {
        case 'formato':
        case 'anno':
        case 'etichetta':
        case 'stato':
        case 'prezzo':
        case 'genere':
        case 'offerta':
            if($z)
                $query .= 'and ';
            $query .= " ".$key." like ".$value." ";
        // non conosco l'uso delle {} e quindi ho sostituito
        // con ". .", inoltre ho dinamizzato la selezione della colonna
        // assegnandole il valore di $key
            $z = true;
            break;
    }
}
$query .= "order by ".$ordine."";
        // $ordine è inizzializata da un controllo precedente.
RISULTATO:
Non riesco ad eseguire la richiesta
select * from mf_album where order by artista
Come vedi manca il prodotto del ciclo foreach.
Si blocca dunque.
Ho provato a commentare
/*
foreach($_POST as $key=>$value) {
    if(strlen($value) !== 0)
*/
ma il risultato non cambia
quindi ho pensato che il problema sta in quel $_post.

Forse ho capito dov'è il problema...
Se non viene passato nessun valore la ricerca dovrebbe dare tutti i record.
Devo creare un controllo che faccia questo...

Questa è la soluzione:
$query = 'select * from mf_album';
$z = false;
if (isset($_POST["controllo"])) {
$query .= " where ";
foreach($_POST as $key=>$value) {
    if(strlen($value) !== 0) {
         switch($key) {
        case 'formato':
        case 'anno':
  case 'etichetta':
  case 'stato':
  case 'prezzo':
  case 'genere':
  case 'offerta':
            if($z)
                $query .= 'and ';
            $query .= " ${key} like ${value} ";
            $z = true;
            break;
  case 'artista':
  case 'titolo':
   if($z)
                $query .= 'and ';
            $query .= " ${key} like '%${value}%' ";
