Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z polskimi znakami
Forum PHP.pl > Forum > PHP
Rid
Witam , mam problem z polskimi znakami.PHP podczas wysyłania formularza wszystko parsuje na kod ASCII mimo że w nagłówkach mam deklaracje kodowania.Szukałem wszędzie i szukać będę dalej rozwiązania.Może to jest wina jakiegoś ustawienia w php.ini??Jest to dla mnie bardzo ważne ,gdyż w połączeni z bazą danych MYSQL nie zapisuje mi w rekordach polskich znaków.Nie uzywam żadnych funkcji typu htmlentities ,htmlspecialchars ponieważ polskie litery zapisywało mi w postaci Encji ale ,czytałem że to normalne.Problem jedynie w tym ,że kombinuje i wykombinować nie mogę dlaczego mimo deklaracji nagłówków używania przeróżnych funkcji typu ICONV nadal koduje mi w ASCII po wysłaniu formularza.
Moje ustawienia :
The Apache HTTP Web Server Version 2.2
php-5.3.3
mysql-5.1.52
WindowsXP Home
Może ktoś miał już taki problem??
strife
Hej,

Jaką masz deklarację kodowania w nagłowkach?

Upewnij się też czy jest poprawne kodowanie w tabelach w bazie danych.

PS. Czasami po połączeniu z bazą pomaga coś ala mysql_query("SET NAMES 'UTF8'");
Rid
Wszystko w bazie mam zadeklowane na latin2 na php też .To nie wina sql.Może być że to Apache,ale w 90% pewien jestem że wina leży po stronie Php,mam taką funkcje:
Kod
$
charset = mysql_client_encoding($dbc);
if ( $charset != 'latin2' ) {
  mysql_set_charset('latin2',$dbc);

if (!mb_check_encoding($r_imie,'latin2') ) {
  die ('Co to za kodowanie ziom?'); // haha.gif
}  else  {
      $r_imie=iconv("ASCII" ,"latin2//TRANSLIT",$r_imie);
             $r_imie=html_entity_decode( $r_imie, ENT_QUOTES, 'latin2');
echo mb_detect_encoding($r_imie, "auto");   }

gdzie r_imie to dane z imputa-imie.Funkcja iconv konwetuje z ASCII do latin2 a mb_detect_encoding sprawdza jakie kodowania i efekt jest taki że zawsze jest ASCII mimo że dam różne kodowania ISO UTF i inne to efekt wyjściowy jest zawsze taki sam= ASCII i w głowę zachodzę dlaczego?questionmark.gif Już 4dni nad tym siedzę i pomysły już mi się kończą.Dlatego zarejestrowałem się tutaj ,może ktos miał podobny problem?questionmark.gif
1oBuZ
Kolego uniwersalnym sposobem jest wysyłanie do bazy polskich znaków w postaci wspomnianych encji.
Nie rozmiem jednak celu trzymania polskich znaków w bazie danych.

Jeżeli dane do bazy wysyłasz z poziomu strony (przykładowo formularze), następnie je na niej odczytasz to pomimo krzaczków w bazie otrzymasz polskie znaki "bez zbędnych cudów".
Rid
Trochę ucieszyła mnie ta odpowiedź , trochę zasmuciła bowiem utrudnia to manipulowaniem rekordów bazy z poziomu konsoli sql.Może jest jednak jakieś rozwiązanie-ja myślę że to złe parsowanie metody przesyłu POST.Może jakieś specjalne
ustawienia w pliku php.ini.Wiem,że istnieje możliwość zmiany sposobu przesyłu metody Post z ASCI do ANSI lub w trybie binarnym ,lecz nie wiem gdzie co i jak dokładnie ustawić.

Liczyłem na jakąś pomoc w rozwiązaniu tej kwestii.Pozostaje mi użyć funkcji htmlentities i sprowadzić polskie znaki do encji a te z koleji przerobić za pomocą str_replace aby się zapisały do bazy z języczkami ,może się uda albo się mylę. wstydnis.gif
Quadina
Stwórz tabele z porównywaniem znaków utf8_polish_ci, koniecznie STWÓRZ table, nie zmień już istniejących bo to nic nie da. Następnie zaraz po połączeniu wykonuj tak jak napisał Ci strife:
  1. SET NAMES 'UTF8';


To jedyna możliwość, na utrzymanie wszystkich danych w utf8. Niestety po stworzeniu tablicy w innym kodowaniu i następnie przestawieniu ich na prawidłowe nie uzyska się pożądanego efektu. Nagłówki plików bazy .mdf zostaną już utworzone w innym kodowaniu i tak też będą przechowywać dane.
Rid
Wcześniej miałem UTF8- w bazie miałem ustawione wszystko na utf8 nawet tabele ,jednakże system porównania utf8 general ci hmm -czeka mnie znowu konwersja -wszystkich dokumentów na utf8 ,ale spróbuje.Dziękuje + dla Ciebie:)

