Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> mysql polskie kodowanie znaków
rysic
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 9.09.2010

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


Potrzebuję pomocy z kodowaniem znaków w mysql-u. Nie zajmuję się zawodowo PHP, więc całkiem możliwe, że robię coś nie tak już u podstaw. Próbowałem już wielu możliwości, ale żadna nie pomaga. (IMG:style_emoticons/default/sciana.gif)

Standardowo mój kod wygląda mniej więcej tak:

  1.  
  2. try
  3. {
  4. $pdo = new PDO('mysql:host=localhost;dbname=test','root','Kokomoko6677', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  5.  
  6. $pdo ->query('SET CHARACTER SET utf8;');
  7. $pdo -> query('SET character_set_client = utf8;');
  8. $pdo -> query('SET character_set_results = utf8;');
  9. $pdo -> query('SET character_set_connection = utf8;');
  10. $pdo -> query('SET character_set_database = utf8;');
  11. $pdo -> query('SET character_set_server = utf8;');
  12. $pdo -> query ('SET NAMES utf8');
  13. $pdo -> query ('SET CHARACTER_SET utf8_unicode_ci');
  14.  
  15.  
  16. //$pdo -> query('SELECT id, content FROM articles;');
  17. //echo "połączenie nawiązane";
  18. }
  19. catch(PDOException $e)
  20. {
  21. echo 'Połączenie nie mogło zostać nazwiązane<br/>'.$e->getMessage();
  22. }
  23.  
  24. $ilosc = $pdo -> exec('INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')');
  25.  


Pewnie zbyt dużo tam tych SET, ale zacząłem już dokładać wszystko co mogło by coś zmienić... (IMG:style_emoticons/default/wstydnis.gif)

Potem uznałem, że może biblioteka PDO coś nie tegest jest, więc zrobiłem to tak:

  1. $sql_conn = mysql_connect('localhost' , 'root' , 'Kokomoko6677');
  2. mysql_select_db ("test");
  3. mysql_query('set names latin2 collate utf8_unicode_ci');
  4. mysql_query('set character set utf8');
  5.  
  6. $zapytanko='INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')';
  7. mysql_query($zapytanko );


Na bazie wykonywałem:

  1. ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  2. ALTER TABLE `markety` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;


oraz sprawdzałem kodowanie przez:

  1. SHOW CREATE DATABASE
  2. mysql> SHOW CREATE DATABASE test
  3. -> ;
  4. +----------+--------------------------------------------------------------------------------------+
  5. | DATABASE | CREATE DATABASE |
  6. +----------+--------------------------------------------------------------------------------------+
  7. | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_polish_ci */ |
  8. +----------+--------------------------------------------------------------------------------------+
  9. 1 row IN SET (0.00 sec)
  10.  
  11.  
  12. SHOW CREATE TABLE markety;
  13. ...
  14. ENGINE=MyISAM AUTO_INCREMENT=41 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


phpMyAdmin pokazuje to samo.

Na stronie w nagłóku mam:

  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


Baza, Apache i PHP postawione są na Debianie. Jak zrobię zapytanie z palca do bazy, to polskie znaki są widoczne w tabeli.

Nie mam już kompletnie pomysłu co może być nie tak...

Proszę o pomoc. Z góry dziękuję!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Pilsener
post
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Problem jest stary jak świat a rozwiązanie standardowe: należy sprawdzić, w jakim kodowaniu "krzaki" lecą do bazy, w jakim kodowaniu są w bazie oraz w jakim są pobierane z bazy i wyświetlane na stronie. Służy to tego:
http://pl2.php.net/manual/en/function.mb-detect-encoding.php
Go to the top of the page
+Quote Post
rysic
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 9.09.2010

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


Ta funkcja zwraca: ASCII, czyli coś nie tak jest jeszcze przed wysłaniem do bazy... Teraz kwestia przerobienia tego na UTF-8. Postaram się nad tym popracować i dam znać, czy mi się udało. Dzięki!

EDIT:
Chyba jednak jakieś bzdury piszę...

  1. $zapytanko = 'INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')';
  2. //$zapytanko = utf8_encode ( $zapytanko );
  3. echo "Kodowanie: ";
  4. echo mb_detect_encoding($zapyt);
  5. $ilosc = $pdo -> exec($zapytanko);


Jak powinienm to przekonwertować?

"w jakim kodowaniu są w bazie oraz w jakim są pobierane z bazy i wyświetlane na stronie"
W bazie są już krzaki, więc chyba nie ma sensu przechodzić do sprawdzania jak są wyświetlane.



Po kilku próbach zrobiłem jeszcze tak:

  1. $zapytanko = 'INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')';
  2. $zapytanko = utf8_encode ( $zapytanko );
  3. echo "Kodowanie z POST: ",mb_detect_encoding($_POST['nazwa']);
  4. echo "Kodowanie zapytania: ".mb_detect_encoding($zapyt);


I wynik mam taki:

Kodowanie z POST: UTF-8
Kodowanie zapytania: ASCII

To chyba wszystko wyjaśnia. Dane przychodzą poprawne, ale już tworzone zapytanie nie jest poprawne. Dobrze to rozumiem?
Jeśli tak, to w jaki sposób zmusić zmienną $zapytanko do poprawnego kodowania? Funkcja utf8_encode jakoś nie ma ochoty zadziałać, jak widać.





EDIT


