Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PHP:przeszukiwać bazę danych mysql przy użyciu wielu list rozwijanych wyboru?

$clause = " OR ";//Change  to OR after 1st WHERE

Powyższy operator OR spowoduje, że kryteria where będą wybierać rekord, nawet jeśli jedno słowo kluczowe pasuje do pola attr. Zmień go na „ ORAZ ”, aby wszystkie słowa kluczowe miały zastosowanie.

Co więcej, kryterium ... AND ATTRIBUTES.sub_cat_name='$currentproduct'" wydaje się dotyczyć wszystkich słów kluczowych, więc to kryterium powinno być dodawane raz, a nie przy każdej iteracji pętli. $currentproduct =$_POST['product']; wiersz powinien być również przesunięty przed pętlą.

EDYCJA:aby zastanowić się nad zmianą operatora na AND i bez zwracania żadnych wierszy.

...ATTRIBUTES.attr LIKE BINARY '$c'...

Jeśli w $c nie ma symboli wieloznacznych, powyższe kryterium będzie wymagało, aby słowo pasowało do pola attr, tak jakby użyto operatora =, co jest mało prawdopodobne. W wyszukiwaniu należy uwzględnić symbole wieloznaczne:„%$c%”

Dodatkowo przydałaby się pewna ochrona przed wstrzyknięciem sql.

EDIT2:Jeśli każdy atrybut jest przechowywany we własnym rekordzie, to trochę komplikuje sprawę, ponieważ kryteria gdzie są oceniane w odniesieniu do pojedynczego rekordu, a nie ich zbioru.

Dam ci przykładowe polecenie wyboru, ale będziesz musiał włączyć je do swojego kodu 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

Podzapytanie zlicza, ile atrybutów zostało dopasowanych do produktu i eliminuje te, których liczba nie jest równa liczbie parametrów przesłanych przez formularz. Zewnętrzne zapytanie pobiera szczegóły produktu dla tych, których liczba się zgadzała.

Dla ... w klauzuli in() musisz podać oddzieloną przecinkami, 'zawartą listę słów kluczowych, takich jak:"'komputer', 'jabłko'". Użyj funkcji implode() w konkatenacji php i sztring, aby uzyskać wyniki.

Dla ... w klauzuli having zastąp liczbę słów kluczowych w tablicy $_POST['keyword'] (należy jednak sprawdzić w kodzie, czy jest to tablica, czy tylko pojedyncza wartość).

Mimo to powinieneś rozważyć wpływ wstrzyknięcia sql na swój kod.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dlaczego sql z 'exists' działa wolniej niż 'in' przy użyciu MySQL

  2. Jak pobrać pierwszy i ostatni rekord rekordu zgrupowanego w zapytaniu MySQL za pomocą funkcji agregujących?

  3. Czy można zmienić tabelę w mySql za pomocą procedur składowanych?

  4. Połącz losowo dwa słowa z bazy danych MySQL

  5. Brak rekordów w połączonym zapytaniu