CD....utworzyłem bazę w utf8 sformatowałem dokumenty do utf8 bez boma i nadal krzaki.Użyłem funkcji sprawdzającej
Kod
$charset = mysqli_client_encoding($dbc);

echo "The current character set is: $charset\n";
wskazuje ona na UTF-8 .Ustawiłem , jeszcze
Kod
  mysqli_query("SET NAMES utf-8");
przed wysłaniem zapytania do bazy i porównanie znaków z UTF-8 polish_ci i nie pomogło.Baza była tworzona w MySql WorkBench gdzie każda kolumna w tabeli jak i sama tabela jest w UTF-8 polish_ci. Wszędzie w nagłówkach mam zadeklarowane utf-8.Może jakieś dodatkowe sugestie?questionmark.gifquestionmark.gif?
Quadina
  1. mysqli_query("SET NAMES utf8;");

Twoje zapytanie w poście wyżej z myślnikiem wygenerowało błąd, którego pewnie nie obsługujesz przy tak prostym zapytaniu.
Rid
Dzięki-już poprawiłem -ale nie pomogło; ą zapisuje jako ů ,ł jako ┼é , ź- jak ┼║ itd.Już brak mi pomysłów dry.gif
Quadina
To może jeszcze raz podsumuje.
1. Zakładasz NOWĄ bazę danych z kodowaniem utf8_polish_ci
2. Zmieniasz kodowanie strony na utf8 zarówno w typie plików jak i w meta tagach
3. Łączysz się do bazy danych zawsze z SET NAMES utf8;

Jeżeli jesteś pewien że spełniasz 3 powyższe warunki i wciąż nie działa to odezwij się do mnie na GG, bo to będzie pierwszy przypadek gdzie nie działa od kiedy pamiętam.
Rid
3 warunki spełnione. Baza stworzona od nowa w MySql Workbench z porównaniem znaków utf8 polish_ci.Niestety nie pomogło sad.gif Hmm jeszcze sprawdzę jakie kodowanie jest po wysłaniu formularza.

Dostałem skrypt od użytkownika celbarowicz
polegający na utworzeniu bazy danych w utf8 ,collate utf 8 polish_ci z poziomu php -bazę danych utworzyło więc musi być kodowanie w tym formacie.Mam ustawione meta ,header na utf-8 , skonwertowane pliki php na utf8 bez bom ,nawet przeglądarkę mam na utf-ie i co nadal krzaki w bazie danych ,czy apache może mieć coś z tym wspólnego??
Ps.Nie mam aktualnie żadnych funkcji typu Htmlentities.Ma ktoś jeszcze jakieś pomysły.Będę wdzięczny za każdą sugestje.
celbarowicz
pokaż skrypt 1)tworzący bazę z tabelą,
2) zapisujący do tabeli,
3)odczytujący dane.

to co Tobie podałem działau mnie na: 1)localu, 2)cba.pl
Rid
Połączenie z bazą
Kod
header('Content-type: text/html; charset=UTF-8');
  
      

$link=mysql_connect('localhost','root','artur');

$charset = mysql_client_encoding($link);

if ( $charset != 'utf8' ) {

mysql_set_charset('utf8',$link);

}



$sql="CREATE DATABASE IF NOT EXISTS rejestr ";

mysql_query($sql) or die(mysql_error());





mysql_select_db('rejestr',$link);



