sql >> Databasteknik >  >> RDS >> Mysql

PHP:Söka i mysql-databasen med hjälp av rullgardinslistor med flera val?

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

Ovanstående ELLER-operator kommer att få ditt where-kriterier att välja en post även om ett nyckelord matchar attr-fältet. Ändra det till " OCH " för att förvänta dig att alla sökord ska tillämpas.

Dessutom verkar ... AND ATTRIBUTES.sub_cat_name='$currentproduct'"-kriteriet gälla för alla sökord, så detta kriterium bör läggas till en gång, inte vid varje iteration av loopen. $currentproduct =$_POST['product']; raden ska också flyttas framför slingan.

EDIT:för att reflektera över att ändra operatören till AND och inte få några rader tillbaka.

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

Om det inte finns några jokertecken i $c, kommer ovanstående kriterium att kräva att ordet matchar attr-fältet som om =operatorn hade använts, vilket är osannolikt att hända. Jokertecken måste inkluderas i sökningen:'%$c%'

Plus lite skydd mot sql-injektion skulle också vara bra.

EDIT2:Om varje attribut lagras i sin egen post, så komplicerar det saker och ting lite, eftersom where-kriteriet utvärderas mot en enda post, inte en samling av dem.

Jag ger dig ett exempel på kommandot för att välja, men du måste infoga det i din php-kod.

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

Underfrågan räknar hur många attribut som matchades för en produkt och eliminerar de där antalet inte är lika med antalet parametrar som skickats in via formuläret. Den yttre frågan får produktinformationen för de där antalet matchade.

För ... i in()-satsen måste du ange en kommaseparerad, ' bifogad lista med nyckelord, som:"'dator', 'apple'". Använd implode()-funktionen i php- och sztring-sammansättning för att få resultaten.

Ersätt antalet nyckelord i $_POST['sökord']-matrisen för ... i having-satsen (du bör dock kontrollera koden om det är en matris eller bara ett enda värde).

Ändå bör du överväga inverkan av sql-injektion på din kod.




  1. Hur väljer man den n:e raden i en SQL-databastabell?

  2. Android SQlite uppdaterar inte data

  3. SQL Server Query - gruppvis multiplikation

  4. Hur man använder python mysqldb för att infoga många rader samtidigt