$clause = " OR ";//Change to OR after 1st WHERE
Toán tử OR ở trên sẽ tạo ra tiêu chí where của bạn để chọn bản ghi ngay cả khi 1 từ khóa phù hợp với trường attr. Thay đổi nó thành "VÀ" để mong đợi tất cả các từ khóa áp dụng.
Hơn nữa, tiêu chí ... AND ATTRIBUTES.sub_cat_name ='$ currentproduct' "dường như áp dụng cho tất cả các từ khóa, vì vậy tiêu chí này nên được thêm một lần, không phải ở mỗi lần lặp lại của vòng lặp. $ Currentproduct =$ _POST ['product']; hàng cũng phải được di chuyển trong vòng lặp.
CHỈNH SỬA:để phản ánh việc thay đổi bộ tạo quang thành VÀ và không có bất kỳ hàng nào được trả lại.
...ATTRIBUTES.attr LIKE BINARY '$c'...
Nếu không có ký tự đại diện nào trong $ c, thì tiêu chí trên sẽ yêu cầu từ phải khớp với trường attr như thể toán tử =đã được sử dụng, điều này khó có thể xảy ra. Các ký tự đại diện phải được đưa vào tìm kiếm:'% $ c%'
Thêm vào đó, một số biện pháp bảo vệ khỏi tiêm sql cũng sẽ rất tốt.
EDIT2:Nếu mỗi thuộc tính được lưu trữ trong bản ghi của chính nó, thì nó sẽ phức tạp hóa mọi thứ một chút, vì nơi tiêu chí được đánh giá dựa trên một bản ghi duy nhất, không phải một bộ sưu tập của chúng.
Tôi sẽ cung cấp cho bạn một lệnh chọn mẫu, nhưng bạn sẽ phải kết hợp nó vào mã php của mình.
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
Truy vấn con đếm có bao nhiêu thuộc tính được so khớp cho một sản phẩm và loại bỏ những thuộc tính đó, trong đó số lượng không bằng số lượng thông số được gửi qua biểu mẫu. Truy vấn bên ngoài lấy chi tiết sản phẩm cho những thứ đó, nơi số lượng phù hợp.
Đối với ... trong mệnh đề in (), bạn cần cung cấp danh sách các từ khóa được phân tách bằng dấu phẩy, 'kèm theo, như:"' computer ',' apple '". Sử dụng hàm implode () trong ghép nối php và sztring để nhận kết quả.
Đối với ... trong mệnh đề có, hãy thay thế số lượng từ khóa trong mảng $ _POST ['keyword'] (mặc dù vậy, bạn nên kiểm tra mã xem đó là một mảng hay chỉ một giá trị).
Tuy nhiên, bạn nên xem xét tác động của việc tiêm sql lên mã của bạn.