$clause = " OR ";//Change to OR after 1st WHERE
Операторът OR по-горе ще накара вашите критерии за избор на запис, дори ако 1 ключова дума съвпада с полето attr. Променете го на „И“, за да очаквате всички ключови думи да се прилагат.
Освен това, критерият ... AND ATTRIBUTES.sub_cat_name='$currentproduct'" изглежда се прилага за всички ключови думи, така че този критерий трябва да се добавя веднъж, а не при всяка итерация на цикъла. $currentproduct =$_POST['product']; редът също трябва да бъде преместен отпред на цикъла.
РЕДАКТИРАНЕ:да се отрази промяната на оператора на AND и да не се връщат никакви редове.
...ATTRIBUTES.attr LIKE BINARY '$c'...
Ако няма заместващи знаци в $c, тогава горният критерий ще изисква думата да съответства на полето attr, сякаш е бил използван оператор =, което е малко вероятно да се случи. Заместващите знаци трябва да бъдат включени в търсенето:'%$c%'
Плюс известна защита от sql инжекция също би била добра.
РЕДАКТИРАНЕ2:Ако всеки атрибут се съхранява в собствен запис, това малко усложнява нещата, тъй като критериите where се оценяват спрямо един запис, а не колекция от тях.
Ще ви дам примерна команда за избор, но ще трябва да я включите във вашия 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
Подзаявката отчита колко атрибута са били съпоставени за даден продукт и елиминира тези, при които броят не е равен на броя параметри, изпратени чрез формуляра. Външната заявка получава подробности за продукта за тези, при които броят е съвпаднал.
За ... в клаузата in() трябва да предоставите разделен със запетая ' затворен списък с ключови думи, като:"'компютър', 'ябълка'". Използвайте функцията implode() в php и szstring конкатенация, за да получите резултатите.
За ... в клаузата за заместване на броя на ключовите думи в масива $_POST['keyword'] (трябва да проверите в кода дали е масив или само една стойност).
Все пак трябва да вземете предвид влиянието на sql инжектирането върху вашия код.