zapytanie POST (polskie znaki)

0

Witam,
Wpisuję do formularza zestaw polskich znaków, są wysyłane przez post do innego skryptu php i tam mają zostać wpisane do bazy. Tymczasem chodź i formularz i funkcja wysyłająca są tak naprawdę na jednej stronie (utf8) to po przesłaniu przez POST mam "krzaczki", ktore wpisuje mi do bazy. Jak się tego pozbyć?

Próbowałem ręcznie zamieniać krzaczki na właściwe litery. Ale okazało się, że ą oraz ć mają ten sam "krzaczek".

0

Może kod pokaż? I po połączeniu z bazą daj jako pierwsze zapytanie:

SET NAMES utf8
0
Demonical Monk napisał(a)

Może kod pokaż? I po połączeniu z bazą daj jako pierwsze zapytanie:

SET NAMES utf8

Dodałem to. Jak wpisze bezpośrednio informacje do zapytania np:
"INSERT INTO komentarze (tresc, nick, "." data) VALUES ('ążśźćłó', 'łóżko', "." now());";
To te wszystkie polskie znaki zapisuja sie do bazy prawidłowo. Problem polega na tym, że pierw te dane biore od użytkownika (przesłane przez formularz metodą POST) i to się pojawiają "krzaki".

Żeby nie zaśmiecać. Kod dormularza:

if ($id=='nowy') { //jeżeli zmienna id zawiera wyraz nowy
 print "<HR>"; //wyświetlamy formularz do wpisania komentarza
 print "<H3>Nowy komentarz:</H3>";
 print "<FORM METHOD=POST><INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"dodaj\">";
 print "<B>Pseudonim:</B><BR><INPUT TYPE=\"text\" NAME=\"nick\" VALUE=\"$nick\" SIZE=60><BR>n ";
 print "<B>Treść:</B><BR><TEXTAREA NAME=\"tresc\" ";
 print "ROWS=10 COLS=60>$tresc</TEXTAREA><BR>n";
 print "<INPUT TYPE=\"submit\" VALUE=\"Wyslij\">";
 print "</FORM>";
 print "<a href=\"komentarze.php\">Powrót</a>";
 }

Kod dodający info do bazy:

if ($tresc && $nick) { //jeżeli pola treść i pseudonim są uzupełnione
 $wynik = mysql_query ('SET NAMES utf8');
 $zapytanie = "INSERT INTO komentarze (tresc, nick, "." data) VALUES ('$tresc', '$nick', "." now());";
 $wynik = mysql_query ($zapytanie); 
 print "<HR>";
 print"<H4>Twój komentarz został dodany do bazy. Ukaże się, gdy administrator go zatwierdzi</h4><br>"; //jeżeli wszystko przebiegnie bez problemów wyświetlamy komunikat
 print"<a href=\"komentarze.php\">Powrót</a>";
 }
0

A gdzie niby w tym formularzu jest jakaś deklaracja kodowania? Jest zapisany w UTF-8? Jest header? Jest meta? Bo nie widzę...

<?php
//Na początku dokumentu przed wysłaniem czegokolwiek do użytkownika
header('Content-Type: text-html; charset="utf-8"');
?>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
0

Jeszcze dorzucę od siebie że w bazie w polach tekstowych przydałoby się też mieć dobre formatowanie ustawione. ;)

0

Mam ustawione kodowania na stronie oraz w dla bazy danych i dla tabeli. Przykladowe dodanie do bazy ze strony:
1.Wpisane recznie cale:
INSERT INTO komentarze (tresc, nick, data) VALUES ('Łukasz', 'łóżeczko małe', now());
2. Z formularza:
INSERT INTO komentarze (tresc, nick, data) VALUES ('Å�óżeczko maÅ�e', 'Å�ukasza', now());

Tutaj jest stronka:
http://www.brzuszki.com.pl/komentarze/komentarze.php
Jak się da na "dodaj komentarz" i się wpisze polskie znaki, to wyświetlam co algorytm odczytuje z obiektu żądania POST.

Tak jak pisalem. Nie wiem jak sobie poradzic, aby w zadaniu POST przesylane byly prawidlow informacje. W bazie sie dobrze zapisuje (sa Polskie znaki). Ale jak wysle krzaczki bo POST tak przekształca znaki-beda krzaczki.

0

Proponuję zablokować pokazywanie błędów zwłaszcza dotyczących bazy danych...
o tutaj --> http://www.ponikwa.pl

A odnośnie tych znaczków, to weź wszystkie pliki strony przekonwertuj w notepad++ na utf-8 (bez BOM). To nie POST przekształca Ci znaki na krzaczki, bez jaj.

0
GhostDog napisał(a)

A odnośnie tych znaczków, to weź wszystkie pliki strony przekonwertuj w notepad++ na utf-8 (bez BOM). To nie POST przekształca Ci znaki na krzaczki, bez jaj.

