Cześć. Od wielu godzin szukam rozwiązania problemu na 10.1.45-MariaDB-0+deb9u1 – Debian 9.12. Nie działa mi poprawnie następujący fragment kodu:
$opis_p = "%".$opis."%"; $stmt1 = $mysqli->prepare(" SELECT email, lokalizacja, data_znaleziska, opis FROM znalezione WHERE (data_znaleziska >= ?) AND (opis LIKE ?) ORDER BY data_znaleziska "); // $stmt1->bind_param('ss', $data_zguby, $opis_p); $result1 = $stmt1->execute(); $stmt1->bind_result($email, $lokalizacja, $data_znaleziska, $opis); $stmt1->store_result(); $stmt1->fetch();
Chodzi o maskę LIKE %slowo%. Pole OPIS ma takie np. wartość: Sowa kropka ZWIEJKA (oczywiście to jednej z rekordów). Jeśli szukam po słowie “sowa” wszystko jest OK – rekord się pojawia na liście wyników. Jeśli po “kropka” lub “zwiejka” (bez względu na wielkość liter), to rekord NIE JEST znajdowany (!!!!!). Najśmieszniejsze jest to, że gdy szuka po fragmencie słowa, czyli “krop”, to też jest OK. Nie mam pojęcia o co chodzi. Nie chciałbym uruchamiać strony BazaRzeczyZnalezionych.pl z taką “wadą”, ale jak nie będzie wyjścia… Dlatego HELLP PLEASE!!!
Spróbuj zrobić pełne zapytanie w prepare.
prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
Zbuduj pełne query i wykonaj bez bind. Będziesz mógł zobaczyć, co idzie do bazy i wykonać to w jakimś tool po podłączeniu się do bazy. Może gdzieś wkrada się spacja?
Dzięki za podpowiedź. Jak na razie nie używam PDO i może to nie bardzo dużo dodatkowej robot, ale poprzestanę na tym co napiszę pod komentarzem Marcina. Dzięki!
Poszperałem jeszcze w necie i na stackoverflow.com znalazłem coś “interesującego”. W moim przypadku zmieniłem kod na nastpujący stosujący przeszukiwania FULL TEXT
$opis = stripslashes(trim($_POST['opis'])); $opis_ok = '"+'.$opis.'+"'; $opis_p = '%'.$opis.'%'; $stmt1 = $mysqli->prepare(" SELECT email, lokalizacja, data_znaleziska, opis FROM znalezione WHERE (data_znaleziska >= ?) AND (( MATCH(opis) AGAINST (? IN BOOLEAN MODE) ) OR (opis LIKE ?)) ORDER BY data_znaleziska "); $stmt1->bind_param('sss', $data_zguby, $opis_ok, $opis_p); $result1 = $stmt1->execute(); $stmt1->bind_result($email, $lokalizacja, $data_znaleziska, $opis); $stmt1->store_result(); $stmt1->fetch();
Efekt jest taki, że jest poprawnie przy wyszykiwania po 1 i 2 słowach. Szuka i po całych słowach i po fragmentach, wiec nie będę sie już “kopał z koniem” tylko ogranicznę przeszukiwania bazy do frazy co najwyzej 2 wyrazowej (myślę że to i tak wystarczy, pewnie 90% przypadków to będzie jednej wyraz) i zamykam tę kwestię. Trzeba iść dalej 🙂
Dziekuję za pomoc!
Dziękuję za racjonalną podpowiedź. Niestety, upgreadowałem bazę do 10.4.16-MariaDB i nic się nie zmieniło. Jest jeszcze wersja 10.5 ale raczej poprzestanę na właściwej inforamcji w “instrukcji” do obsługi bazy zamiast stawiać wszytko od nowa z nikłą nadzieją że błąd został naprawiony.
Dzięki raz jeszcze.
PS.
A może zgłosić ten błąd do MariaDB Fundation?
Jeśli potwierdzisz, że to wina MariaDB, to jasne. Musiałbyś zainstalować ten sam skrypt i podpiąć inną bazę. Wtedy, jeśli zadziała, będziesz miał klarowny obraz sytuacji. Problem może też leżeć po stronie biblioteki PDO i ich wsparcia dla MariaDB. Trzeba popróbować.
Faktycznie, brzmi to nieprawdopodobnie. Być może jest to jakiś błąd w tych konkretnych wersjach oprogramowania, które wymieniasz.
To, co zrobiłbym najpierw, to zainstalował próbnie na innym środowisku (OS/baza danych/PHP) i spróbował, czy to zadziała. Wtedy próbowałbym uaktualniać oprogramowanie na Twoim serwerze. MariaDB 10.1 to dość stara wersja. Kurs PHP działa na 10.4.
Osobiście nigdy nie spotkałem się akurat z takim błędem.
Powodzenia w inwestygacji.
Opisywane działania można zobaczyć na stronie: https://non-profit.eu/!nav5.php . Jest ona under construction, więc proszę bez krytyki 😉