$sql="CREATE TABLE IF NOT EXISTS rejstr(

id int(4) NOT NULL auto_increment,

nick varchar(30) NOT NULL ,

haslox varchar(32) NOT NULL ,

mails varchar(70) NOT NULL ,



PRIMARY KEY klucz1 (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; ";



mysql_query($sql) or die(mysql_error());

    
?>

Skrypt zapisujący do tabeli:
Kod
require_once 'connection.php';
  
    
  $charset = mysql_client_encoding($link);

echo "The current character set is: $charset\n";  
      
mysql_query("SET NAMES utf8");

  $r_imie=html_entity_decode( $r_imie, ENT_QUOTES, 'utf8');
echo mb_detect_encoding($r_imie, "auto");
$query="INSERT INTO  rejstr(id,nick,haslox,mails)"."values(null,'$r_imie','$ghaslo','$e_mail')";

mysql_query($query, $link)
or die('Błąd zapytaniu do bazy danych.');
mysql_query("SET NAMES utf8");
mysql_close($link);


odczytującego nie mam-chodzi mi o polskie litery zapisane w bazie sql-są po prostu krzaki
celbarowicz
sprawdź to
  1. <?php
  2. header('Content-type: text/html; charset=UTF-8');
  3.  
  4.  
  5.  
  6. $link=mysql_connect('localhost','root','');
  7.  
  8. $charset = mysql_client_encoding($link);
  9.  
  10. if ( $charset != 'utf8' ) {
  11.  
  12. mysql_set_charset('utf8',$link);
  13.  
  14. }
  15.  
  16.  
  17.  
  18. $sql="CREATE DATABASE IF NOT EXISTS rejestr ";
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. mysql_select_db('rejestr',$link);
  26.  
  27.  
  28.  
  29. $sql="CREATE TABLE IF NOT EXISTS rejstr(
  30.  
  31. id int(4) NOT NULL auto_increment,
  32.  
  33. nick varchar(30) NOT NULL ,
  34.  
  35. haslox varchar(32) NOT NULL ,
  36.  
  37. mails varchar(70) NOT NULL ,
  38.  
  39.  
  40.  
  41. PRIMARY KEY klucz1 (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; ";
  42.  
  43.  
  44.  
  45.  
  46.  
  47. ?>
  48.  



zapis do bazy
  1. <?php
  2. header('Content-type: text/html; charset=UTF-8');
  3.  
  4.  
  5.  
  6. $link=mysql_connect('localhost','root','');
  7.  
  8. $charset = mysql_client_encoding($link);
  9.  
  10. if ( $charset != 'utf8' ) {
  11.  
  12. mysql_set_charset('utf8',$link);
  13.  
  14. }
  15. mysql_select_db('rejestr',$link);
  16.  
  17. $r_imie='ąśźćłóę';
  18. $ghaslo='hasło_ążśźć';
  19. $e_mail='email_ęółń';
  20. $query="INSERT INTO rejstr (id,nick,haslox,mails) VALUES ('','$r_imie','$ghaslo','$e_mail')";
  21.  
  22. mysql_query($query, $link)
  23. or die('Błąd zapytaniu do bazy danych.');
  24. mysql_query("SET NAMES utf8");
  25. mysql_close($link);
  26.  
  27.  
  28. ?>
  29.  

i teraz speawdź co jest w bazie
Rid
krzaki sad.gif

Na sztywno nie przyniosło rezultatu ,sprawdzanie bazy jaki i zmiennej $r_imie wykazuje po przesłaniu że jest w utf8 hmm withstupidsmiley.gif
celbarowicz
korzystam z wampa, używając tych skryptów dokładnie tak jak podałem w bazie mam polski znaki.

withstupidsmiley.gif withstupidsmiley.gif
Rid
Dziękuję za uwagę party.gif Męczę się już parę dni nad tym hmm-może niewłaściwa konfiguracja serwera z php i mysql może te wersje nie współgrają ze soba sciana.gif

Możesz mi jeszcze powiedzieć jaką wersje php masz bo na mojej to czytałem że nawet xdebuger nie pójdzie może to jest nie właściwa wersja dry.gif
celbarowicz
WAMPSERVER 2.0
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.