Przepraszam, że tak wam marudzę, ale próbowałem jeszcze wielu porad, które znalazłem i nadal to nie działa. (IMG:style_emoticons/default/sadsmiley02.gif) Żeby wszystko było jasne, to przedstawię na jakim jestem aktualnie etapie:

Na bazie próbowałem ustawiać różnego kodowania, aktualnie zostało: utf8_unicode_ci

Dla pewności zastosowałem już wszystko co się dało do kodowania ba bazie:
  1. $pdo ->query('SET CHARACTER SET utf8;');
  2. $pdo -> query('SET character_set_client = utf8;');
  3. $pdo -> query('SET character_set_results = utf8;');
  4. $pdo -> query('SET character_set_connection = utf8;');
  5. $pdo -> query('SET character_set_database = utf8;');
  6. $pdo -> query('SET character_set_server = utf8;');
  7. $pdo -> query ('SET CHARACTER_SET utf8_unicode_ci');
  8. $pdo -> query ('SET NAMES utf8');


Strona powinna być kodowana poprawnie:
  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  2. </head>


Po pobraniu danych sprawdzam jak są kodowane:
  1. $nazwa = $_POST['nazwa'];
  2. ...
  3. $zapytanko = 'INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')';
  4. echo "zapytanko: ".$zapytanko;
  5. echo "<br>Kodowanie zapytania: ".mb_detect_encoding($zapytanko);
  6. echo "nazwa: ".$nazwa;
  7. echo "<br>PO: ".mb_detect_encoding($nazwa);
  8. echo "nazwa z POST".$_POST['nazwa'];
  9. echo "<br>Kodowanie z POST: ".mb_detect_encoding($_POST['nazwa']);


i potem wysłanie do bazy:
  1. $ilosc = $pdo -> exec($zapytanko);


Po wykonaniu powyższego wyświetla mi się

zapytanko: INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES('aąeęążźś','9960','10.51.99.0','','',0,'','')zapytanko: INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES('aąeęążźś','9960','10.51.99.0','','',0,'','')
Kodowanie zapytania: UTF-8
nazw: aaąeęążźś
Po: UTF-8
nazwa z POSTaąeęążźś
Kodowanie z POST: UTF-8

Zgodnie z tym, co pisałeś Pilsener, przetestowałem kodowanie w każdym miejscu po drodza i jak widać, wszystko jest OK - UTF-8, polskie znaki. Niestety w bazie są tylko krzaki.... nazwa => a?e?(IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif)



Bardzo proszę o pomoc, bo nie potrafię sobie z tym poradzić (IMG:style_emoticons/default/sadsmiley02.gif)

EDIT

Ruszyło się do przodu!! (IMG:style_emoticons/default/smile.gif)
Po wielu walkach (z serwerem na Debianie włącznie). Zaczęło częściowo działać!

Ostatecznie wygląda to tak, że dane, które wpadają do bazy są wcześniej kodowane przez utf8_encode a po wyjęciu z bazy dekodowane przez utf8_decode. Działa to dla części znaków, jak óźż, ale krzaki robią się dla ąę. Ktoś wie co może być nie tak?










DOBRA! Widzę, że na tym forum nie ma co liczyć na pomoc...
Dzięki!

Ten post edytował rysic 30.09.2010, 14:06:24
Go to the top of the page
+Quote Post
Pilsener
post
Post #4





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Cytat
utf8_encode — Koduje ciąg znaków w ISO-8859-1 do UTF-8
- nie wydaje mi się, żeby ISO-8859-1 było odpowiednie dla polskich znaków, używa się ISO środkowoeuropejskiego, utf8 albo windows.
Go to the top of the page
+Quote Post
rysic
post
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 9.09.2010

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


Dzięki Pilsner! Czy powinienem użyć tej funkcji?

  1. $nazwa = iconv("ISO-8859-2", "UTF-8", $nazwa);


Niestety ona wrzuca mi do bazy same znaki zapytania...

Ten post edytował rysic 30.09.2010, 15:23:07
Go to the top of the page
+Quote Post
Pilsener
post
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


A po co chcesz konwertować skoro wszędzie masz utf-8? Po to ustawiamy takie same kodowanie w bazie, na stronie i przy połączeniu by nie konwertować niczego (IMG:style_emoticons/default/winksmiley.jpg)

Jeśli na stronie masz inne kodowanie a do bazy chcesz wysłać inne, to można zrobić też tak:
algorytmy.pl/doc/xhtml/index.php?id=2002
Go to the top of the page
+Quote Post
rysic
post
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 9.09.2010

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


Twoja podpowiedź

  1. accept-charset="ISO-8859-2"


+ konwertowanie tego co otrzymuję ze strony do bazy

  1. iconv("Windows-1252", "UTF-8", ...)


a potem konwertowanie z bazy na wyświetlenie

  1. iconv("UTF-8", "ISO-8859-1", ...)


oraz ustawienie na stronie kodowania

  1. header('Content-Type: text/html; charset=ISO-8859-2');


oraz ustawienie kodowania w bazie na UTF8 wreszcie pomogło!!!

To jest dla mnie trochę dziwne, bo z tego co tu widać, dostaję dane w Windows-1254 (mimo, że ustawiałem kodowanie na stronie na UTF8/USO-8859-2/... oraz mam ustawione akceptowane dane z formularza na ISO-8859-2) a jak chcę je tak wyświetlić, to mu nie pasuje... Nie chcę już tego drążyć więcej... ważne, że działa już.

Dzięki!

Ten post edytował rysic 4.10.2010, 13:33:15
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: 23.08.2025 - 04:28