Mysql
 sql >> Database >  >> RDS >> Mysql

PHP:ricerca nel database mysql utilizzando più elenchi a discesa selezionati?

$clause = " OR ";//Change  to OR after 1st WHERE

L'operatore OR di cui sopra farà sì che i tuoi criteri where selezionino un record anche se 1 parola chiave corrisponde al campo attr. Cambialo in " AND " per aspettarti che tutte le parole chiave vengano applicate.

Inoltre, il criterio ... AND ATTRIBUTES.sub_cat_name='$currentproduct'" sembra essere applicato a tutte le parole chiave, quindi questo criterio dovrebbe essere aggiunto una volta, non ad ogni iterazione del ciclo. $currentproduct =$_POST['product']; la riga dovrebbe anche essere spostata davanti al ciclo.

EDIT:per riflettere sulla modifica dell'operatore in AND e sulla mancata restituzione di alcuna riga.

...ATTRIBUTES.attr LIKE BINARY '$c'...

Se non ci sono caratteri jolly in $c, il criterio precedente richiederà che la parola corrisponda al campo attr come se fosse stato utilizzato l'operatore =, cosa che è improbabile che accada. I caratteri jolly devono essere inclusi nella ricerca:'%$c%'

Inoltre, sarebbe utile anche una protezione dall'iniezione di sql.

EDIT2:Se ogni attributo è memorizzato nel proprio record, complica un po' le cose, poiché i criteri where vengono valutati rispetto a un singolo record, non a una raccolta di essi.

Ti darò un comando di selezione di esempio, ma dovrai incorporarlo nel tuo codice php.

select product_details.* FROM product_details INNER JOIN
    (select product_details.id, count(ATTRIBUTES.id) as total
     FROM `product_details`
     INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id
     WHERE ATTRIBUTES.attr in (...)
     GROUP BY product_details.id
     HAVING total=...) as t
on t.id=product_details.id

La sottoquery conta quanti attributi sono stati abbinati per un prodotto ed elimina quelli il cui conteggio non è uguale al numero di parametri inviati tramite il modulo. La query esterna ottiene i dettagli del prodotto per quelli in cui il conteggio corrispondeva.

Per la ... nella clausola in() è necessario fornire un 'elenco racchiuso di parole chiave separate da virgole, come:"'computer', 'apple'". Usa la funzione implode() nella concatenazione di php e sztring per ottenere i risultati.

Per la ... nella clausola having, sostituisci il numero di parole chiave nell'array $_POST['keyword'] (dovresti controllare nel codice se si tratta di un array o di un singolo valore, però).

Tuttavia, dovresti considerare l'impatto dell'iniezione di sql sul tuo codice.