$clause = " OR ";//Change to OR after 1st WHERE
Powyższy operator OR spowoduje, że kryteria where będą wybierać rekord, nawet jeśli jedno słowo kluczowe pasuje do pola attr. Zmień go na „ ORAZ ”, aby wszystkie słowa kluczowe miały zastosowanie.
Co więcej, kryterium ... AND ATTRIBUTES.sub_cat_name='$currentproduct'" wydaje się dotyczyć wszystkich słów kluczowych, więc to kryterium powinno być dodawane raz, a nie przy każdej iteracji pętli. $currentproduct =$_POST['product']; wiersz powinien być również przesunięty przed pętlą.
EDYCJA:aby zastanowić się nad zmianą operatora na AND i bez zwracania żadnych wierszy.
...ATTRIBUTES.attr LIKE BINARY '$c'...
Jeśli w $c nie ma symboli wieloznacznych, powyższe kryterium będzie wymagało, aby słowo pasowało do pola attr, tak jakby użyto operatora =, co jest mało prawdopodobne. W wyszukiwaniu należy uwzględnić symbole wieloznaczne:„%$c%”
Dodatkowo przydałaby się pewna ochrona przed wstrzyknięciem sql.
EDIT2:Jeśli każdy atrybut jest przechowywany we własnym rekordzie, to trochę komplikuje sprawę, ponieważ kryteria gdzie są oceniane w odniesieniu do pojedynczego rekordu, a nie ich zbioru.
Dam ci przykładowe polecenie wyboru, ale będziesz musiał włączyć je do swojego kodu 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
Podzapytanie zlicza, ile atrybutów zostało dopasowanych do produktu i eliminuje te, których liczba nie jest równa liczbie parametrów przesłanych przez formularz. Zewnętrzne zapytanie pobiera szczegóły produktu dla tych, których liczba się zgadzała.
Dla ... w klauzuli in() musisz podać oddzieloną przecinkami, 'zawartą listę słów kluczowych, takich jak:"'komputer', 'jabłko'". Użyj funkcji implode() w konkatenacji php i sztring, aby uzyskać wyniki.
Dla ... w klauzuli having zastąp liczbę słów kluczowych w tablicy $_POST['keyword'] (należy jednak sprawdzić w kodzie, czy jest to tablica, czy tylko pojedyncza wartość).
Mimo to powinieneś rozważyć wpływ wstrzyknięcia sql na swój kod.