![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 31.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 380 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Troszkę teorii na pewno się przyda: http://dev.mysql.com/doc/refman/5.0/en/cha...-binary-op.html
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 31.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
#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 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 380 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 31.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
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? Ten post edytował flaa 13.04.2012, 14:47:57 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 380 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Napis zależy od kodowania jakie ustalisz przy połączeniu. Jeśli trzymasz w UTF, ma być UTF i wtedy widzisz normalnie.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 05:08 |