Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PDO] Kodowanie znaków
Forum PHP.pl > Forum > PHP
rav1989
Witam

Mam drobny problem z kodowaniem polskich znaków przy zapisywaniu do bazy danych... korzystam z PDO do obsługi bazy.

Gdy dodam wpis na stronie mi się on ładnie wyświetli (tak jak trzeba) natomiast jak podejrzę ten tekst w phpMyAdmin to mam niezłą sieczkę...

dla przykładu dodaję ó€ęłśąńćźż ÓĘŁŚĄŃĆŹŻ a w badzie mi zapisuje ó€ęłśąńćźż ÓĘŁŚĄŃĆŹŻ
metoda porównywania to utf8_general_ci natomiast wszystkie pliki są w UTF-8 bez BOM tak samo jak strona biggrin.gif

Niby nic wielkiego bo strona działa normalnie ale jednak chciałbym aby w bazie też był ten sam tekst co na stronie bez krzaków...

Pozdrawiam
Rav
toaspzoo
daj pliki w iso8859-2

lub nagłówek na stronie, przez którą dodajesz header() z utf-8
rav1989
Cytat(toaspzoo @ 2.07.2011, 17:25:47 ) *
daj pliki w iso8859-2

lub nagłówek na stronie, przez którą dodajesz header() z utf-8

Pierwsze sprawiło, że i w bazie i na stronie pojawiły się krzaki, natomiast druga opcja w ogóle nie dała efektu...
morbic
Powinieneś bezpośrednio po połączeniu się do bazy ustawić sposób kodowania przy połączeniu - nie wiadomo, jaki jest domyślny w MySQL. To, że phpMyAdmin używa UTF8 nic nie znaczy. Bardziej tu szukałbym problemu.

Możesz to zrobić na dwa sposoby:
  1. $pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

lub
  1. $pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test');
  2. $dbh->exec("SET NAMES utf8");


Musisz jednak liczyć się z tym, że w momencie zmiany kodowania przy połączeniu, wszystkie wyświetlane do tej pory poprawnie dane zaczną pokazywać się na stronie tak samo, jak wyświetla je phpMyAdmin. Z kolei nowe, dodawane przez skrypt dane będą już zapisywane poprawnie.
rav1989
Cytat(morbic @ 2.07.2011, 18:07:48 ) *
Powinieneś bezpośrednio po połączeniu się do bazy ustawić sposób kodowania przy połączeniu - nie wiadomo, jaki jest domyślny w MySQL. To, że phpMyAdmin używa UTF8 nic nie znaczy. Bardziej tu szukałbym problemu.

Możesz to zrobić na dwa sposoby:
  1. $pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

lub
  1. $pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test');
  2. $dbh->exec("SET NAMES utf8");


Musisz jednak liczyć się z tym, że w momencie zmiany kodowania przy połączeniu, wszystkie wyświetlane do tej pory poprawnie dane zaczną pokazywać się na stronie tak samo, jak wyświetla je phpMyAdmin. Z kolei nowe, dodawane przez skrypt dane będą już zapisywane poprawnie.


Zrobiłem to pierwsze ale wyskoczył mi błąd...

Cytat
Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in C:\wamp\www\config.php on line 23
morbic
Jakiej wersji PHP używasz? W 5.2 działa bez zarzutu, ale w 5.3 ta opcja magicznie zniknęła.

Najbezpieczniej używać sposobu drugiego.
rav1989
Cytat(morbic @ 2.07.2011, 19:05:13 ) *
Jakiej wersji PHP używasz? W 5.2 działa bez zarzutu, ale w 5.3 ta opcja magicznie zniknęła.

Najbezpieczniej używać sposobu drugiego.

No i właśnie działa ten drugi bez zarzutu
Serdecznie dziękuję za pomoc smile.gif
Fifi209
Cytat(morbic @ 2.07.2011, 19:05:13 ) *
Jakiej wersji PHP używasz? W 5.2 działa bez zarzutu, ale w 5.3 ta opcja magicznie zniknęła.

Dziwne, w dokumentacji nadal jest
http://pl2.php.net/manual/en/ref.pdo-mysql.php
morbic
Źle się wyraziłem, ogólnie nie zniknęła. Wygląda to na bug w którejś z wersji PHP, który został później poprawiony.

https://bugs.php.net/bug.php?id=47224
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.