• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Polskie znaki w formularzu rejestracji

Object Storage Arubacloud
+1 głos
892 wizyt
pytanie zadane 21 marca 2018 w PHP przez anka_m Początkujący (370 p.)

Cześć,

mam pewien problem. Przeglądałam forum i częściowo udało się go rozwiązać, ale nie do końca. Chodzi o polskie znaki w formularzu rejestracji i bazie danych użytkowników. Podobny problem występował w innych częściach strony, np. w komentarzach i postach. Tam udało się to rozwiązać, tj: zmieniłam kodowanie tabel i bazy danych na utf8_polish_ci , a skrypt łączenia z bazą na :

 $connection = mysqli_connect("localhost", "root", "", "app");
 $connection->set_charset("UTF8");
 $connection->query("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");

i w tych częściach strony wszystko działa. Niestety w formularzu rejestracji coś jest nie tak. Tabela users, do której są wysyłane dane z formularza rejestracji również ma ustawione kodowanie na utf8_polish_ci. Co ciekawe, np rejestrując użytkownika Żółta Gęś w tabeli mySql ten rekord zapisany jest jako Ż????ta G????, więc "ż" koduje się dobrze. Macie pomysł o co chodzi i jak to naprawić?

   

4 odpowiedzi

+1 głos
odpowiedź 21 marca 2018 przez Bosswell Nałogowiec (36,470 p.)
Tworzysz połączenie proceduralnie, a traktujesz zmienną $connecion jak obiekt. Nie może tam być operatorów strzałek.

Co za tym idzie, ustawianie kodowania połączenia nie działa.
+1 głos
odpowiedź 21 marca 2018 przez anka_m Początkujący (370 p.)

Hej, oczywiście problem nie dawał mi spokoju i dalej nad nim siedziałam ;)  No i udało się wyśledzić co go powoduje :D  Napiszę dla potomnych, w czym był problem.

W pliku z skryptem rejestracji po kolei sprawdzałam jaka wartość zapisana jest w zmiennej. Okazało się, że problem pojawia się przy przejściu stringa przez funkcję

 $fname = ucfirst(strtolower($fname));       // Convert all letters to lowercase and capitilize first letter

Okazuje się, że funkcje te nie radzą sobie z polskimi znakami. Żeby temu zaradzić należy zapisać funkcję strtolower w postaci:

$fname= mb_strtolower($fname, 'UTF-8');

Dla ucfirst nie ma wbudowanej funkcji, ale w internecie można znaleźć np taką :

// uc first for polish charakters
function ucfirstUtf8($str) {
   if (mb_check_encoding($str, 'UTF-8')) {      
       $first = mb_substr(mb_strtoupper($str, 'UTF-8'), 0, 1, 'UTF-8');      
        return $first . mb_substr(mb_strtolower($str, 'UTF-8'), 1, mb_strlen($str), 'UTF-8');  
   } else {    
        return $str;
   }
}

No i wszystko śmiga :D

0 głosów
odpowiedź 21 marca 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)

Witam,

Upewnij się czy ustawiłaś kodowane UTF-8 w pliku HTMLa.

<meta charset="utf-8" />

Jeśli tak, spróbuj jeszcze raz utworzyć tę samą tabelę z użytkownikami dokładnie analizując ustawienia porównywania napisów.

0 głosów
odpowiedź 21 marca 2018 przez anka_m Początkujący (370 p.)

Dzięki za odpowiedź : )

Niestety, po stworzeniu nowej bazy z użytkownikami, problem się nie naprawił. Próbowałam również dodać tag meta na stronie która obsługuje formularz rejestracji ale niestety też nie pomogło.

Próbowałam też zmienić skrypt połączenia na:

 $connection = new mysqli("localhost", "root", "", "fakebook");
  $connection->set_charset("UTF8");
  $connection->query("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");