Korzystam z notepad++ i mam tak przekonwertowane jak mówisz. Przecież to jest wszystko jedna strona, jeden dokument. I wpisane rącznie słowa z polskimi znakami wyświetlają sie dobrze, a te odebrane z formularza (wszystko na jednej stronie) źle. To co jak nie POST !?!

0

Odebrane z formularza? Możesz jaśniej? To są dane odebrane z bazy, czy tylko na jednej stronie testujesz formularz, która wyniki przesyła do samej siebie? (Nie chce mi się czytać całego tematu, więc pytam)

A metoda POST nie ma takiej siły sprawczej żeby zmienić kodowanie znaków samo z siebie, określ może kodowanie znaków w formie np accept-charset="ISO-8859-1".

0
riker napisał(a)
GhostDog napisał(a)

A odnośnie tych znaczków, to weź wszystkie pliki strony przekonwertuj w notepad++ na utf-8 (bez BOM). To nie POST przekształca Ci znaki na krzaczki, bez jaj.

Korzystam z notepad++ i mam tak przekonwertowane jak mówisz. Przecież to jest wszystko jedna strona, jeden dokument. I wpisane rącznie słowa z polskimi znakami wyświetlają sie dobrze, a te odebrane z formularza (wszystko na jednej stronie) źle. To co jak nie POST !?!

A wszędzie masz wymienione wyżej nagłówki META o kodowaniu i headery?

0

Dodaj DOCTYPE do tego pliku

0
GhostDog napisał(a)

Dodaj DOCTYPE do tego pliku

E tam doctype, musi być coś z kodowaniem.

0

Wiem, że związek jest co najmniej wątpliwy, ale czasem są zonki.
Ja stawiam że accept-charset rozwiązało by problem.

Mnie dziwi jedno, czemu ff gdy podgląde stronę pokazuje mi samą META bez <head>, dopiero jak użyje view source chart jest wszystko ok

0
GhostDog napisał(a)

Odebrane z formularza? Możesz jaśniej? To są dane odebrane z bazy, czy tylko na jednej stronie testujesz formularz, która wyniki przesyła do samej siebie? (Nie chce mi się czytać całego tematu, więc pytam)
A metoda POST nie ma takiej siły sprawczej żeby zmienić kodowanie znaków samo z siebie, określ może kodowanie znaków w formie np accept-charset="ISO-8859-1".

Na jednej stronie testuję formularz, która wyniki przesyła do samej siebie.Dodałem accept-charset="UTF-8" oraz DOCTYPE (chodź tu nie jestem pewien czy prawidłowy). W każdym razie:
-Ustawione mam dobrze kodowania w bazie danach dla bazy i dla tabel
-strona poprawnie wyświetla polskie znaki (Notebad ++ - UTF8 bez BOM oraz odpowiednie meta)
-zapis z tej strony działa poprawnie, zapisują sie polskie znaki
- zapis danych z formularza (zamienia polskie znaki na krzaczki) powoduje zapis do bazy krzaczków (bo jakby inaczej)

Strona jest tutaj:
http://www.brzuszki.com.pl/komentarze/komentarze.php

