Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Przebudowanie zapytania z LIKE na rzecz funkcji MATCH oraz AGAINST
Forum PHP.pl > Forum > Przedszkole
majestiq
Dostalem z home.pl info o tym, że używam nieefektywnego zapytania z LIKE i info o konieczności zamiany jak w temacie.
Coś mi nie idzie jednak ta zamiana,

Pierwotny kod wygląda w ten sposób:

  1. $sql = 'SELECT id,tytul,rozmiar,licznik,dlugosc FROM `'.$tabelka.'` WHERE `tytul` LIKE \'%'.$nazwa'%\' ORDER by tytul LIMIT 1000 ';
  2. $result = mysql_query($sql);


Da się to w ogóle tak zamienić, żęby nie używać LIKE jednak wyszukiwanie działało identycznie, tzn bez względu,
którą część frazy się w pisze i czy ma ona tylko 2znaki czy więcej ?

// Sami założyli mi indexy na bazie, któe podobno są konieczne w tym wypadku:

mysql> create fulltext index idx_tytul on artykuly(tytul);
kfc4
To jest wyszukiwanie pełnotekstowe. http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html . Najpierw musisz na `tytul` założyć index FULL TEXT.
A później:
  1. SELECT * FROM tabelka WHERE match(tytul,tresc) against ('szukany tekst' IN NATURAL LANGUAGE MODE);
majestiq
A czym jest 'tresc' ?
$sql = 'SELECT id,tytul,rozmiar,licznik,dlugosc FROM `'.$tabelka.'` - to jest treść ?

Rozumiem, że zamiast 'szukany tekst' mam dać $nazwa ?
kfc4
Nie, treść jest treścią, możesz to wywalić, dałem tam to z przyzwyczajenia, bo artykułów szuka się też po treści. A szukany tekst to tak - $nazwa. Masz opisane wszystko w dokumentacji (link wyżej).
majestiq
Wygląda, że jest już blisko - nie sypie błędami ale jako wynik wyświetla mi dalszą część skryptu,
która pojawia się w wypadku braku conajmniej jednego wyniku.

Może coś zjadłem ?

Podam jeszcze raz starą (poprawną wersję) z LIKE i nową nie do końca działającą:

  1.  
  2. //$sql = 'SELECT id,tytul,rozmiar,licznik,dlugosc FROM `'.$tabelka.'` WHERE `tytul` LIKE \'%'.$nazwa.'%\' ORDER by tytul LIMIT 1000 ';
  3.  
  4. $sql ='SELECT * FROM `'.$tabelka.'` WHERE match(tytul) against ($nazwa IN NATURAL LANGUAGE MODE)';
  5.  



O czym zapomniałem ?
kfc4
Hmm, zapytanie po lekkich modyfikacjach się wykonuje (po wywaleniu zmiennych) - więc powinno być OK. Zamiast $nazwa daj "'.$nazwa.'"
majestiq
Zrobiłem tak jak napisałeś i dalej to samo.
Może chodzi o to, że to nie jest powiązane z tym indexem:
mysql> create fulltext index idx_tytul on artykuly(tytul);
kfc4
Nie wiem o co chodzi. Trzeba kogoś mądrzejszego pytać. Odpaliłem painta żeby Ci pokazać, że jednak to działa.
[img=http://img36.imageshack.us/img36/5471/forumphppl.th.jpg]
majestiq
Hmm, dziwna sprawa.
Będę próbował dalej.

W każdym razie wielkie dzięki za zaangażowanie !


Jeszcze jedno, niby banał, ale nie mogę za pomocą print_r ani var_dump
podgladnac co jest w zmiennej:

  1.  
  2. $sql = 'SELECT id,tytul,rozmiar,licznik,dlugosc FROM `'.$tabelka.'` WHERE `tytul` LIKE \'%'.$nazwa.'%\' ORDER by tytul LIMIT 1000 ';
  3.  
  4. var_dump($sql);
  5. print_r($sql);
  6.  
  7. $result = mysql_query($sql);
  8. var_dump($result);
  9. print_r($result);
  10.  


W wyniku tych zapytań dostaje albo kopię zayptania sql-owego albo resource ale nie moge wyswietlic tego co zostalo pobrane z bazy:

string(105) "SELECT id,tytul,rozmiar,licznik,dlugosc FROM `tabela` WHERE `tytul` LIKE '%ddd%' ORDER by tytul LIMIT 1000 " SELECT id,tytul,rozmiar,licznik,dlugosc FROM `tabela` WHERE `tytul` LIKE '%ddd%' ORDER by tytul LIMIT 1000 resource(10) of type (mysql result) Resource id #10
Szukana fraza: ddd / znaleziono 129 rekordów

?
kfc4
var_dump jest do wyświetlenia rodzaju informacji, a print_r jest do wyświetlania tablic. Musisz dać $tablica = mysql_fetch_array($result), a później print_r($tablica). Tylko nie jestem pewien czy dobrze zapisałem nazwę tej funkcji - musisz sprawdzić w manualu.
PS. Czemu nie używasz MySQLi albo PDO? Są wygodniejsze w użyciu.
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.