Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Uft-8 i baza danych - problem z kodowaniem
DeyV
post
Post #1





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
andrzej123
post
Post #2





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 13.03.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 14:00