Błąd "Warning: Cannot add header information - headers already sent..."

Ktos

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łałem!

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 (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');
FAQ

4 komentarzy

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.

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

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

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