Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: formularz - polskie znaki.... Problem
Forum PHP.pl > Forum > PHP
gausek
Witam, wiem że było mnóstwo tematów o tym problemie lecz żadne rozwiązanie mi nie pomogło, a mi samemu już brakuje pomysłów co jest nie tak i jak można to naprawić. Oczywiście chodzi o brak polskich znaków w wysłanym e-mailu. Kod z plików umieszczam poniżej:

Formularz - HTML
  1. <div id="formularz">
  2. <form method="post" id="form" enctype="text/plain">
  3. <div>
  4. <label for="name">Imię i nazwisko</label>
  5. <input id="name" name="name" type="text" />
  6. <span id="nameInfo">Podaj swoje imię i nazwisko lub nazwę firmy.</span>
  7. </div>
  8. <div>
  9. <label for="email">E-mail</label>
  10. <input id="email" name="email" type="text" />
  11. <span id="emailInfo">Podaj swój adres e-mail żebym mógł Ci odpowiedzieć.</span>
  12. </div>
  13. <div>
  14. <label for="message">Wiadomość</label>
  15. <textarea id="message" name="message" ></textarea>
  16. </div>
  17. <div>
  18. <input id="send" name="send" type="submit" value="Wyślij" onclick="wyslij();"/>
  19. </div>
  20. </form>
  21. </div>



Javascript
  1.  
  2. /* ----- XMLHttpRequestObject ----- */
  3.  
  4. function getXMLHttpRequestObject() {
  5.  
  6. if(window.XMLHttpRequest) {
  7. try{
  8. return new XMLHttpRequest();
  9. }
  10. catch(e){
  11. return false;
  12. }
  13. }
  14. else if (window.ActiveXObject) {
  15. var wersjeMSXML = new Array(
  16. "MSXML2.XMLHTTP.6.0",
  17. "MSXML2.XMLHTTP.5.0",
  18. "MSXML2.XMLHTTP.4.0",
  19. "MSXML2.XMLHTTP.3.0",
  20. "MSXML2.XMLHTTP",
  21. "Microsoft.XMLHTTP"
  22. );
  23. for (var indeks in wersjeMSXML){
  24. try{
  25. return new ActiveXObject(wersjeMSXML[indeks]);
  26. }
  27. catch(e){
  28. }
  29. }
  30. return false;
  31. }
  32. }
  33.  
  34. var XMLHttpRequestObject = getXMLHttpRequestObject();
  35.  
  36. /* ----- Validation ----- */
  37. function wyslij() {
  38.  
  39. //global vars
  40. var form = $("#form");
  41. var name = $("#name");
  42. var nameInfo = $("#nameInfo");
  43. var email = $("#email");
  44. var emailInfo = $("#emailInfo");
  45. var message = $("#message");
  46.  
  47. //On key press
  48. name.keyup(validateName);
  49. email.keyup(validateEmail);
  50. message.keyup(validateMessage);
  51.  
  52. //On Submitting
  53. form.submit(function(){
  54. if(validateName() & validateEmail() & validateMessage())
  55. return true
  56. else
  57. return false;
  58. });
  59.  
  60. //validation functions
  61. function validateEmail(){
  62. //testing regular expression
  63. var a = $("#email").val();
  64. var filter = /^[a-zA-Z0-9]+[a-zA-Z0-9_.-]+[a-zA-Z0-9_-]+@[a-zA-Z0-9]+[a-zA-Z0-9.-]+[a-zA-Z0-9]+.[a-z]{2,4}$/;
  65. //if it's valid email
  66. if(filter.test(a)){
  67. email.removeClass("error");
  68. emailInfo.text("Pole wypełnione prawidłowo.");
  69. emailInfo.removeClass("error");
  70. return true;
  71. }
  72. //if it's NOT valid
  73. else{
  74. email.addClass("error");
  75. emailInfo.text("Proszę wpisać prawidłowy adres e-mail.");
  76. emailInfo.addClass("error");
  77. return false;
  78. }
  79. }
  80. function validateName(){
  81. //if it's NOT valid
  82. if(name.val().length < 4){
  83. name.addClass("error");
  84. nameInfo.text("To pole powinno zawierać conajmniej 4 znaki.");
  85. nameInfo.addClass("error");
  86. return false;
  87. }
  88. //if it's valid
  89. else{
  90. name.removeClass("error");
  91. nameInfo.text("Pole wypełnione prawidłowo.");
  92. nameInfo.removeClass("error");
  93. return true;
  94. }
  95. }
  96. function validateMessage(){
  97. //it's NOT valid
  98. if(message.val().length < 10){
  99. message.addClass("error");
  100. return false;
  101. }
  102. //it's valid
  103. else{
  104. message.removeClass("error");
  105. return true;
  106. }
  107. }
  108. /* ----- Sending ----- */
  109. var dName = document.getElementById('name');
  110. var dEmail = document.getElementById('email');
  111. var dMessage = document.getElementById('message');
  112. var tName = dName.value;
  113. var tEmail = dEmail.value;
  114. var tMessage = dMessage.value;
  115. tName = escape(tName);
  116. tMessage = escape(tMessage);
  117. if(XMLHttpRequestObject){
  118. var przycisk = document.getElementById('send');
  119. var div= document.getElementById('formularz');
  120. var url = "../send.php?";
  121. url += "name=" + tName + "&email=" + tEmail + "&message=" + tMessage;
  122. if(validateName() & validateEmail() & validateMessage()) {
  123. przycisk.disabled = true;
  124. XMLHttpRequestObject.open("GET", url);
  125. XMLHttpRequestObject.onreadystatechange = function() {
  126. if (XMLHttpRequestObject.readyState == 4){
  127. if(XMLHttpRequestObject.status == 200){
  128. var tekst = XMLHttpRequestObject.responseText;
  129. tekst = unescape(tekst);
  130. div.innerHTML = tekst;
  131. }
  132. }
  133. else {
  134. tekst = '<div><img src="../images/loading.gif" class="loading" /></div>';
  135. div.innerHTML = tekst;
  136. }
  137. przycisk.disabled = false;
  138. }
  139. XMLHttpRequestObject.send(null);
  140. }
  141. }
  142. }


