Przekładowy kod:
<?php $dbh = new PDO('pgsql:host=localhost;dbname=test', 'php', 'php'); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sText = $dbh->quote( $_GET['t'] ); $sQuery = "insert into t1 ( text ) values ( ". $sText .")"; $dbh->exec( $sQuery ); ?>
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
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?