flaa
11.04.2012, 14:25:47
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
11.04.2012, 14:29:44
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
// jak masz w bazie utf8_polish_ci to to powinno działać tak jak chcesz:
$sql = "SELECT * FROM users WHERE login='{$login}' AND ...";
viking
11.04.2012, 14:33:22
flaa
11.04.2012, 15:39:52
#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
11.04.2012, 15:50:24
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
13.04.2012, 14:46:44
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
13.04.2012, 15:06:50
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.