Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> 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
sticker
post
Post #2





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


get i polskie fonty to beznadziejny pomysł , przesyłaj postem

Ten post edytował sticker 9.02.2008, 20:40:11
Go to the top of the page
+Quote Post
DeyV
post
Post #3





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




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





Grupa: Zarejestrowani
Postów: 54
Pomógł: 2
Dołączył: 24.08.2005
Skąd: Warszawa

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


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. ?>
Go to the top of the page
+Quote Post
DeyV
post
Post #5





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




Nic z tego - pozostaje dokładnie ten sam problem.
Go to the top of the page
+Quote Post
kosmowariat
post
Post #6





Grupa: Zarejestrowani
Postów: 235
Pomógł: 17
Dołączył: 18.07.2007
Skąd: Białystok

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


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('ść'))
Go to the top of the page
+Quote Post
darecki
post
Post #7





Grupa: Zarejestrowani
Postów: 54
Pomógł: 2
Dołączył: 24.08.2005
Skąd: Warszawa

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


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
Go to the top of the page
+Quote Post
DeyV
post
Post #8





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




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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Athlan
post
Post #9





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Mnie kiedyś pomogły stringi multibajtowe:

http://pl.php.net/manual/pl/ref.mbstring.php
Go to the top of the page
+Quote Post
andrzej123
post
Post #10





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

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: 22.08.2025 - 19:42