$clause = " OR ";//Change to OR after 1st WHERE
Der obige ODER-Operator bewirkt, dass Ihre Where-Kriterien einen Datensatz auswählen, selbst wenn 1 Schlüsselwort mit dem attr-Feld übereinstimmt. Ändern Sie es in " UND ", um zu erwarten, dass alle Schlüsselwörter zutreffen.
Außerdem scheint das ... AND ATTRIBUTES.sub_cat_name='$aktuellesProdukt'"-Kriterium für alle Schlüsselwörter zu gelten, daher sollte dieses Kriterium einmal hinzugefügt werden, nicht bei jeder Iteration der Schleife. $aktuellesProdukt =$_POST['Produkt']; Reihe sollte auch vor die Schleife verschoben werden.
BEARBEITEN:Um darüber nachzudenken, den Operator in AND zu ändern und keine Zeilen zurückzugeben.
...ATTRIBUTES.attr LIKE BINARY '$c'...
Wenn es in $c keine Platzhalter gibt, dann erfordert das obige Kriterium, dass das Wort mit dem attr-Feld übereinstimmt, als ob der =-Operator verwendet worden wäre, was unwahrscheinlich ist. Bei der Suche müssen Platzhalter enthalten sein:'%$c%'
Außerdem wäre ein gewisser Schutz vor SQL-Injection auch schön.
EDIT2:Wenn jedes Attribut in einem eigenen Datensatz gespeichert wird, verkompliziert es die Dinge ein wenig, da das Where-Kriterium anhand eines einzelnen Datensatzes ausgewertet wird, nicht einer Sammlung von ihnen.
Ich gebe Ihnen ein Beispiel für einen Auswahlbefehl, aber Sie müssen ihn in Ihren PHP-Code einbauen.
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
Die Unterabfrage zählt, wie viele Attribute für ein Produkt gefunden wurden, und eliminiert diejenigen, bei denen die Anzahl nicht der Anzahl der über das Formular übermittelten Parameter entspricht. Die äußere Abfrage ruft die Produktdetails für diejenigen ab, bei denen die Anzahl übereinstimmt.
Für die ... in der in()-Klausel müssen Sie eine durch Komma getrennte, ' eingeschlossene Liste der Schlüsselwörter angeben, wie:"'Computer', 'Apfel'". Verwenden Sie die implode()-Funktion in PHP und die sztring-Verkettung, um die Ergebnisse zu erhalten.
Ersetzen Sie für ... in der Having-Klausel die Anzahl der Schlüsselwörter im Array $_POST['Schlüsselwort'] (Sie sollten jedoch im Code überprüfen, ob es sich um ein Array oder nur um einen einzelnen Wert handelt).
Dennoch sollten Sie die Auswirkungen der SQL-Einschleusung auf Ihren Code berücksichtigen.