Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Uft-8 i baza danych - problem z kodowaniem
Forum PHP.pl > Forum > PHP
DeyV
Heh - rzadko zadaje tu pytania, ale trafiłem na problem, z którego nie do końca wiem, jak wybrnąć.

Przekładowy kod:
  1. <?php
  2. $dbh = new PDO('pgsql:host=localhost;dbname=test', 'php', 'php');
  3. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  4.  
  5. $sText = $dbh->quote( $_GET['t'] );
  6. $sQuery =  "insert into t1 ( text ) values ( ". $sText .")";
  7.  
  8. echo '<pre>'. $sQuery .'</pre>';
  9.  
  10. $dbh->exec( $sQuery );
  11. ?>

Odpalane poprzez:
index.php?t=ąśżźć

Wynik?
Cytat
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[22021]: Character not in repertoire: 7
ERROR: invalid byte sequence for encoding "UTF8": 0xb9
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".' in index.php:19
Stack trace: #0 index.php(19): PDO->exec('insert into t1 ...') #1 {main} thrown in index.php on line 19


I w sumie nie jest to dziwne, bo zapytanie wygląda mniej więcej tak:
Cytat
insert into t1 ( text ) values ( '����� ')


Kilka uwag. Baza danych to postgres 8.2 oczywiście w UTF-8. Strona też jest w UTF-8.

Używam danych z GET tylko dlatego, że wygodniej w ten sposób zasymulować problem z kodowaniem. Wiem oczywiście, że można łatwo skonwertować dane pochodzące z GET, tak by ten problem usunąć, jednak problem pozostanie, ponieważ nie tak łatwo jest zweryfikować wszystkie dane.

Znalazłem pewien materiał na ten temat: http://www.phpwact.org/php/i18n/charsets
dział: Checking UTF-8 for Well Formedness

Ale niezbyt podoba mi się myśl, by każdy tekst od usera przepuszczać przez
Cytat
$t = iconv("UTF-8","UTF-8//IGNORE",$t);


Znacie jakieś inne rozwiązania tego problemu?
sticker
get i polskie fonty to beznadziejny pomysł , przesyłaj postem
DeyV
Cytat(DeyV @ 9.02.2008, 20:12:19 ) *
Używam danych z GET tylko dlatego, że wygodniej w ten sposób zasymulować problem z kodowaniem. Wiem oczywiście, że można łatwo skonwertować dane pochodzące z GET, tak by ten problem usunąć, jednak problem pozostanie, ponieważ nie tak łatwo jest zweryfikować wszystkie dane.
darecki
spróbuj dodać SET NAMES:

  1. <?php
  2. $dbh = new PDO('pgsql:host=localhost;dbname=test', 'php', 'php');
  3. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  4.  
  5. $dbh -> query("SET NAMES utf8;");
  6.  
  7. $sText = $dbh->quote( $_GET['t'] );
  8. $sQuery =  "insert into t1 ( text ) values ( ". $sText .")";
  9.  
  10. echo '<pre>'. $sQuery .'</pre>';
  11.  
  12. $dbh->exec( $sQuery );
  13. ?>
DeyV
Nic z tego - pozostaje dokładnie ten sam problem.
kosmowariat
ja bym jednak zrezygnował z tego rozwiązania. jeśli chodzi o sql to jest chyba możliwość konwersji. z tego co pamiętam

insert into cos (pole) values (_utf8('ść'))
darecki
A może problem jest z kodowaniem po stronie postgresql ? Sprawdź jakie masz ustawione kodowanie na bazie danych, czy UTF 8,
dodatkowo teraz zauważyłem że używasz postgresql wiec chyba powinno być:

SET CLIENT_ENCODING UTF8 zamiast SET NAMES utf8

Dodatkowo jeżeli strona zakodowaną masz w ISO 8859-2 korzystaj z iconv dla zmiany na UTF 8 poszczególnych zmiennych
DeyV
Więc tak:

- W PG SET NAMES jest aliasem do SET CLIENT_ENCODING - więc to nie ma znaczenia chyba.
- Strona i baza jest na pewno w UTF-8, problem pojawia się czasem (bardzo rzadko) gdy ktoś wklei jakiś dziwny tekst, np. pochodzący z Worda, co potrafi wywołać ten mocno nieprzewidywalny błąd.

Dlatego też wstępnie zastosowałem iconv tylko do usuwania niepoprawnych znaków, i wstępnie - wygląda na to, że działa to poprawnie.
Ale rozwiązanie wcale mi się nie podoba. Szukam lepszego smile.gif
Athlan
Mnie kiedyś pomogły stringi multibajtowe:

http://pl.php.net/manual/pl/ref.mbstring.php
andrzej123
Panowie miałem podobny komunikat w Zend F. gdzie w sumie w klasie były 3 metody na krzyż, co się okazało plik klasy nie był zapisany w UTF-8 (nic do bazy nie wysyłałem ale wywalał mi się komunikat na stronie j.w.) po zmianie kodowania pliku klasy problem sam zniknął bez zmiany nawet jedej linii kodu.
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.