Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php+mysql] Jak wykorzystać utf8 do tworzenia aplikacji?
Forum PHP.pl > Forum > PHP
Wickerman
Witam,
Mam następujący problem:
Chcę stworzyć aplikację w PHP z wykorzystaniem bazy danych w mysql-u. Tworzę formularz kodowany w utf-8, z którego informacje przekazywane są metodą POST do pliku php przetwarzającego skrypt umieszczający wprowadzone dane do bazy. Problem polega na tym, że wprowadzając polskie znaki w formularzu, w bazie pojawiają się krzaki.

Problem co gorsza występuje na poziomie PHP, bo jak wyświetlę sobie zmienną przechowującą wyraz z polskimi literami przed wpisaniem do bazy, to na ekranie również dostaję krzaki. Zmienną tą pobieram za pom. funkcji htmlentities i przypuszczam, że to ona może coś mieszać. Dodam jeszcze, że pomimo ustawienia kodowania w metatagu na utf8 i zakodowaniu samego pliku w utf (notepad++) na stronie również odziwo wyświetlają się krzaczki. Strona uruchamiana jest na lokalnym serwerze Wamp.

Dodam jeszcze, że baza danych została stworzona z utf8 (tak samo jak tablice), parametry połączenia skryptu PHP z mysql też są poustawiane na utf8 (polecenie status z mysql zwraca dla connection, server, db i client - utf8) za pomocą takich poleceń jak (przykładowo):
  1. mysql_query('SET character_set_connection=utf8;');

  1. mysql_query('SET NAMES utf8;');

Pliki formularza i skryptu PHP są zakodowane w utf-8 przy użyciu programu notepad++.

Podsumowując: Jak stworzyć fformularz i bazę danych, aby zapis do i odczyt z bazy przy pomocy php odbywał się przy pomocy kodowania utf8 i poprawnie wyświetlał wszystkie znaki.
koreja
Tak tylko zapytam, jakie masz ustawione kodowanie html?
ramol
Cytat(koreja @ 27.06.2010, 13:58:38 ) *
Tak tylko zapytam, jakie masz ustawione kodowanie html?

Napisał, że ma meta tag na utf8. A same ogonki w htmlu też mają krzaki czy tylko te wyplute z php ? I po co htmlentites ? Wrzuć cały kod może ..
koreja
Sorki, nie zauważyłem wcześniej smile.gif

Kiedyś miałem tak w notepad++, że jeśli najpierw miałem ustawione kodowanie ANSI i wpisane polskie znaki to później jak konwertowałem na UTF8 to na stronie wywalało krzaki, bo polskie znaki zostały przekodowane do tych krzaczków. Nie wspomniałeś też nic o tym, czy dokument masz z BOM czy bez BOM.
Wickerman
Sytuacja poniekąd troszeczkę się wyjaśniła, wyrzuciłem htmletities i skrypt nie krzaczy na poziomie PHP. Także problem z krzaczkami w plikach php został zażegnany. Kodowanie oczywiście jest wszędzie ustawione na utf-8. Problem pozostał z bazą danych.

Wpisując tekst w formularzu "Pięść", w bazie danych zapisuje się "Pi?questionmark.gif". Oto skrypt wprowadzający do BD:

  1. <?php
  2.  
  3. //Pobranie zmiennych wpisanych w formularza do tablicy globalnej $_POST
  4. $opis = $_POST['opis'];
  5.  
  6. echo 'Wprowadzono: '.$opis.'<br>';
  7.  
  8. $db_host = 'localhost';
  9. $db_username = 'root';
  10. $db_password = '';
  11. $db_database = 'kodowanie';
  12. $query = 'INSERT INTO kod VALUES ("'.$opis.'");';
  13.  
  14.  
  15. $link = mysql_connect($db_host,$db_username,$db_password);
  16.  
  17. mysql_select_db($db_database);
  18.  
  19. mysql_query('SET character_set_connection=utf8;');
  20. mysql_query('SET character_set_client=utf8;');
  21. mysql_query('SET character_set_results=utf8;');
  22. //mysql_query('SET character_set_server=utf8;');
  23. //mysql_query('SET character_set_db=utf8;');
  24. mysql_query('SET NAMES utf8 COLLATE utf8_polish_ci;');
  25.  
  26. $result = mysql_query($query);
  27. if (!$result)
  28. {
  29. die ('Błąd zapytania SQL: '.mysql_error());
  30.  
  31. }
  32.  
  33. mysql_close($link);
  34.  
  35. /* (...) */
  36.  
  37. ?>


