webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> porady >> php + mysql

Zdradliwy header

autor: Patryk 'yarpo' Jar, ostatnia modyfikacja: 2008-03-16

szukaj: header header wysyłanie nagłówka wysyłanie nagłówka location location content-type content-type cache cache exit exit die die

PHP w swojej prostocie i funkcjonalności pozwala na wiele ciekawych rzeczy, bez żadnego wysiłku (niech ktoś spróbuje choćby sprawdzić w ANSI C czy istnieje jakiś plik lub w Assemblerze przejrzeć zawartość katalogu, to naprawdę dostrzeże jak prosty jest PHP).

Ostatnio właśnie zacząłem się bawić jedną z takich super-funkcji PHP.

header();

Daje on niezwykle wiele możliwości. A co robi? Wysyła surowy nagłówek PHP. Pamiętaj, jednak, aby przed wywołaniem funkcji header nie wysłać do przeglądarki żadnego tekstu!

Kilka ciekawszych zastosowań:

Bardzo przydatne gdy wysyłasz plik, który nie ma nagłówka HTML. Mi się przydało, gdy generowałem plik z danymi JSON.

header('Content-type: utf-8');
header('Cache-control: no-cache');
header('location: strona.php');
// choć powinno być (wg manuala) http://www.inna_strona.com

Powoduje to przejście na inną stronę. Ja stosowałem to w takim przypadku:

if ($jakis_warunek)
	header('location: strona.php?wynik=sukces');
header('location: strona.php?wynik=porazka');

Wg praw logiki, jeśli spełniony jest warunek wykonany zastanie pierwszy „skok”. Jeśli nie, to pierwszy zostanie opuszczony i wykona się drugi „skok”. No właśnie... Nie koniecznie :).

Funkcja header nie kończy działania skryptu. I w powyższym przypadku bardzo prawdopodobne, że owszem jesli $jakiś_warunek == true to wykona się pierwsza instrukcja. Jednak zdąrzy się także wykonać i druga...

Jak to obejść? Pierwszy sposób:

if ($jakis_warunek)
	header('location: strona.php?wynik=sukces');
else
	header('location: strona.php?wynik=porazka');

Choć nadal nie jest idealny. Poprawmy go jeszcze

if ($jakis_warunek) {
	header('location: strona.php?wynik=sukces');
	exit();
} else {
	header('location: strona.php?wynik=porazka');
	exit();
}

Jak widzisz, nie stosuję klamer wszędzie tam gdzie jest to możliwe [a możliwe jest tam, gdzie po wyrażniu warunkowym występuje tylko jedna linijka - „do pierwszego średnika”].

Użyłem tu funkcji exit() która bezwarunkowo kończy skrypt. Polecam stosowanie takiego siłowego rozwiązania przy stosowaniu header()... Ja straciłem kilka godzin szukając błędów, w całkiem już sporym systemie :P

Istnieje także inna funkcja, o podobnym działaniu jak exit(). Jest to funkcja die(). Odsyłam do manuala po więcej szczegółów. Obie są nieźle i zrozumiale opisane :). Warto też poczytać o header(), bo ma więcej możliwości niż tu opisałem.

Patryk 'yarpo' Jar

Osoby czytające tę publikację przeglądały również:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org