Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Porównywanie polskich znaków (UTF8)
Kikert
post 24.08.2012, 14:20:58
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 15.09.2008

Ostrzeżenie: (0%)
-----


Cześć,
mam problem z porównywaniem znaków w skrypcie konkursowym. Działa to na zasadzie czatu AJAXowego, użytkownik musi trafić w jedną z trzech odpowiedzi. Niestety, okazuje się, że jeżeli odpowiedź prawidłowa zawiera polskie znaki a użytkownika nie, to i tak się zgadzają. Przykładowo SELECT 'pozar' = 'pożar' się zgadza. Nie wiem jak temu zapobiec.

Niżej kod, który to u mnie sprawdza (przed sprawdzeniem odpowiedzi konwertuję wszystkie litery na małe):
  1. $message = trim($_POST['message']);
  2.  
  3. $message = $db->real_escape_string($message);
  4. $message_lowercase = strtolower($message);
  5.  
  6. $db->query("LOCK TABLE {$DBP_}contests READ");
  7. $db->query("START TRANSACTION");
  8.  
  9. $update = $db->query(
  10. "UPDATE {$DBP_}contests SET `winner`='{$_SESSION['id']}' ".
  11. "WHERE `id`='{$contest['id']}' AND winner IS NULL AND '{$message_lowercase}' IN (answer, answer2, answer3)"
  12. );
  13.  
  14. // Dodawanie do chatu i tym podobne...
  15.  
  16. $db->query('COMMIT');
  17. $db->query('UNLOCK TABLES');

Kodowanie bazy to utf8_general_ci, przy połączeniu wykonuję SET NAMES UTF8. Wszystkie pliki są zakodowane w UTF8 bez BOM.

Ktoś miał podobny problem albo umie pomóc?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post 24.08.2012, 14:23:18
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Kodowanie znaków masz UTF-8, nie utf8_general_ci. To ostatnie to system/tryb porównywania znaków i to właśnie to jest odpowiedzialne za to, że "z" = "ż". Google: MySQL Collations
Go to the top of the page
+Quote Post
Kikert
post 24.08.2012, 14:44:47
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 15.09.2008

Ostrzeżenie: (0%)
-----


Dzięki za szybką odpowiedź wink.gif

Znalazłem gdzieś na pierwszej stronie wątek ze stackoverflow: http://stackoverflow.com/questions/367711/...-mysql-with-php

Sprawdziłem (dla odpowiedzi Alphonse Gabriel Capone, Al Caponeż, Al Capone - czyli Al Caponez/Al Caponeż) sobie kilka polecanych tam kombinacji i żadna nie działa prawidłowo. utf8_polish_ci i utf8_bin nie akceptuje żadnej wersji, a utf8_unicode_ci akceptuje obydwie.

Czy jest możliwe, że jakoś zmienia się kodowanie wysyłanego tekstu i to psuje te znaki? Formularz wysyłam jako application/x-www-form-urlencoded;charset=utf-8, także nie powinno być problemów.
Go to the top of the page
+Quote Post
Crozin
post 24.08.2012, 15:24:38
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Ah, dla MySQL nie ma wbudowanego trybu porównywania znaków uwzględniającego znaki diakrytyczne i ignorującego wielkość znaków. W takim razie przechowuj wyrazy zapisane małymi literami (mb_strtolower) w dowolnej formie znormalizowanej. Następnie przed wykonaniem porównywania wykonaj ten sam zabieg na zmiennej otrzymanej od użytkownika po czym wykonaj ostateczne porównanie przy użyciu trybu utf8_bin czy nawet binary.
Go to the top of the page
+Quote Post
Kikert
post 24.08.2012, 15:35:43
Post #5





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 15.09.2008

Ostrzeżenie: (0%)
-----


Z tego co się orientuję, intl jest dosyć nowy i nie jestem pewien czy serwer, na którym stoi strona poprawnie to obsłuży. Nie ma innych rozwiązań?

@edit: Skojarzyła mi się jedna opcja. Gdzieśtam widziałem, że SELECT BINARY 'z'='ż' daje prawdę na wyjściu. Nie da się tego skombinować jakoś w ten sposób?

Ten post edytował Kikert 24.08.2012, 15:37:43
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.07.2025 - 02:13