Dziwne zachowanie funkcji header w php

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 ona 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ń

  • Ustawianie kodowania:

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

[php]header(‚Content-type: utf-8’);[/php]

  • Ustawianie kodowania:

[php]header(‚Cache-control: no-cache’);[/php]

  • Przechodzenie do innej strony:

[php]header(‚location: http://www.inna_strona.com’);[/php]

Powoduje to przejście na inną stronę.

Ja stosowałem to w takim przypadku:

[php]if ($jakis_warunek)
{
header(‚location: strona.php?wynik=sukces’);
}
header(‚location: strona.php?wynik=porazka’);[/php]

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ąży się także wykonać i druga…

Jak to obejść?

  • Pierwszy sposób:

[php]if ($jakis_warunek)
{
header(‚location: strona.php?wynik=sukces’);
}
else
{
header(‚location: strona.php?wynik=porazka’);
}[/php]

Choć nadal nie jest idealny.

  • Poprawmy go jeszcze

[php]if ($jakis_warunek)
{
header(‚location: strona.php?wynik=sukces’);
exit();
}
else
{
header(‚location: strona.php?wynik=porazka’);
exit();
}[/php]

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 😛

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.

Warto też pamiętać, że jest to jedno z najlepszych rozwiązań patrząc pod kątem SEO.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *