Za darmo na e-mailPraktyczny kurs PHP (aż 200 stron!)

Krok po kroku, opanuj podstawy PHP za darmo - praktyczny kurs w formie e-booka prosto na Twój e-mail

Dlaczego nie działa poprawnie LIKE %slowo% w prepared statement

odsłon: 3.45KMariaDB mysql php
0

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!!!

dodał nowy komentarz

Opisywane działania można zobaczyć na stronie: https://non-profit.eu/!nav5.php . Jest ona under construction, więc proszę bez krytyki 😉

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!

Dodaj komentarz
1

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!

Zmienił status na: opublikowane
Dodaj komentarz
0

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?

dodał nowy komentarz

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ć.

Dodaj komentarz
0

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.

odpowiedział na pytanie
Dodaj komentarz
Wpisz swoją odpowiedź.
Ominiesz taką okazję?Praktyczny Kurs PHP (aż 200 stron!) za darmo

Gorąco polecam, naprawdę warto skorzystać! To nic nie kosztuje. Krok po kroku, opanuj podstawy PHP za darmo - praktyczny kurs w formie e-booka prosto na Twój e-mail.