Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Polskie znaki z bazy danych
Forum PHP.pl > Forum > Przedszkole
castagir
Witam

Tym razem potrzebuję pomocy w odczytywaniu Polskich znaków w kodzie php.

Mam taki problem. W bazie danych mam zapisaną nazwę kategorii użytkowników, w której występują polskie znaki. Mianowicie chodzi o "Użytkownik".
Mam na początku strony wpisany wers:
  1. header('Content-type: text/html; charset=utf8');

lecz on też nic nie daje.

Wszystkie odpowiednie kolumny mam także zapisane w formacie "utf8_polish_ci" i przechowują dane tak jak trzeba - jeśli je tylko wpiszę przez MYSQLWorkbench.

Niestety jeśli wysyłam zapytanie z polecemniem "INSERT INTO..." pojawiają się w bazie krzaczki, natomiast jeżeli pytam się za pomocą "SELECT * FROM..." pokazują się znaki zapytania "?".

Co zrobić aby skrypt formatował znaki tak jak trzeba? Chciałbym, żeby to dało się jakoś zrobić poprzez dopisanie coś do skryptu, bo nie chcę grzebać w plikach, tymbardziej że ten skrypt ma być później wstawiony na hosting, w którym adminsitratorzy raczej nie pozwalają grzebać.
maviozo
Po połączeniu z bazą dajesz 'SET NAMES utf8' ?
w PDO jako 2 argument daj
  1. array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
castagir
To rozwiązuje sprawę jeśli chodzi o wpisywanie danych do bazy. Niestety pobierane wpisy wciąż nie posiadają polskich znaków.

Nie wiem w ogóle co się dzieje.
Mam dwa pliki .php, które wykonują dokładnie ten sam skrypt z takimi samymi danymi i dokładnie z ta sama bazą danych. W jednym testowym wyświetla tak jak trzeba, a w drugim wciąż wyświetla z znakami zapytania.

Co się dzieje? Ja już wymiękam.

Pierwszy skrypt testowy:
  1. header('Content-type: text/html; charset=utf8');
  2.  
  3. try
  4. {
  5. $polaczenie = new PDO('mysql:host='.$serwer_bd.';dbname='.$nazwa_bd, $uzyt_bd, $haslo_bd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
  6.  
  7. $polaczenie->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  8. echo 'Połączono z bazą danych!';
  9. } catch (PDOException $e)
  10. {
  11. echo ($e->getMessage());
  12. }
  13.  
  14. $nazwa = 'uzytkownik';
  15. $haslo = '123456789';
  16.  
  17. $spr_nazwa = 'dobrze';
  18.  
  19. if ($spr_nazwa === 'dobrze') {
  20. $pytanie = $polaczenie->prepare("SELECT id, nazwa, stopien FROM ".$przedrostek_bd."uzytkownicy WHERE nazwa=:nazwa AND haslo=:haslo LIMIT 1");
  21. $pytanie->bindValue(':nazwa', $nazwa, PDO::PARAM_STR);
  22. $pytanie->bindValue(':haslo', sha1($haslo), PDO::PARAM_STR);
  23. if ($pytanie->execute()) {
  24. $wynik = true;
  25. while ($w = $pytanie->fetch(PDO::FETCH_ASSOC)) {
  26. $dane_id = $w['id'];
  27. $dane_nazwa =$w['nazwa'];
  28. echo $dane_stopien = $w['stopien']; }
  29. } else {
  30. $wynik = '<p class="blad">Nie udało się zalogować.<br />
  31. Spróbuj ponownie później lub zgłoś to do obsługi technicznej.</p><br />'; }
  32. }



Drugi skrypt:

  1. header('Content-type: text/html; charset=utf8');
  2.  
  3. try {
  4. $polaczenie_bd = new PDO('mysql:host='.NAZWA_SERWERA_BD.';dbname='.NAZWA_BD, NAZWA_UZYT_BD, HASLO_UZYT_BD, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")) or die('Nie można połączyć się z bazą danych.');
  5. $polaczenie_bd->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  6. } catch (PDOException $e) {
  7. echo ($e->getMessage()); }
  8.  
  9. if ($spr_nazwa === 'dobrze' && $spr_haslo === 'dobrze') {
  10. $pytanie = $polaczenie_bd->prepare("SELECT id, nazwa, stopien FROM ".$przedrostek."uzytkownicy WHERE nazwa=:nazwa AND haslo=:haslo LIMIT 1");
  11. $pytanie->bindValue(':nazwa', $nazwa, PDO::PARAM_STR);
  12. $pytanie->bindValue(':haslo', sha1($haslo), PDO::PARAM_STR);
  13. if ($pytanie->execute()) {
  14. $wynik = true;
  15. while ($w = $pytanie->fetch(PDO::FETCH_ASSOC)) {
  16. $dane_id = $w['id'];
  17. $dane_nazwa =$w['nazwa'];
  18. echo $dane_stopien = $w['stopien']; }
  19. } else {
  20. $wynik = '<p class="blad">Nie udało się zalogować.<br />
  21. Spróbuj ponownie później lub zgłoś to do obsługi technicznej.</p><br />'; }
  22. }


Próbowałem już kopiować z tego działającego i zamieniac z tymi niedziałajacymi fragmentami, ale ostatecznie i tak jest taki sam wynik.
Turson
Musisz mieć charset dokumentu też na UTF-8 http://turson.pl/blog/polskie-znaki-w-dokumencie-php/
castagir
Już znalazłem.

Idiota ze mnie. wacko.gif Zapomniałem, że w jednym z przyłączanych plików miałem właśnie zapisany stary nieprawidłowy sposób łączenia się z bazą, przez to ten właściwy był nadpisywany.

Teraz już wszystko działa.
maviozo
Cóż. W większych systemach warto mieć uniwersalną klasę do obsługi bazy danych, która sama nawiąże połączenie przy pierwszym zapytaniu.
Czyli tam, gdzie chcesz ją wywołać dajesz np.
  1. $wynik=BAZA::zapytanie("select * from baza");


a w klasie BAZA (w uproszczeniu, żebyś załapał ideę)
  1. private $polaczenie=false;
  2. public static function zapytanie ($query){
  3. if (!$this->polaczenie) $this->polacz();
  4. else .....
  5. }

oczywiście polacz() będzie zawierać przełącznik $polaczenie=true, oraz wszystkie potrzebne funkcje inicjujące połączenie, w tym m. in. ustawienie kodowania.
Unikasz problemów z różnymi wersjami, masz czytelną obsługę itd., hasło tylko w jednym pliku. NIe wspominając, że po sprzęgnięciu tego z _autoload klasy, nawet nie musisz pamiętać o przyłączaniu pliku klasy smile.gif
To rozwiązanie, poza oczywiście czasem potrzebnym na napisanie tego, praktycznie nie ma wad.
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.