Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyszukiwanie ze środka frazy
Forum PHP.pl > Forum > Przedszkole
xSebaPL
Witam wszystkich, mam taki problem. Otóż podczas wpisania frazy wyszukiwania, trzeba wpisywać literkę po literce od początku. Nie można napisać tylko drugiego wyrazu albo tylko środka wyrazu, bo wtedy nie zadziała. Że np. fraza 'Kac Vegas', żeby wyszukać trzeba po kolei wpisywać k, a, c, (odstęp), v, e, g, a, s. Nie można np. wpisać frazy 'vegas' bo wtedy nie znajduje, tak samo nie można wpisać po prostu 'gas' ze słowa 'veGAS' bo też nie znajdzie. Więc czy moglibyście mi powiedzieć jak zrobić żeby wyszukiwało z dowolnego miejsca w wyrazie, albo w całej nazwie? Żeby nie trzeba było pisać od początku? Tak to wygląda aktualnie:
  1. $stmt = $db->prepare("SELECT NAME as movie FROM `movies` WHERE NAME LIKE ? ORDER BY movie");
  2.  
  3. $keyword = $keyword . '%';
  4. $stmt->bindParam(1, $keyword, PDO::PARAM_STR, 100);
  5.  
  6. $isQueryOk = $stmt->execute();
com
no to dodaj jakiś payload i otocz go %
xSebaPL
payload ? Tak po polsku i na chłopski rozum prosiłbym wink.gif
com
no fraze której potrzebujesz i ma tam być, zawsze można %% ale nie o to pytałeś chyba
xSebaPL
Spójrz na kod ten funkcji:
  1. function searchForKeyword($keyword) {
  2. $db = getDbConnection();
  3. $stmt = $db->prepare("SELECT NAME as movie FROM `movies` WHERE NAME LIKE ? ORDER BY movie");
  4.  
  5. $keyword = $keyword . '%';
  6. $stmt->bindParam(1, $keyword, PDO::PARAM_STR, 100);
  7.  
  8. $isQueryOk = $stmt->execute();
  9.  
  10. $results = array();
  11.  
  12. if ($isQueryOk) {
  13. $results = $stmt->fetchAll(PDO::FETCH_COLUMN);
  14. } else {
  15. trigger_error('Error executing statement.', E_USER_ERROR);
  16. }
  17.  
  18. $db = null;
  19.  
  20. return $results;
  21. }


Aktualnie funkcja zwraca wszystkie rekordy zaczynające się na frazę(czyli zmienną $keyword), a mi chodzi o to żeby zwracała wszystkie rekordy które ogólnie zawierają tą fraze(zmienną $keyword). Rozumiesz mnie teraz?

Jak masz rekord o nazwie 'Kac', to aktualnie funkcja zwraca ten rekord tylko po wpisaniu 'k', 'ka', oraz 'kac', a ja chcę żeby zwracała też po wpisaniu 'ac', albo nawet samego 'a' albo samego 'c'. Rozumiesz?
BigPig
Kolega @com dobrze mówi, zamiast:

  1. $keyword = $keyword . '%';


Zrób:

  1. $keyword = '%' . $keyword . '%';


Musisz zainteresować się tym co oznacza znak '%'. W przypadku użycia LIKE w zapytaniu, oznacza ono dowolny ciąg znaków. Mając znak procentu tylko z tyłu, zapytanie zachowywało się tak jakby podana fraza ZAWSZE miała być początkiem wartości trzymanej w danym polu. Stąd te wyniki. Jak miałeś frazę 'Kac Vegas', to przy Twoim zapisie, zawsze było trzeba wprowadzić początek czyli 'Kac'. Wprowadź zmianę o, której napisałem i powiedz czy o to Ci chodziło.
com
no to albo robisz tak jak napisał Ci jeszcze raz BigPig, albo szukasz dosłownie wszystko czyli %%
xSebaPL
Dzięki, po prostu nie zrozumiałem na początku co dadzą te %%, nie jestem za bardzo kumaty closedeyes.gif
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.