tisdag 9 februari 2010

Warning: Cannot modify header information - headers already sent by (output started at...)

Artikeln är flyttad till det nya dbwebb-forumet: http://dbwebb.se/forum/viewtopic.php?f=12&t=3557

---

Ett vanligt felmeddelande, och ibland svårt att finna orsaken till, är följande:
Warning: Cannot modify header information - headers already sent by (output started at /home/saxon/teachers/tek/mos/www/test/1.php:2) in /home/saxon/teachers/tek/mos/www/test/2.php on line 4
Eller som i bilden nedan.


Felmeddelandet innebär att output (till webbläsaren)  har startat och därmed har HTTP headern skickats. Troligen försöker du göra någon funktion som påverkar header-informationen, tex genom att anropa funktionen header() eller påverka sessionen. Därav felmeddelandet, på ren svenska:
"Jag har redan skickat header-informationen, du kan inte påverka den."
Felmeddelandet kan innebära att man skrivit ut data till webbläsaren, innan man anropat funktionen header(). Den direkta orsaken är ofta tomma rader/mellanslag/tab före starttag (<?php) eller efter slut-tag (?>). 

Problemet kan också inträffa när man börjar använda sessioner. Även där är ofta den direkta orsaken att man skrivit ut något (echo) eller har tomma tecken/rader (mellanslag, tab, ny rad) innan man startat sessionen (session_start()). En bra förklaring på detta finns på följande inlägg:
http://stackoverflow.com/questions/2173826/warning-can-not-modify-header-information-header-already-sent-by-output-starte
Felet kan också bero på att man inkluderar filer som är sparade som UTF BOM. Spara dem som UTF8 no-BOM. UTF8 BOM innehåller ett par tecken i början av filen. Det gör inte UTF8 no-BOM
http://en.wikipedia.org/wiki/Byte_order_mark
Se till att ha filen source.php i katalogen så brukar det vara enklare att felsöka och leta. Senaste versionen av source.php finns på github:
http://github.com/mosbth/Utility eller http://dbwebb.se/source
Ett vanligt sätt att undvika dessa problem är att utelämna php-sluttag. Vi rekommenderar att du utelämnar sluttaggen när du kan. Läs om detta på Zends guidelines för kodning (Zend, ett PHP-ramverk).
http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html
Ett annat sätt att påverka dessa felmeddelanden är att använda output buffering. Då lagras all output och skickas i en klump när den är klar. Läs om output buffering i följande artikel.
http://db-o-webb.blogspot.com/2011/02/satt-pa-output-buffering-i-php.html

Inga kommentarer:

Skicka en kommentar