ale też bez zmian. Zauważyłam, że po wpisaniu danych do formularza, w sytuacji gdy rejestracja się nie powiodła i strona odświeża się, to w polach formularza, gdzie wyświetlane są w takim wypadku dane zapisane w zmiennej $_SESSION już pojawiają się błędy... Myślę, że to już jakiś trop, ale nie wiem co dalej z tym zrobić :(

komentarz 21 marca 2018 przez Daniel90 Pasjonat (17,970 p.)
Plik nie jest przypadkiem w jakimś dziwnym kodowaniu? Najlepiej w notepad ++ sprawdź "Format" i "Koduj w UTF8 bez bom" albo w jakimś innym programie.
komentarz 21 marca 2018 przez Bosswell Nałogowiec (36,470 p.)

1. Ustaw kodowanie przy połączeniu z bazą. Zarówno przy wysyłaniu zapytania, jak i pobierania. Stare dane zastąp nowymi już wcześniej zakodowanymi. To jest najbardziej prawdopodobny błąd. Zamiast dużych UTF8 użyj małe litery. Nie wiem szczerze, jak ta metoda radzi sobie z translacją wyrazów.

 $connection->query("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");

Ta linia nie jest potrzebna.

2. Spróbuj ustawić nagłówek

header('Content-Type: text/html; charset=utf-8');

3. Możesz spróbować ustawić kodowanie tabel w bazie, ale bez niego również powinno działać.

4. Ustaw kodowanie edytora tekstu na utf-8 bez bom

komentarz 21 marca 2018 przez anka_m Początkujący (370 p.)

Dzięki, prawie wszystko wypróbowane, ale nie działa :/  Header jest, w formularzu rejestracji dodałam  accept-charset="utf-8",   kodowanie w edytorze utf-8 bez bom..

Nie bardzo rozumiem co znaczy " Zarówno przy wysyłaniu zapytania, jak i pobierania. Stare dane zastąp nowymi już wcześniej zakodowanymi. ", 

Czy nie załatwia tego ta linijka?

$connection->set_charset("utf8");

Kurcze, no nie wiem, dziwne, bo na innych podstronach wszystko działa. Jak ręcznie wpisałam w tabeli w pole last_name  nazwisko z polskimi znakami, to wszystko jest ok. Tzn w innych częściach strony, po zalogowaniu nazwisko użytkownika się wyświetla prawidłowo :( Czyli jest problem z wysłaniem do bazy. 

O, proszę bardzo,  tu widać, że znaki które są prawidłowo wpisane w bazie danych na stronie wyświetlane są prawidłowo ;)

komentarz 21 marca 2018 przez Bosswell Nałogowiec (36,470 p.)
Chodzi o to, że jak robisz INSERTA do bazy, to koduj o połączenie. Jeżeli robisz SELECTA, to również koduj. Koduj, czyli używaj set_charset(). Jeżeli wcześniej wysłałaś dane nie zakodowane do bazy, to zostaną one błędnie wyświetlone. Możesz to przetestować wstawiając nowe dane do bazy i wyświetlając je. Żeby działały one poprawnie, to musisz wprowadzić je na nowo, tylko już zakodowane ;) Mam nadzieje, ze rozumiesz.
komentarz 21 marca 2018 przez anka_m Początkujący (370 p.)
O, dzięki za wyjaśnienie.  Tylko, że np. publikując post z polskimi znakami wszystko jest ok. Co ciekawsze, z poziomu ustawień konta, gdzie jest opcja zmodyfikowania danych, np imienia i nazwiska, również wszystko działa, a dane są zmieniane w tej samej tabeli, do której trafiają dane z rejestracji. Czyli z poziomu ustawień konta polskie znaki są przesyłane prawidłowo, a z rejestracji już nie.

Spróbowałam dodać set_charset()  tak jak sugerujesz, ale też nie działa.

No dobra, trudno, na razie się poddaje. Chyba po prostu zablokuje możliwość wpisywania polskich znaków w rejestracji. Jeżeli komuś chciałoby się przejrzeć kod to cały jest dostępny na githubie:

https://github.com/anna-morawska/fakebook/blob/master/src/includes/form_handlers/register_handler.php

Bardzo dziękuję za pomoc ! :)
komentarz 21 marca 2018 przez Bosswell Nałogowiec (36,470 p.)

Linia od 57 do 59, 115, 123, 128, 140 znowu mieszasz połączenie obiektowe z proceduralnym.

Ta funkcja i jej wykorzystanie prawdopodobnie jest przyczyną błędu

function no_pl($text) {
                    $table = Array(
                    "\xc4\x85" => "a", "\xc4\x87" => "c",
                    "\xc4\x99" => "e", "\xc5\x82" => "l", 
                    "\xc3\xb3" => "o", "\xc5\x9b" => "s", 
                    "\xc5\xbc" => "z", "\xc5\xba" => "z", 
                    "\xc5\x84" => "n");
                    return strtr($text, $table);
                    }
            $username = no_pl($username);

 

komentarz 21 marca 2018 przez anka_m Początkujący (370 p.)

O, dziękuję za rewizję, masz rację, będę musiała wszędzie to poprawić. Ale tak BTW to normalne, że działało dotychczas mimo pomieszania podejścia obiektowego i proceduralnego? Dziwne... Co do tej funkcji, to nie, była zakomentowana na czas wszystkich testów. Poprawiłam wszystkie zapytania na 

$connection->query("SELECT .....'");

i niestety też nie działa

Podobne pytania

0 głosów
2 odpowiedzi 224 wizyt
pytanie zadane 29 listopada 2016 w PHP przez krispello Obywatel (1,440 p.)
0 głosów
2 odpowiedzi 1,420 wizyt
pytanie zadane 23 lutego 2017 w PHP przez prymex Obywatel (1,250 p.)
–1 głos
1 odpowiedź 288 wizyt
pytanie zadane 26 października 2016 w PHP przez Peengie Początkujący (360 p.)

92,555 zapytań

141,402 odpowiedzi

319,541 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...