Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP:Търсене в mysql база данни с помощта на множество падащи списъци за избор?

$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 инжектирането върху вашия код.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL_ROOT_PASSWORD е зададен, но получаването на достъп е отказан за потребител 'root'@'localhost' (използвайки парола:ДА) в докер контейнера

  2. Изтрийте дублирани mysql редове без първичен ключ

  3. Използване на SSHTunnelForwarder за свързване към MySQL db чрез SSH

  4. Как да създадете нова диаграма на база данни с помощта на MySQL Workbench

  5. Изберете множество колони от множество таблици