Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Więcej niż 1 wyraz w wyszukiwarce
LeNy
post
Post #1





Grupa: Zarejestrowani
Postów: 102
Pomógł: 4
Dołączył: 17.01.2009

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


Witam. Mam problem z moją wyszukiwarką. Otóż gdy wpiszę w nią więcej niż 1 wyraz dla przykładu "test testu", to wyszukiwarka nie odnajduje żadnych rekordów mimo że w bazie są rekordy o nazwie i test i testu, natomiast jak wpisze pojedynczy tekst "test" albo "testu", to udaje jej się odnaleźć wymagane rekordy.
Oto moja funkcja dodająca % do każdego z wyrazów:
  1. function zapytanieSzukaj($text)
  2. {
  3. return('%' . str_replace(' ', '%', $text) . '%');
  4. }


A tak wygląda moje zapytanie:
  1. $likes = zapytanieSzukaj("test testu");
  2. "SELECT * FROM `NewsPhoto` WHERE `Tags` Like '$likes'"


Proszę o pomoc (IMG:style_emoticons/default/wstydnis.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Bo szukasz:

%test testu%

czyli wszystko co w "środku" będzie miało taką frazę zostanie znalezione

Musiałbyś rozbić słowa do tablicy, dodawać % i później połączyć z or like "innafraza"
Go to the top of the page
+Quote Post
Uriziel01
post
Post #3





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


Cytat(Fifi209 @ 17.03.2012, 10:06:19 ) *
Bo szukasz:

%test testu%

czyli wszystko co w "środku" będzie miało taką frazę zostanie znalezione

Musiałbyś rozbić słowa do tablicy, dodawać % i później połączyć z or like "innafraza"



Czytałeś ogólnie kod który podał @LeNy ?
  1. return('%' . str_replace(' ', '%', $text) . '%');


Ten post edytował Uriziel01 17.03.2012, 13:26:27
Go to the top of the page
+Quote Post
LeNy
post
Post #4





Grupa: Zarejestrowani
Postów: 102
Pomógł: 4
Dołączył: 17.01.2009

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


Funkcja, którą podałem dodaje do każdego wyrazu %%, więc gdy wpiszę "test testu" zamienia mi to na "%test%testu%" (IMG:style_emoticons/default/closedeyes.gif)

A więc jak mam zmienić zapytanie aby szukało mi tak jak trzeba?
Go to the top of the page
+Quote Post
Adi32
post
Post #5





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


Ja zaprodukowałem takie coś:

  1. function warunki($fraza,$kolumny) {
  2. $slowo = $fraza; // aby rozbić wyszukiwanie na osobne słowa - zakomentowa㇠tą… linię™ i odkomentować zakomentowane
  3. //$frazes = explode(' ',$fraza);
  4.  
  5. //foreach ($frazes as $slowo)
  6. //{
  7. $zbior[] = $slowo;
  8.  
  9. $ile = strlen($slowo);
  10.  
  11. if ($ile>5) {
  12. $_70 = $ile * 0.80; // im mniejsza będzie ta liczba tym więcej wygeneruje warunków krótszych fraz
  13. } else {
  14. $_70 = 4;
  15. }
  16.  
  17. $mniej = round($_70);
  18.  
  19. $x = $ile - $mniej;
  20.  
  21. for($i=0;$i<$x;$i++)
  22. {
  23. $zbior[] = mb_substr($slowo, $i, $mniej,'utf-8');
  24. }
  25.  
  26. for($i=0;$i<$ile;$i++)
  27. {
  28. $zbior[] = mb_substr($slowo,0,$i+1).' '.mb_substr($slowo,$i+1);
  29. }
  30.  
  31. $zbior[] = str_replace(' ','',$slowo);
  32.  
  33.  
  34. //}
  35.  
  36. foreach ($kolumny as $klucz => $kolumna) {
  37.  
  38. foreach ($zbior as $key => $fr) {
  39.  
  40. if (first($zbior,$key) and first($kolumny,$klucz)) {
  41.  
  42. $warunki .= $kolumna.' LIKE \'%'.$fr.'%\' ';
  43.  
  44. } else {
  45.  
  46. $warunki .= ' OR '.$kolumna.' LIKE \'%'.$fr.'%\' ';
  47.  
  48. }
  49.  
  50. }
  51.  
  52. }
  53.  
  54. return $warunki;
  55.  
  56. }


Użycie:

  1. $warunki_do_produktow = warunki($fraza, array('kolumna1', 'kolumna2', 'koluna'));
  2. $warunki_do_kategorii = warunki($fraza, array('nazwa', 'tresc'));
  3.  
  4. $wyniki_wyszukiwania_w_kategoriach = $db->query("SELECT * FROM kat WHERE ($warunki_do_kategorii) AND status=1 ")->res();
  5. $wyniki_wyszukiwania_w_produktach = $db->query("SELECT * FROM produkt WHERE ($warunki_do_produktow) $od $do $kategoria AND status = 1 ")->res();
  6.  
  7. $wyniki = array_merge($wyniki_wyszukiwania_w_produktach, $wyniki_wyszukiwania_w_kategoriach);
Go to the top of the page
+Quote Post
LeNy
post
Post #6





Grupa: Zarejestrowani
Postów: 102
Pomógł: 4
Dołączył: 17.01.2009

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


@Adi32 niestety mam błąd z foreach. Wykorzystałem funkcję tak:
  1. echo warunki("test testu", "Tags");

i zwróciło mi błąd:
  1. Warning: Invalid argument supplied for foreach() in .... on line 39


A linią tą jest:
  1. foreach ($kolumny as $klucz => $kolumna)
Go to the top of the page
+Quote Post
Adi32
post
Post #7





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


  1. warunki("test testu", array('Tags'));


edit:

dorzuć jeszcze gdzieś tą funkcję:

  1. function first($array,$key) {
  2. if (is_array($array)) {
  3. reset($array);
  4.  
  5. if(key($array) == $key)
  6. return true;
  7.  
  8. return false;
  9.  
  10. } else {
  11. $array = 0;
  12.  
  13. if($array == $key)
  14. return true;
  15.  
  16. return false;
  17. }
  18. }


Ten post edytował Adi32 17.03.2012, 18:30:01
Go to the top of the page
+Quote Post
LeNy
post
Post #8





Grupa: Zarejestrowani
Postów: 102
Pomógł: 4
Dołączył: 17.01.2009

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


Wszystko działa jak należy (IMG:style_emoticons/default/specool.gif)

Wielkie dzięki Adi32
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: 14.09.2025 - 18:29