Kto hostuje Stronę?

narzędzie do sprawdzania hostingu stron
2012-04-07 14:46:45

Wielu początkujących programistów PHP często ma problemy z funkcjami setcookie oraz header, które modyfikują informacje w nagłówku strony, co oznacza, że wywołanie ich nie powiedzie się, jeśli jakaś zawartość tekstowa została już przesłana do przeglądarki.

Spójrzmy na przykład:

Kod 1
1<?php
2 echo "Jakiś przykładowy tekst."; // przykładowy tekst, który zostanie wysłany jako pierwszy
3 header('Content-Type: text/html; charset=utf-8'); // wywołanie funkcji header i próba ustawienia kodowania strony na UTF-8
4?>


Po uruchomieniu skryptu w przeglądarce otrzymamy następujący wynik:

Jakiś przykładowy tekst.
Warning: Cannot modify header information - headers already sent by (output started at S:/SERVER/index.php:2) in S:/SERVER/index.php on line 3

Parser PHP wyświetla nam ostrzeżenie "Nie można zmodyfikować informacji w nagłówku - nagłówek został już wysłany" (wysyłanie treści strony nastąpiło w linii nr 2, a próba zmiany nagłówka w linii 3)

Rozwiązanie takiego problemu jest proste. Wystarczy funkcję header umieścić na samym początku skryptu, czyli:

Kod 2
1<?php
2 header('Content-Type: text/html; charset=utf-8');
3 echo "Jakiś przykładowy tekst.";
4?>


Teraz wszystko powinno działać poprawnie.

W życiu początkującego programisty PHP może zdarzyć się jednak sytuacja, w której taki poprawnie napisany skrypt (Kod 2) nie chce działać, a parser PHP wyświetla informację:

Warning: Cannot modify header information - headers already sent by (output started at S:/SERVER/index.php:1) in S:/SERVER/index.php on line 2
Jakiś przykładowy tekst.

co w tłumaczeniu na język polski oznacza, że nagłówek został już wysłany w linii nr 1, a próba zmiany nagłówka w linii 2 nie powiodła się.

Dlaczego tak się dzieje? Przecież w linii 1 znajduje się jedynie znacznik początku skryptu php (<?php). Przed nim nic innego nie ma.

Najczęstszym powodem takiej sytuacji jest wina edytora tekstowego, w którym zapisywaliśmy nasz skrypt index.php.

Zapis do formatu kodowania utf-8 zwykłym edytorem tekstu, jakim jest np. windowsowski notepad (notatnik), powoduje właśnie ten dziwny błąd, przez który twoje skrypty, wykorzystujące funkcje header lub setcookie, przestają prawidłowo działać.

O co dokładnie chodzi?

O znacznik kolejności bajtów, czyli BOM (ang. Byte Order Mark). Zapisując skrypt PHP w notatniku w kodowaniu UTF-8 notatnik automatycznie dodaje ten właśnie znacznik BOM na początku pliku. Zaawansowane edytory podczas wyświetlania zawartości takiego pliku pomijają ten znacznik jako informację pomocniczą do ustalania kodowania. Natomiast parser PHP nie rozpoznaje znacznika BOM i podczas przetwarzania skryptu wysyła te kilka bajtów do przeglądarki, przez co funkcje header i setcookie przestają działać (nagłówek strony musi zostać wysłany przed jakąkolwiek treścią).

Jak zapisać skrypt w kodowaniu UTF-8 i uniknąć dodania znacznika BOM?

Należy przede wszystkim zmienić edytor tekstowy na bardziej zaawansowany, który podczas zapisywania umożliwi nam wybranie, czy chcemy dodać znacznik, czy też nie. Poniższe zdjęcie przedstawia okno właściwości pliku index.php w programie Macromedia Dreamweaver 8. Zauważ możliwość odznaczenia opcji zapisu znacznika BOM - Include Unicode Signature (BOM).

Wybór formatu kodowania i opcja dodania znacznika BOM do pliku w programie Macromedia Dreamweaver 8


Jeśli zatem poważnie myślisz o pisaniu skryptów PHP to powinieneś zmienić notatnik i wybrać lepszy edytor, najlepiej z kolorowaniem składni. Na uwagę zasługuje wspomniany już Macromedia Dreamweaver - potężne narzędzie firmy Adobe. Program ten nie jest jednak darmowy. Darmowy jest natomiast Notepad ++, oferujący kolorowanie składni prawie 40 języków programowania. Spośród polskich programów polecić można Pajączka.

Tagi:  php

O blogu

Blog ten ma charakter luźnych refleksji poświęconych zagadnieniom związanym z hostingiem stron i domen, a także webmasteringiem i programowaniem (PHP, MySQL, JavaScript).

Dodaj komentarz

Imię:


Strona www:


Adres e-mail:


Komentarz:


Przepisz kod z obrazka:
pytanie antyspamowe

Tagi