Kategorie
Uncategorized

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.

header('Content-type: utf-8');

Ustawianie kodowania:

header('Cache-control: no-cache');

Przechodzenie do innej strony:

header('location: 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 jeśli $jakiś_warunek == true to wykona się pierwsza instrukcja. Jednak zdąży 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();
}

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.

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 *