PHP kłóci się z POSTem i textarea

Kilka dni temu, podczas projektowania edytora tekstu zauważyłem ciekawe zjawisko dotyczące przesyłania danych POSTem i ich odbioru w PHP. Zjawisko to, a w zasadzie błąd, powoduje ucięcie pojedynczego znaku nowej linii podczas przesyłania formularza, pod warunkiem, że jest to pierwszy znak w przesyłanym tekście. Problem ten dotyczy tekstu edytowanego za pomocą html’owego textarea i występuje w PHP 4 i 5 (sprawdzałem na PHP 4.4.6 oraz PHP 5.2.2). Dodam, że efekt ten nie występuje gdy formularz jest przesyłany metodą GET.

Tutaj znajduje się przykładowy skrypt, a tutaj jego kod źródłowy.

Aktualizacja:

Wygląda na to, że don_jaro ma rację. Prawdopodobnie nie jest to wina ani PHPa, ani serwera, ale przeglądarek, które w magiczny sposób ignorują pierwszy znak nowej linii w textarea. Z drugiej strony dziwne jest, że wszystkie przeglądarki (które zdołałem uruchomić, tzn IE6, IE7, Opera 9, Firefox 2, Safari 2) zachowują się w ten sam sposób.


 
 
 
 

7 Responses to “PHP kłóci się z POSTem i textarea”

  1. Michał
    21. August 2007, 23:13

    Dziwne… u mnie ten kod działa poprawnie :) http://projekty.webhome.pl/abc.php

  2. don_jaro
    21. August 2007, 23:28

    “Problem” leży raczej w sposobie wysyłania danych przez przeglądarki. Spróbuj takiego kodu (uproszczony):

    Zobaczysz, że mimo dodania znaków nowej lini w pierwszym textarea, oba zawierają taki sam tekst (bez nowej linii) - wynika z tego, że to przeglądarki ignorują pierwszy znak nowej linii. Używając Odyseusza (http://www.netcoffee.pl/pogodzinach/2006/02/16/oddyseus-serwer-proxy/) możesz sprawdzić, że wysyłane wartości obu pól są jednakowe.

  3. don_jaro
    21. August 2007, 23:30

    Hmmm, kod zniknął był, spróbuję wpisać to jeszcze raz, używając nawiasów [], zamiast trójkątnych…
    [?php
    define('NL', "\r\n");
    define('TEXT', 'test');
    ?]
    [textarea][?php echo NL . TEXT ?][/textarea]
    [textarea][?php echo TEXT ?][/textarea]

  4. ZCE
    21. August 2007, 23:36

    Tu masz wyjaśnienie
    http://us.php.net/manual/en/faq.using.php#faq.using.newlines

  5. Kasjan.pl
    22. August 2007, 00:03

    zamien ‘ na ”
    http://pl2.php.net/types.string
    dopiero w podwojnych cudzyslowach ‘honorowane’ sa \n\r

  6. admin
    22. August 2007, 08:50

    Michał: Jeśli wydaje wam się, że działa poprawnie sprawdźcie czy czasami zamiast nowych linii nie macie na przykład spacji i nowej linii. Często się zdarza, że właśnie tak jest, a mnie interesuje przypadek gdy mamy np. 5 nowych linii i jakiś tekst.

  7. admin
    22. August 2007, 08:55

    Kasjan.pl: zmiana ‘ na ” nie pomaga, to nie jest problem znaku nowej linii definiowanego przez \n\r , a raczej przesyłania. Efekt kasowania nowej linii nie występuje np. przy przesyłaniu GETem, mimo użycia ‘.

Leave a Reply