Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MYSQL] Wyszukiwanie likiem w wielu kolumnach
Zwariowany
post
Post #1





Grupa: Zarejestrowani
Postów: 201
Pomógł: 0
Dołączył: 6.01.2009

Ostrzeżenie: (20%)
X----


Mam w tabeli trzy kolumny. Imię, nazwisko, nick. Np. Jan, Kowalski, Kowal. I teraz moje pytanie. Jeżeli użytkownik chcę go znaleźć i wpisuje w wyszukiwarkę Jan Kowalski Kowal, to jak zrobić, żeby like dotyczyło wszystkim kolumn i dopasowywało fragment z tego kodu? bo takie coś to niestety nie działa:

SELECT * FROM `users` WHERE (`imie` LIKE 'Jan Kowalski Kowal') OR (`nazwisko` LIKE 'Jan Kowalski Kowal') OR (`nick` LIKE 'Jan Kowalski Kowal')
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




to nie jest takie proste.
Zrob sprytny kod który ci to ułatwi
1) rozbije ciag na słowa
2) wstawi te slowa do poszczegolnych kolumn w takiej postaci
[sql]
pole LIKE '%slowo1%' OR pole like '%slowo2%' itd

przydatne funkcje
http://php.net/explode - rozbijanie na slowa
http://php.net/implode - warunki wrzucasz do tablicy ktore potem laczysz ciagem ' OR '
Go to the top of the page
+Quote Post
Zwariowany
post
Post #3





Grupa: Zarejestrowani
Postów: 201
Pomógł: 0
Dołączył: 6.01.2009

Ostrzeżenie: (20%)
X----


Już próbowałem rozbijać, ale doszedłem do wniosku, że jeżeli użytkownik np wpiszę: Jan Kowalski Janek pogromca czarnych jajek. To co wtedy? już nie będzie tak łatwo, że to rozbiję, bo nie wiem ile będzie słów, dlatego szukam jakiegoś innego rozwiązania.
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




musisz ograniczyc uzytkownikowi ilsoc znakow albo słow. to juz zalezy od ciebie. ta metoda jest najprostsza pomijajac wyszukiwanie pełnotekstowe (fulltext)
Go to the top of the page
+Quote Post
Zwariowany
post
Post #5





Grupa: Zarejestrowani
Postów: 201
Pomógł: 0
Dołączył: 6.01.2009

Ostrzeżenie: (20%)
X----


uznałem, że 5 słów to najwięcej ile może być sprawdzane ze wszystkimi polami: oto kod dla imie i nazwisko 

  1. <?php
  2. if ($ile == '1')
  3. {
  4. $poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
  5. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  6. }
  7.  
  8. if ($ile == '2')
  9. {
  10. $poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
  11. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  12. $poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
  13. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
  14. }
  15.  
  16. if ($ile == '3')
  17. {
  18. $poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
  19. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  20. $poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
  21. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
  22. $poczatek.=' OR `imie` LIKE '%'.$eksplode[2].'%'';
  23. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[2].'%'';
  24. }
  25.  
  26. if ($ile == '4')
  27. {
  28. $poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
  29. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  30. $poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
  31. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
  32. $poczatek.=' OR `imie` LIKE '%'.$eksplode[2].'%'';
  33. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[2].'%'';
  34. $poczatek.=' OR `imie` LIKE '%'.$eksplode[3].'%'';
  35. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[3].'%'';
  36. }
  37.  
  38. if ($ile == '5')
  39. {
  40. $poczatek.='`imie` LIKE '%'.$eksplode[0].'%'';
  41. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  42. $poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
  43. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
  44. $poczatek.=' OR `imie` LIKE '%'.$eksplode[2].'%'';
  45. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[2].'%'';
  46. $poczatek.=' OR `imie` LIKE '%'.$eksplode[3].'%'';
  47. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[3].'%'';
  48. $poczatek.=' OR `imie` LIKE '%'.$eksplode[4].'%'';
  49. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[4].'%'';
  50. }
  51. ?>
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




to wcale nie jest sprytny skrypt...
  1. <?php
  2. $fields=array('imie', 'nazwisko');
  3.  
  4. $where=array();
  5.  
  6. // wywalamy puste "słowa"
  7. $slowa=array_filter($slowa, 'trim');
  8.  
  9. // jezeli jest za duzo słow to bierzemy tylko nasze 5
  10. if(count($slowa)>5) $slowa=array_slice($slowa, 0, 5);
  11.  
  12. foreach($slowa as $slowo)
  13. {
  14.    foreach($fields as $field)
  15.    {
  16.        $where[]=$field.' LIKE '%'.mysql_real_escape_string($slowo).'%'';
  17.    }
  18. }
  19.  
  20. $twojeWhere=implode(' OR ',$where);
  21. ?>

Czyż nie łatwiej + bezpieczniej + efektywniej

Ja rozumiem początkujący etap ale podałem ci link do implode który jest bardzo dużym ułatwieniem

Ten post edytował wookieb 18.07.2009, 22:44:03
Go to the top of the page
+Quote Post
Zwariowany
post
Post #7





Grupa: Zarejestrowani
Postów: 201
Pomógł: 0
Dołączył: 6.01.2009

Ostrzeżenie: (20%)
X----


Ale tutaj nawet na początku zapytania na wstępie wywali OR a przecież pierwszy `name` nie może być z OR 
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Sprawdź a potem mów.
Twój post oznacza, że nadal nie przeczytałeś o implode...

Ten post edytował wookieb 18.07.2009, 22:53:53
Go to the top of the page
+Quote Post
planet
post
Post #9





Grupa: Zarejestrowani
Postów: 61
Pomógł: 6
Dołączył: 15.07.2009
Skąd: Śląsk->Ruda Śląska

Ostrzeżenie: (0%)
-----


implode wstawia OR pomiędzy wyrazy, analogicznie z tego co piszesz należałoby sądzić, że po ostatnim parametrze też doda OR a tak nie jest. kod, który podał wookieb na pewno jest poprawny.

Ten post edytował planet 19.07.2009, 12:56:32
Go to the top of the page
+Quote Post
rama
post
Post #10





Grupa: Zarejestrowani
Postów: 50
Pomógł: 1
Dołączył: 25.02.2006
Skąd: Trójmiasto

Ostrzeżenie: (0%)
-----


Cytat(Zwariowany @ 18.07.2009, 21:40:44 ) *
SELECT * FROM `users` WHERE (`imie` LIKE 'Jan Kowalski Kowal') OR (`nazwisko` LIKE 'Jan Kowalski Kowal') OR (`nick` LIKE 'Jan Kowalski Kowal')


Innym sposobem jest złączenie "kolumn" poprzez funkcję CONCAT, chociaż rozwiązanie to może być kosztowne.
  1. SELECT * FROM `users` WHERE CONCAT(`imie`,`nazwisko`,`nick`) LIKE '%wyrazenie_szukane%';
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 01:36