For alt for mange og alt for tit sker det at folk støder på fejlmeddelelsen headers already sent by. Årsagen skyldes simpelt, at der allerede er sendt output afsted før de prøver at sende en http-header med f.eks. setcookie() eller header(). Reglerne er meget simple der må ikke være noget output (echo og print statement eller tekst udenfor ) før der sendes en http-header - end ikke et whitespace. Funktionerne header() og setcookie sender en http-header. For at få brugen af header() og setcookie() til at være optimal kan man gøre enten tage brug af output buffering (holde outputtet tilbage) eller optimere sit kode design - se hvordan og vælg en af siderne i menuen til højre.
Output buffering
Når man bruger output buffering gemmer man bare indholdet i en buffer og venter med at sende det afsted til alle http-headers er sendt afsted. Nedenstående er et simpelt eksempel - prøv selv at lege med det!
<?php
ob_start();//Der oprettes en buffer
echo "test";
print "hoho";//Dine echo og print statement
//Her kan du stadig sende http-headere afsted!
setcookie('cookie','1');//Sætter en cookie
ob_flush();//Tømmer bufferen
//Der kan ikke sættes flere http-headere nu!
?>
Kode design optimering
Princippet er simpelt - design din kode så du undgår output før header() eller setcookie() kald. Igen et lille eksempel, prøv at leg lidt med det. Princippet er siden der skal udskrives til klienten gemmes i en variabel og først udskrives når alle headere er sendt!
<?php
/*
Kaldes med filnavn.php?id=XX
XX kan være (header eller forside... eller et eller andet andet!)
*/
switch($_GET['id'])
{
case "header":
header('location: ');//Sender en header - stadig muligt her...
break;
case "forside":
$output = forside();
break;
default:
$output = unknown();
break;
}
//Her kan du sende en header!
echo $output;
//Nu kan der ikke sendes flere headere.... Men siden er også sendt afsted til klienten
//Funktioner som bruges i scriptet
//Genererer en forside
function forside()
{
setcookie('forside','1');//Sætter en cookie som fortæller at forsiden er blevet besøgt!
//Du kan stadig sende en header....
return site("forside", "Dette er forsiden");
}
//Skabelonen til siderne.
function site($title, $content)
{
return '<html>
<head>
<title>'.$title.'</title>
</head>
<body>
'.$content.'
</body>
</html>';
}
//En ukendt side!
function unknown()
{
//Og her kan du også sende en header....
return site('Ukendt', 'Siden eksisterer ikke!');
}
?>