Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Więcej niż 1 wyraz w wyszukiwarce
Forum PHP.pl > Forum > PHP
LeNy
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 wstydnis.gif
Fifi209
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"
Uriziel01
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) . '%');
LeNy
Funkcja, którą podałem dodaje do każdego wyrazu %%, więc gdy wpiszę "test testu" zamienia mi to na "%test%testu%" closedeyes.gif

A więc jak mam zmienić zapytanie aby szukało mi tak jak trzeba?
Adi32
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);
LeNy
@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)
Adi32
  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. }
LeNy
Wszystko działa jak należy specool.gif

Wielkie dzięki Adi32
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.