PHP/MYSQL Problem z polskimi znakami


(Kamix07) #1

Witam!

Problem polega na tym, że treść pobierana na stronę PHP z bazy MYSQL zamiast polskich znaków wyświetla znaki zapytania.

W 'PHP My Admin' (używam WebServa) ustawiłem już w bazie i tabeli na 'utf8_unicode_ci', lecz nadal nic.

W nagłówku strony mam 'iso-8859-2', lecz gdy zmieniam na UTF-8 to polskie znaki znikają na całej zawartości strony. Gdy usuwam całą tą linię z nagłówka jest tak jakby był iso, tj. na stronie pl znaki są, lecz we fragmencie pobieranym z bazy są znaki zapytania.

Próbowałem już zrobić tak jak tu http://php.pl/Wortal/Artykuly/Pomysly-porady-sugestie-dobre-nawyki/Polskie-znaki-a-MySQL, ale to też nie pomogło...

Co zrobić, żeby wyświetlało polskie znaki z bazy na stronie?

pozdrawiam


(Pablo_Wawa) #2

Jaką wersję PHP i MySQL posiadasz?

Spróbuj użyć funkcji

iconv("UTF-8","ISO-8859-2","To są polskie ogonki ąęśżźćłóń");

i zobacz jak to wygląda na ekranie.

http://php.net/manual/pl/function.iconv.php

Przetestuj tę funkcję na danych pobieranych z bazy.


(Kamix07) #3

Wersja PHP: 5.3.10, MySQL: 5.5.21 (WebServ 2.1)

Spróbowałem z tym iconv, ale nadal nie ma polskich znaków...


(Pablo_Wawa) #4

Znaki zapytania na ekranie mogą być wyświetlane przez błędną stronę kodową dokumentu HTML. Upewnij się, że masz poprawne wpisy w nagłówku HTML takiej strony. Najlepiej podejrzyj go w przeglądarce (pokaż źródło strony), jeśli możesz to wklej tutaj ten nagłówek (dane "osobiste" możesz wyciąć).

Możesz też spróbować zapisać fragment zawierający (błędne) polskie znaki do pliku tekstowego i zobaczyć jakimś edytorem Hex, jak są one tam zakodowane. To da Ci informację, jakim kodowaniem w "środku" (w PHP) operujesz i podpowie, co dalej z tym możesz zrobić.

I jeszcze jedna uwaga - może w bazie danych jest inne kodowanie znaków, niż myślisz? Mam tu na myśli to, że na początku dane były zapisywane do tabeli w innym kodowaniu, niż potem (kiedy je zmieniłeś). Zmiana kodowanie zapewne nie przekonwertowała tych danych istniejących w bazie i stąd ten Twój problem? Sprawdź na jakichś nowych (wprowadzonych) danych, jak to się zachowuje.


(Kamix07) #5

To jest kod tej podstrony:

tam gdzie (...) są fragmenty, które nie mają wpływu na problem, więc je usunąłem.

w nagłówku meta z tym iso-8859-2 jest tu w komentarzu, ale jak była normalnie to efekt był ten sam, a jak zamiast iso-8859-2 było utf-8 to krzaczki były na całej podstronie (i zawartość z bazy i normalna treść)

<?php

session_start();

?>





Słownik

(...)
<?php if (isset($_SESSION['login'])) { ?>

Słownik

<?php @ $mysql = mysql_connect( 'localhost', 'root', '' ); if(!$mysql) { echo 'Brak połączenia z bazą danych.'; exit; } $wybrana = mysql_select_db('slownik'); if(!$wybrana) { echo 'Błąd wyboru bazy danych.'; exit; } $zapytanie = "select * from pojecia"; $wynik = mysql_query($zapytanie); if (!$wynik) { echo 'Nie można wyświetlić zawartości bazy.'; exit; } if (mysql_num_rows($wynik) >0) { while($zmienna = mysql_fetch_assoc ($wynik)) { echo ''; echo $zmienna['slowo']; echo ' - '; echo $zmienna['definicja']; echo ' '; } } } else { ?> Niestety, nie jesteś uprawniony do przeglądania zawartości tej strony. <?php } ?>
(...)

(Pablo_Wawa) #6

A propos tych krzaczków, to zapewne Ty ten swój plik .php też nie masz zapisany w UTF-8 i stąd masz krzaki przy ustawieniu kodowania UTF-8.

Spróbuj przekonwertować taki plik .php do UTF-8 i ustaw kodowanie na takie i sprawdź - krzaczki na stronie znikną (prócz tych z bazy danych).

Jeśli tak, to sprawdź z nowymi danymi z bazy MySQL.

EDIT: spróbuj jeszcze po połączeniu się i wybraniu danej bazy danych (slownik) ustawić "ręcznie" kodowanie danych w bazie

mysql_query("SET NAMES 'utf8'");

lub

mysql_query("SET NAMES utf8");

mysql_query("SET CHARACTER_SET utf8_unicode_ci");

(Kamix07) #7

Ok,zaraz spróbuję. Mam jeszcze jedno, może trochę głupie pytanko Jak przekonwertować ten plik .php do UTF-8. Bo chyba nie chodzi tylko o zmianę w nagłówku w polu meta na utf-8..?


(Pablo_Wawa) #8

Dokładnie, sama zmiana nagłówka nie wystarczy. Konwersję posiadają dobre edytory w menu (Notepad++ w opcji Encoding -> Convert to UTF-8 without BOM - używam ustawienia dla języka angielskiego bo jest mi tak wygodniej).

Są też osobne programy (np. Gżegżółka), które to też robią.


(Kamix07) #9

Ja używam Keda. Zmieniłem stronę kodową i ustawiłem w nagłówku meta na UTF-8. Efektem jest to, że np. zamiast Słownik wyświetla się S³ownik (chodzi o normalną treść). Treść z bazy nadal pozostaje ze znakami zapytania.


(Pablo_Wawa) #10

Na stronie www wyświetla się S³ownik, a w edytorze tekstów jest poprawnie (przy ustawionym kodowaniu na UTF-8)?


(Kamix07) #11

W podglądzie w programie Ked jest tak jak w przeglądarce, czyli też S³ownik


(Pablo_Wawa) #12

To coś jest nie tak z konwersją pliku .php. :frowning:

Spróbuj poprzednią (ISO) wersję przekonwertować Gżegżółką (http://www.gzegzolka.com/) albo Notepad++ (http://download.tuxfamily.org/notepadplus/6.2/npp.6.2.bin.zip - wersja portable) na UTF-8.

A jak ręcznie poprawisz w nim to słowo na Słownik i w edytorze już go widzisz poprawnie, to czy na stronie www jest ono dobrze wyświetlane, czy wciąż z błędem?

Inna sprawa to te dane z bazy MySQL - wstaw coś do niej nowego i wyświetl na stronie www - jak wygląda?


(Sienek M) #13

mysql_query(“SET NAMES utf8”);

 

Witam serdecznie,

Widzę, że temat bardzo stary, ale nadal ciężko trafić w sieci na poprawne rozwiązanie i tak dopiero powyższa instrukcja rozwiązała mój problem. Piszę, bo chciałbym się teraz dowiedzieć czemu w/w polecenie rozwiązuje problem, a ręczne ustawienie kodowania jw. w phpmyadmin nie radzi sobie z polskimi znakami. Trik ten muszę stosować przy zapisie i oczywiście przy odczycie z bazy.

 5.6.21 - MySQL

5.6.3 - PHP