Zamieszczę jeszcze kompletny kod:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//PL" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD>
<body>
<?php
 mysql_connect ("localhost", "login", "*******") or //staramy połączyć się z bazą danych
 die ("Blad polaczenia"); //jeżeli to się nie uda wyświetlamy
 mysql_select_db ("usr_web24_1") or //wybieramy bazę
 die ("Nie mozna sie polaczyc komentarze");
 
 $zapytanie = "INSERT INTO komentarze (tresc, nick, "." data) VALUES ('Łukasz', 'łóżeczko małe', "." now());";
 $wynik = mysql_query ('SET NAMES utf8');
 $wynik = mysql_query ($zapytanie);
 echo $zapytanie;
 
  if(!isset($id)) { //odbieramy wartość zmiennej id
 print"<A HREF=\"komentarze.php?id=nowy\">Dodaj nowy komentarz</A><HR>"; //jeżeli zmienna id nie ma przypisanej wartości
 $wynik = mysql_query ("SELECT * FROM komentarze WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone komentarze i segregujemy według pola nr od wartości największej do najmniejszej
 print"<UL>";
 while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
print "<LI><b>".$rekord[1] = stripslashes($rekord[1])."</b>, napisał: <br /> ".$rekord[2] = stripslashes($rekord[2])."</B>,<br /><i>data:".$rekord[3]."</i></LI>"; //za pomocą pętli while wyświetlamy wszystkie rekordy, które zostały zatwierdzone (wartość pola zatwierdz wynosi 1)
 }
 print"</UL>";
 }else if ($id=='nowy') { //jeżeli zmienna id zawiera wyraz nowy
 print "<HR>"; //wyświetlamy formularz do wpisania komentarza
 print "<H3>Nowy komentarz:</H3>";
 print "<FORM METHOD=\"POST\"  accept-charset=\"UTF-8\"><INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"dodaj\">";
 print "<B>Pseudonim:</B><BR><INPUT TYPE=\"text\" NAME=\"nick\" VALUE=\"$nick\" SIZE=60><BR> ";
 print "<B>Treść:</B><BR><TEXTAREA NAME=\"tresc\" ";
 print "ROWS=10 COLS=60>$tresc</TEXTAREA><BR>";
 print "<INPUT TYPE=\"submit\" VALUE=\"Wyślij\">";
 print "</FORM>";
 print "<a href=\"komentarze.php\">Powrót</a>";
 }else if ($id=='dodaj') { // jeżeli zmienna id zawiera wartość dodaj
 //dodajemy komentarz do bazy
 $tresc = addslashes(nl2br(htmlentities ($tresc))); //ponieważ nie można ufać danym wprowadzanym przez użytkowników funkcją addslashes dodajemy ukośniki () w miejscach gdzie napotkanym na apostrof (&#8216;), usuwamy je potem funkcją stripslahes przy wypisywaniu komentarzy, dodatkowo funkcja nl2br zamienia znaki końca linii na tag br
 $nick = addslashes(htmlentities ($nick));
 if ($tresc && $nick) { //jeżeli pola treść i pseudonim są uzupełnione
 $wynik = mysql_query ('SET NAMES utf8');
 $zapytanie = "INSERT INTO komentarze (tresc, nick, "." data) VALUES ('$tresc', '$nick', "." now());";
 $wynik = mysql_query($zapytanie); //dodajemy wtedy dane do bazy wraz z aktualną datą i godziną &#8211; funkcja now()
 print "<HR>";
 echo $zapytanie;
 print"<H4>Twój komentarz został, dodany do bazy. Ukaże się, gdy administrator go zatwierdzi</h4><br>"; //jeżeli wszystko przebiegnie bez problemów wyświetlamy komunikat
 print"<a href=\"komentarze.php\">Powrót</a>";
 }else{ //jeżeli jednak nie wyświetlamy stosowną informację
 print "<HR>";
 print"<h4>Pola pseudonim i treść muszą być wypełnione ! Kliknij wstecz w swojej przeglądarce i popraw te dane !</h4>";
 }
 }
 else { //jeżeli zmienna id zawiera inną wartość niż dodaj lub nowy wyświetlamy wszystkie zatwierdzone komentarze
 print"<A HREF=\"komentarze.php?id=nowy\">Dodaj nowy komentarz</A><HR>";
 $wynik = mysql_query ("SELECT * FROM komentarze WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone komentarze i segregujemy według pola nr od wartości największej do najmniejszej
 print"<UL>";
 while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
 print "<LI><b>".$rekord[1] = stripslashes($rekord[1])."</b>, napisał: <br /> ".$rekord[2] = stripslashes($rekord[2])."</B>,<br /><i>data:".$rekord[3]."</i></LI>"; //za pomocą pętli while wyświetlamy wszystkie rekordy, które zostały zatwierdzone (wartość pola zatwierdz wynosi 1)
 }
 print"</UL>";
 }
?> 
</body>
</HTML>

Czy tylko ja mam zawsze takie problemy z największymi pierdołami, które powinny działać?

0

Testnij na innym serwerze...

0

hmmyy, załącz formę bezpośrednio w pliku, bez tych ohydnych printów.
DOCTYPE masz zły, xhtml to między innymi mały litery tagów....przeleć to validatorem to zobaczysz co jest źle.

a jak zmienisz kodowanie na windows-1250 czy coś w tym stylu, dalej nie masz pl ogonków?

0
GhostDog napisał(a)

hmmyy, załącz formę bezpośrednio w pliku, bez tych ohydnych printów.
DOCTYPE masz zły, xhtml to między innymi mały litery tagów....przeleć to validatorem to zobaczysz co jest źle.

a jak zmienisz kodowanie na windows-1250 czy coś w tym stylu, dalej nie masz pl ogonków?

Ty myślisz że przeglądarka ma problemy z tagami z dużych liter? Obstawiam coś po stronie serwera, jeśli nic nie pomaga.

0

Nie myślę tak kolego, natomiast myślę, że Ty masz kłopoty z czytaniem ze zrozumieniem, padło pytanie o prawidłowy DOCTYPE to odpowiedziałem, to są podstawy więc dziwne jakbym nie zareagował.
Niech sprawdzi czy jak bezpośrednio w pliku zapisze polskie znaki to będą ogonki, wtedy się okaże czy ktoś sknocił coś w konf serwera.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1