Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP :Rechercher dans la base de données mysql à l'aide de plusieurs listes déroulantes de sélection ?

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

L'opérateur OR ci-dessus fera en sorte que vos critères where sélectionnent un enregistrement même si 1 mot-clé correspond au champ attr. Remplacez-le par " ET " pour vous attendre à ce que tous les mots clés s'appliquent.

De plus, le critère ... AND ATTRIBUTES.sub_cat_name='$currentproduct'" semble s'appliquer à tous les mots-clés, donc ce critère doit être ajouté une fois, pas à chaque itération de la boucle. $currentproduct =$_POST['product']; la ligne doit également être déplacée devant la boucle.

EDIT :pour refléter le fait de changer l'opérateur en AND et de ne pas renvoyer de lignes.

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

S'il n'y a pas de caractères génériques dans $c, le critère ci-dessus exigera que le mot corresponde au champ attr comme si l'opérateur =avait été utilisé, ce qui est peu probable. Les caractères génériques doivent être inclus dans la recherche :'%$c%'

De plus, une protection contre l'injection sql serait également agréable.

EDIT2 :Si chaque attribut est stocké dans son propre enregistrement, cela complique un peu les choses, car le critère where est évalué par rapport à un seul enregistrement, et non à une collection d'entre eux.

Je vais vous donner un exemple de commande select, mais vous devrez l'incorporer dans votre code 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 sous-requête compte le nombre d'attributs correspondants pour un produit et élimine ceux dont le nombre n'est pas égal au nombre de paramètres soumis via le formulaire. La requête externe obtient les détails du produit pour ceux où le nombre correspond.

Pour le ... dans la clause in(), vous devez fournir une liste séparée par des virgules et fermée des mots-clés, comme :"'ordinateur', 'apple'". Utilisez la fonction implode() dans php et la concaténation szstring pour obtenir les résultats.

Remplacez le ... dans la clause having par le nombre de mots-clés dans le tableau $_POST['keyword'] (vous devez cependant vérifier dans le code s'il s'agit d'un tableau ou d'une seule valeur).

Néanmoins, vous devez tenir compte de l'impact de l'injection SQL sur votre code.