Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Problem z funkcj± lower()
Forum PHP.pl > Forum > Przedszkole
flaa
Helo

Chciałem unikn±ć przekłamań przy logowaniu, tzn żeby użytkownik był w stanie się zalogować je¶li wpisze swój login małymi literami mimo, że w bazie login np zaczyna się od dużej litery. W tym celu 'zmniejszam' login pobrany od użytkownika i porównuję go w zapytaniu mysql z użyciem funkcji lower(). Problem jednak jest taki: funkcja lower pomniejsza tylko czę¶ć polskich znaków. Tzn pomniejszy ó, ę, ń, ć, ale znaki ˇ, Ł, Ż, ¬ i ¦ pozostan± duże. Czytałem trochę o kodowaniu, ale nie znalazłem nic, co by mogło pomóc - dotychczas miałem w polu 'login' kodowanie utf8_general_ci (które notabene radziło sobie z pomniejszaniem ¦, ale niektórymi innymi już nie), teraz zmieniłem na utf8_polish_ci i efekt jest taki, jaki opisałem. Próbowałem też używać zapytań w stylu mysql_query('SET NAMES utf8'), jednak wtedy powstaj± już krzaczki. Dodam, że nie mam żadnego innego problemu z wy¶wietlaniem polskich znaków z bazy - problem pojawia się dopiero, gdy używam funkcji lower(). Prosiłbym o jakiekolwiek pomysły jak rozwi±zać ten problem.

pozdrawiam!
flaa
Sephirus
Je¶li masz w bazie utf8_polish_ci to podawaj login bez żadnej dodatkowej funkcji i to samo powinno działać. Dostajesz login z POST - wrzucasz bez zmiany na małe litery do zapytania w którym to też nie używasz żadnych dodatkowych funkcji

  1. // jak masz w bazie utf8_polish_ci to to powinno działać tak jak chcesz:
  2. $login = mysql_real_escape_string($_POST['login']);
  3. $sql = "SELECT * FROM users WHERE login='{$login}' AND ...";
  4. mysql_query($sql); // itd...
  5.  
viking
Troszkę teorii na pewno się przyda: http://dev.mysql.com/doc/refman/5.0/en/cha...-binary-op.html
flaa
#Sephirus
Zrobiłem jak mówiłe¶ - efekt jest wła¶ciwie taki sam, jak przy pomniejszaniu nicku. Tzn wprowadziłem nowy login o nazwie "ˇĆĘŁŃӦݬ-ACELNOSZac" i po kolei sprawdzałem dla jakich pomniejszonych liter się zaloguję. Był bł±d jedynie gdy próbowałem napisać ˇ, Ł, Ż, ¬ lub ¦ z małej litery. Chociaż dzięki, że mi o tym powiedziałe¶ - my¶lałem, że wszędzie trzeba będzie na piechotę pomniejszać ;)

#viking
Jak dobrze zrozumiałem, to wyszukiwanie binarne porównuje dokładnie każd± literę z osobna, rozróżniaj±c małe i wielkie - chodziło mi o dokładnie co¶ odwrotnego, by znalazł ten sam rekord wpisany przez użytkownika bez zwracania uwagi na wielko¶ć liter :P

Nie mam pojęcia czemu mysql nie radzi sobie z tymi kilkoma literami... ostatecznie mógłbym sobie napisać jak±¶ funkcję, która wyci±gnie login z bazy, pomniejszy go za pomoc± funkcji php i dopiero wtedy porówna z loginem podanym przez użytkownika. Ale takie co¶ będzie 'odrobinkę' nieoptymalne... ;d
viking
Wiem. Mnie chodziło o to że aby Mysql porównywał wielko¶ć liter musisz mu to jawnie przekazać za pomoc± BINARY. W innym razie porównuje nie uwzględniaj±c wielko¶ci znaków. A mysql_real_* ma zabezpieczyć przed SQL Injection.
flaa
Trochę pokombinowałem i sam nie wiem jak, ale w końcu zatrybiło. Jednak jeszcze jedno pytanie, coby się upewnić - wprowadzony normalnie INSTERTem napis jest zapisany w bazie w czytelnej formie, tzn "ˇĆ¦ĘŃŃӦݬ". Rozumiem, że tak ma to wygl±dać? Dotychczas (przy jakim¶ innym kodowaniu chyba) trzymało w bazie krzaczki, ale po wyci±gnięciu wy¶wietlało normalny tekst i wolę się upewnić, że wszystko jest w porz±dku ;d


stara czę¶ć posta
Tak, już rozumiem co miałe¶ na my¶li. I dlatego tym bardziej nie rozumiem czemu u mnie to nie działa ;o
Zrobiłem sobie eksperymentalnie now± tabelę: pole 'login1' typu TEXT i 'login2' typu VARCHAR, oba kodowanie utf8_polish_ci. Wprowadziłem do obu tekst 'ˇĆĘŁŃӦݬ'. Po użyciu funkcji lower() (użyłem j± tylko do testu, bo już wiem, że można inaczej, ale było szybciej) strona wypluła tekst 'ˇćęŁń󦯬'. Potem zmieniłem sobie na kodowanie utf8_general_ci i efekt ten sam. Dalej jest problem z pomniejszaniem ˇ, Ł, ¦, Ż, ¬ i zwykłe porównywanie bez funkcji lower() pewnie też nie zadziała. Ma kto¶ jakie¶ pomysły dlaczego?
viking
Napis zależy od kodowania jakie ustalisz przy poł±czeniu. Je¶li trzymasz w UTF, ma być UTF i wtedy widzisz normalnie.
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.