Header fejl (headers already sent)

 

Jeg vil I artiklen kort fortælle om hvorfor fejlen ‘headers already sent’ dukker op.


De fleste nybegyndere indenfor PHP er sikkert stødt på fejlen ’ headers already sent by (output started at c:\web\test.php:2) in c:\web\test.php on line 3’ hvor blot stien, og de to tal er ændret. Fejlen kommer fordi dit script er struktureret forkert. Http-protokollen er opbygget således at alle headers skal komme først og derefter outputtet til browseren.

Hvilke funktioner laver en header?
Header(); session_start(); og cookie(); laver en header, de skal altså stå før alt output til browseren (echo’s, HTML etc.)

Hvad er det helt præcis fejlen fortæller?
Fejlen fortæller som sagt at der er udskrevet en header efter output til browseren, men man kan godt få lidt mere viden om præcis hvor fejlen opstår. Lad os tage eksemplet fra starten:
’ headers already sent by (output started at c:\web\test.php:2) in c:\web\test.php on line 3’
Hvis vi starter med at se på hvad der står inde i parentesen, så kan vi se hvilken side fejlen er sket på, i dette tilfælde test.php. Tallet fortæller os hvor outputtet starter, altså har vi noget output på linie 2 i scriptet. Udenfor parentesen kan stien til scriptet ses igen efterfulgt af endnu et tal. Dette tal fortæller hvor i vores script headeren befinder sig.

Følgende lille script ved vi nu fra start vil give en fejl:

<?php
echo "Vi får en fejl";
header("Location: index.php");
?>

Vi må derfor omstrukturere vores script og det vil da blive til:

<?php
header("Location: index.php");
echo "Vi får ingen fejl";
?>

Hvis man støder på ’headers already sent’-fejlen må man finde ud af hvor i scriptet fejlen lægger og efterfølgende omstrukturere det.

Jeg kan ikke omstrukturere mit script?
Da PHP folket godt ved det er et problem med disse ’headers already sent’ fejl er der lavet en funktion som kan klare opgaven for en. Funktionen er overkill og det anbefales at scriptet i stedet omstruktureres.
I starten af scriptet skrives:

<?php
ob_start();

Og i slutningen af scriptet skrives:

Ob_end_flush();
?>

Denne funktion sørger simpelt for at lægge alt dit output ind i en streng og udskrive det når ob_end_flush(); kaldes.

Skrevet af: ahv@it.dk



Skrevet af: ahv@it.dk | Dato : 2004-02-18 11:4 | Lst : 9415 gange