Blog webdeveloperski Patryk yarpo Jar

Dziwne zachowanie funkcji header w php

Autor wiadomości Listopad 30, 2010

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 jesli $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 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.

Komentarze (0) Trackbacks (0)

Brak komentarzy.


Leave a comment

 

Brak trackbacków.