I jeszcze mała diagnostyka bazy danych:
  1. mysql> SHOW CREATE TABLE kod;
  2. +-------+----------------------------------------------------------
  3. | TABLE | CREATE TABLE
  4. +-------+----------------------------------------------------------
  5. | kod | CREATE TABLE `kod` (
  6. `opis` varchar(200) CHARACTER SET utf8 NOT NULL
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci |
  8. +-------+----------------------------------------------------------


Baza danych:
  1. mysql> SHOW CREATE DATABASE kodowanie;
  2. +-----------+--------------------------------------------------------------------+
  3. | DATABASE | CREATE DATABASE |
  4. +-----------+--------------------------------------------------------------------+
  5. | kodowanie | CREATE DATABASE `kodowanie` /*!40100 DEFAULT CHARACTER SET utf8 */ |
  6. +-----------+--------------------------------------------------------------------+


STATUS:
  1. Current DATABASE: kodowanie
  2. Current user: root@localhost
  3. SSL: NOT IN USE
  4. USING delimiter: ;
  5. Server version: 5.1.36-community-log MySQL Community Server (GPL)
  6. Protocol version: 10
  7. Connection: localhost via TCP/IP
  8. Server characterset: utf8
  9. Db characterset: utf8
  10. Client characterset: utf8
  11. Conn. characterset: utf8


Sorry za format, ale przeprowadzam testy w warunkach "polowych" żeby sobie nie namieszać w dotychczasowej pracy.
koreja
A dałeś w notepad++ Konwertuj na UTF8 (bez BOM)? Wydrukuj sobie tablicę POST i sprawdź jakie ona ma wartości. Podejrzewam, że ma krzaczki. Bo skoro z poziomu php kodowanie masz dobre, to znaczy, że błąd jest w kodowaniu plików.
ramol
A przypadkiem Twoja przeglądarka nie jest ustawiona na ISO ?
Wickerman
Przeglądarka pokazuje kodowanie UTF-8, pliki są enkodowane w notepad++ za pomocą UTF8 (bez BOM). Do tego tablica POST nie jest zakrzaczkowana, jedynie baza danych zamiast polskich znaków diakrytycznych wstawia pytajniki.
ramol
Cytat(Wickerman @ 27.06.2010, 17:36:14 ) *
Przeglądarka pokazuje kodowanie UTF-8, pliki są enkodowane w notepad++ za pomocą UTF8 (bez BOM). Do tego tablica POST nie jest zakrzaczkowana, jedynie baza danych zamiast polskich znaków diakrytycznych wstawia pytajniki.

Ale jak wyciągniesz te dane z bazy i wyświetlisz na swojej www to są zakrzakowane? Może to w czym przeglądasz obecnie tabelę jest źle ustawione ..

ps. U mnie Twój kod działa poprawnie.
Wickerman
@ramol:
To jest pewien pomysł, bo dane z tabeli to wyciągam w oknie mysql-a, po wyciągnięciu ich z powrotem do www być może problemu nie będzie, co nie zmienia faktu, że wciąż pozostaje jedna uciążliwość gdyż chcąc wyciągnąć niezakrzaczone dane z bazy trzeba będzie to robić tylko i wyłącznie za pomocą PHP co w przypadku zastosowań mojej bazy nie będzie zbyt praktyczne (ze względu na różnorodność zapytań).

Może jestem perfekcjonistą, ale lubię gdy mam wszystko pod kontrolą, bo w razie draki wiem co się dzieje.
Więc ponawiam pytanie: dlaczego pomimo poprawności wyświetlania danych na stronie www, przy ustawieniach bazy podanych wyżej polskie litery w bazie nie są poprawnie wyświetlane.

PS. Jeszcze jedna rzecz. Gdy wpisuję polskie litery z poziomu wiersza poleceń mysql-a (również z konta roota) dane są wprowadzane do bazy poprawnie O_O

No i dziękuje za dotychczas udzielone odpowiedzi, które okazały się bardzo pomocne!
ramol
Czym administrujesz bazę ? Z wiersza poleceń windowsa czy coś w tym stylu ? Jeśli tak to wina po prostu tego programu/terminala w ustawieniach wyświetlania smile.gif
Wickerman
No tak, używając konsoli z Windowsa, w bazie są krzaki, ale gdy wyciągam dane z powrotem na stronę lub za pomocą phpMyAdmina to wszystko śmiga aż miło guitar.gif

Jeszcze raz dziękuję za pomoc.
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.