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

PHP:Søg i mysql-database ved hjælp af flere udvalgte rullelister?

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

Ovenstående OR-operator vil få dit where-kriterier til at vælge en post, selvom 1 søgeord matcher attr-feltet. Skift det til " OG " for at forvente, at alle søgeord gælder.

Ydermere ser ... AND ATTRIBUTES.sub_cat_name='$currentproduct'"-kriteriet ud til at gælde for alle søgeord, så dette kriterium bør tilføjes én gang, ikke ved hver iteration af løkken. $currentproduct =$_POST['product']; rækken skal også flyttes foran løkken.

EDIT:for at overveje at ændre operatøren til OG og ikke have nogen rækker returneret.

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

Hvis der ikke er jokertegn i $c, vil ovenstående kriterium kræve, at ordet matcher attr-feltet, som om =operatoren var blevet brugt, hvilket næppe vil ske. Jokertegn skal inkluderes i søgningen:'%$c%'

Plus noget beskyttelse mod sql-injektion ville også være rart.

EDIT2:Hvis hver attribut er gemt i sin egen post, så komplicerer det tingene en smule, da where-kriteriet evalueres mod en enkelt post, ikke en samling af dem.

Jeg giver dig en prøvevalgskommando, men du bliver nødt til at inkorporere den i din php-kode.

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

Underforespørgslen tæller, hvor mange attributter der blev matchet for et produkt og eliminerer dem, hvor antallet ikke svarer til antallet af parametre indsendt via formularen. Den ydre forespørgsel får produktdetaljerne for dem, hvor antallet matchede.

For ... i in()-sætningen skal du angive en kommasepareret, ' medfølgende liste over nøgleordene, såsom:"'computer', 'æble'". Brug implode()-funktionen i php- og sztring-sammenkædning for at få resultaterne.

For ... i have-sætningen erstatter antallet af søgeord i $_POST['søgeord']-arrayet (du skal dog tjekke koden ind, om det er et array eller kun en enkelt værdi).

Alligevel bør du overveje indvirkningen af ​​sql-injektion på din kode.




  1. Vælg tilfældige rækker i mysql og begræns inden for hver gruppe

  2. Hvordan ser jeg Explain Plan i Oracle SQL-udvikler?

  3. egenskaben "diesel::Expression" er ikke implementeret for "bigdecimal::BigDecimal"

  4. PHP Mysql Json og arabisk sprog