$clause = " OR ";//Change to OR after 1st WHERE
उपरोक्त OR ऑपरेटर आपके जहां मानदंड को रिकॉर्ड का चयन करने का कारण बनेगा, भले ही 1 कीवर्ड attr फ़ील्ड से मेल खाता हो। सभी खोजशब्दों के लागू होने की अपेक्षा करने के लिए इसे " AND " में बदलें।
इसके अलावा, ... और ATTRIBUTES.sub_cat_name='$currentproduct'" मानदंड सभी कीवर्ड पर लागू होता है, इसलिए यह मानदंड एक बार जोड़ा जाना चाहिए, न कि लूप के प्रत्येक पुनरावृत्ति पर। $currentproduct =$_POST['product']; पंक्ति को भी लूप के सामने ले जाया जाना चाहिए।
संपादित करें:opreator को AND में बदलने और कोई पंक्तियाँ वापस न आने पर प्रतिबिंबित करने के लिए।
...ATTRIBUTES.attr LIKE BINARY '$c'...
यदि $c में कोई वाइल्डकार्ड नहीं है, तो उपरोक्त मानदंड के लिए शब्द को attr फ़ील्ड से मेल खाने की आवश्यकता होगी जैसे कि =ऑपरेटर का उपयोग किया गया था, जो होने की संभावना नहीं है। वाइल्डकार्ड्स को खोज में शामिल किया जाना चाहिए:'%$c%'
साथ ही sql इंजेक्शन से कुछ सुरक्षा भी अच्छी होगी।
EDIT2:यदि प्रत्येक विशेषता को अपने स्वयं के रिकॉर्ड में संग्रहीत किया जाता है, तो यह चीजों को थोड़ा जटिल करता है, क्योंकि जहां मानदंड का मूल्यांकन एकल रिकॉर्ड के विरुद्ध किया जाता है, न कि उनके संग्रह के लिए।
मैं आपको एक नमूना चयन आदेश दूंगा, लेकिन आपको इसे अपने 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
सबक्वेरी यह गिनती है कि किसी उत्पाद के लिए कितनी विशेषताओं का मिलान किया गया था और उन विशेषताओं को हटा देता है, जहां गणना फ़ॉर्म के माध्यम से सबमिट किए गए पैरामीटर की संख्या के बराबर नहीं होती है। बाहरी क्वेरी उन लोगों के लिए उत्पाद विवरण प्राप्त करती है, जहां गिनती मेल खाती है।
इन () क्लॉज में ... के लिए आपको अल्पविराम से अलग, 'कीवर्ड्स की संलग्न सूची, जैसे:"'कंप्यूटर', 'सेब'" प्रदान करने की आवश्यकता है। परिणाम प्राप्त करने के लिए php और szstring संयोजन में implode() फ़ंक्शन का उपयोग करें।
के लिए ... वाले क्लॉज में $_POST['keyword'] सरणी में कीवर्ड की संख्या को प्रतिस्थापित करें (यदि यह एक सरणी है या केवल एक मान है, तो आपको कोड में जांच करनी चाहिए)।
फिर भी, आपको अपने कोड पर sql इंजेक्शन के प्रभाव पर विचार करना चाहिए।