PHP - send.php
  1. <?php
  2.  
  3. function to_utf8($string) {
  4. if ( preg_match('%^(?:
  5. [\x09\x0A\x0D\x20-\x7E] # ASCII
  6. | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
  7. | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
  8. | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
  9. | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
  10. | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
  11. | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
  12. | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
  13. )*$%xs', $string) ) {
  14. return $string;
  15. } else {
  16. return iconv( 'CP1252', 'UTF-8', $string);
  17. }
  18. }
  19.  
  20. function validateName($name){
  21. //if it's NOT valid
  22. if(strlen($name) < 4)
  23. return false;
  24. //if it's valid
  25. else
  26. return true;
  27. }
  28.  
  29. function validateEmail($email){
  30. if(!preg_match("/^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$/i", $email)) {
  31. return false;
  32. }
  33. else {
  34. return true;
  35. }
  36. }
  37.  
  38. function validateMessage($tresc){
  39. //if it's NOT valid
  40. if(strlen($tresc) < 10)
  41. return false;
  42. //if it's valid
  43. else
  44. return true;
  45. }
  46.  
  47. $name = to_utf8($_GET['name']);
  48. $tresc = to_utf8($_GET['message']);
  49. $nadawca = to_utf8($_GET['email']);
  50.  
  51. if (!empty($name) && !empty($nadawca) && !empty($tresc)) {
  52. if (validateName($name) && validateEmail($nadawca) && validateMessage($tresc)) {
  53. $mail = "przykladowy@email.pl";
  54. $message = "$tresc\nOd: $name\ne-mail: $nadawca";
  55. $header = "From: $name <$nadawca>\r\nContent-Type: text/plain; charser=UTF-8";
  56.  
  57. @mail("$mail", "Wiadomosc ze strony internetowej", "$message", "$header")
  58. or die('Nie udało się wysłać wiadomości.\n<a href="../kontakt/">Wróć</a>');
  59.  
  60. echo 'Wiadomość wysłana pomyślnie\n$form';
  61. } else {
  62. echo 'Wystąpił błąd podczas wysyłania wiadomośći. Spróbuj później\n<a href="../kontakt/">Wróć</a>';
  63. }
  64. } else {
  65. echo 'Wystąpił błąd podczas wysyłania wiadomośći. Spróbuj później\n<a href="../kontakt/">Wróć</a>';
  66. }
  67.  
  68.  
  69. ?>


PS. Próbowałem pobawić się funkcją to_utf8 ale w wysłanym mailu i tak nie ma polskich znaków. Co mnie ciekawi to to, że gdy zamiast @mail wstawię echo $message to polskie znaki są, tak więc są wszędzie oprócz w wysłanym mailu.
PS 2. Kodowanie na każdej z moich stron mam UTF-8.

Proszę o pomoc
Z góry dziękuję
lukesh
Nie jestem na 100% pewien, ale strzelam - brakuje mi w twoim kodzie AJAX zdefiniowanego kodowania jako UTF-8. Pamiętam, że bardzo, bardzo dawno temu, kiedy też jeszcze korzystałem w "własnej" funkcji do asynchronicznego wysyłania danych, gdzieś po drodze trzeba było to w kodzie zdefiniować, żeby były polskie literki. Od dawna już nie korzystam z takiego kodu, bo jest on zbyt czasochłonny w porównaniu z frameworkami. Pomyśl może o tym, żeby skorzystać z jQuery lub Prototype, a naprawdę ułatwisz sobie życie.

Trochę pogrzebałem w starych śmieciach i... funkcja escape, której używasz, nie działa ze znakami w kodowaniu UTF-8. Powinieneś zamiast escape użyć encodeURIComponent(). Myśle, że to powinno pomóc.
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.