$clause = " OR ";//Change to OR after 1st WHERE
上記のOR演算子を使用すると、1つのキーワードがattrフィールドに一致する場合でも、where基準でレコードが選択されます。すべてのキーワードが適用されることを期待するには、これを「AND」に変更します。
さらに、... AND ATTRIBUTES.sub_cat_name ='$ currentproduct' "基準はすべてのキーワードに適用されるようです。したがって、この基準は、ループのすべての反復ではなく、一度追加する必要があります。$ currentproduct =$ _POST ['product'];行もループの前に移動する必要があります。
編集:演算子をANDに変更し、行が返されないことを反映します。
...ATTRIBUTES.attr LIKE BINARY '$c'...
$ cにワイルドカードがない場合、上記の基準では、=演算子が使用されたかのように、単語がattrフィールドに一致する必要があります。これは発生する可能性が低いです。検索にはワイルドカードを含める必要があります:'%$ c%'
さらに、SQLインジェクションからの保護も必要です。
EDIT2:各属性が独自のレコードに保存されている場合、where基準はそれらのコレクションではなく単一のレコードに対して評価されるため、状況が少し複雑になります。
サンプルのselectコマンドを紹介しますが、これを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()句の...には、「'computer'、'apple'」のように、コンマで区切られたキーワードのリストを指定する必要があります。結果を取得するには、phpおよびsztring連結でimplode()関数を使用します。
持っている句の...の代わりに、$ _ POST ['keyword']配列のキーワードの数を置き換えます(ただし、配列か単一の値かをコードで確認する必要があります)。
それでも、SQLインジェクションがコードに与える影響を考慮する必要があります。