Programowanie w języku PHP » FAQ

Pojawia mi się błąd Cannot add header.... Co zrobić

  • 2007-07-04 14:18
  • 4 komentarze
  • 1869 odsłon
  • Oceń ten tekst jako pierwszy
Błąd (a właściwie ostrzeżenie)
Warning: Cannot add header information - headers already sent by ...
pojawia się przy używaniu sesji, ciastek czy funkcji header. Spowodowany jest tym, że sesje, ciasteczka oraz funkcja header operują na nagłówkach protokołu HTTP, które muszą być wysłane przez serwer przed danymi, a że PHP jest wykonywany liniowo (wraz z wysyłaniem danych) to błąd pojawia się, gdy próbujemy wysłać nagłówek już po wysłaniu jakichkolwiek danych.

Rozwiązania:
  1. Wysyłanie danych należy dać na samym początku skryptu (przed wysłaniem jakichkolwiek danych funkcją echo, print itp.),
  2. Spokojnie można używać normalnie tych funkcji, jeżeli używamy systemu szablonów w rodzaju Smarty, które wysyłają dane do przeglądarki dopiero na koniec działania skryptu (o ile został prawidłowo napisany),
  3. Na sam początek strony (przed jakimikolwiek danymi!) trzeba wywołać funkcję
    ob_start();
    a na koniec
    ob_end_flush();
    . Teoretycznie powoduje to niewielkie opóźnienie w działaniu skryptu, ale w większości sytuacji jest ono niemierzalne. Działa to na zasadzie buforowania zawartości, która nie jest na bieżąco wyświetlana, a dopiero po zakończeniu działania skryptu.

Ale ja nic nie wysyłam!


Może zdarzyć się sytuacja, gdy programista twierdzi, że on nie wysyła niczego, a i tak błąd się pojawia. Należy wtedy zwrócić szczególną uwagę na puste linie bądź inne białe znaki przed znacznikiem rozpoczynającym (
<?php
) oraz po kończącym skrypt (jeżeli ten jest włączany do innego) oraz - jeżeli używa się kodowania UTF-8 - na tak zwany BOM</wiki> (Byte Order Mark).

Byte Order Mark to trzy bajty na początku pliku zakodowanego w standardzie UTF-8, które właśnie identyfikują to kodowanie - jeżeli takie znajdą się przed znacznikiem rozpoczynającym PHP to oczywiście zostaną wysłane i nie będzie można wysłać żadnych dodatkowych nagłówków. Niektóre aplikacje (np. Notatnik albo Microsoft Expression Web) umieszczają w tworzonych przez siebie plikach znacznik BOM - należy zwrócić na to uwagę.

Przykłady


Przykładowa sytuacja w której interpreter PHP zwróci błąd:

<?php
    echo '<?xml version="1.0"?>';
    echo '<foo>Error!</foo>';
    header('404 Not Found');
?>

4 komentarze

bordeux 2007-12-25 14:17

Gdy znów wysyłacie nagłówki  to dajcie przed tym ob_clean(); . Unikniecie tego, ze zamiast np wyświetlenia się obrazka to wyświetli sie komunikat od przeglądarki ze plik jest uszkodzony.

modem77 2006-05-26 17:21

jezeli chodzi o ciasteczka ja to rozwiazalem tak: jezeli ciasteczko istnieje to go nie dodaje :) (else wiadomo)

|PtaH| 2003-12-14 21:51

egh,z tego co mi wiadomo to nalezy np. session_register czy to od cookie wrzucic przed wyslaniem jakich kolwiek nagłówków

mazy 2003-03-24 15:57

hehe albo nie używać sesii i ciastek:)))))