Headers already sent

From Occhio FAQ

Jump to: navigation, search
Deze informatie is alleen voor webeheerders met een behoorlijke technische kennis

Een veel geziene fout/error tijdens het php-programmeren is de foutmelding "Headers already sent". Het probleem is dan dat je een header probeert toe te voegen terwijl de headers reeds verstuurd zijn.

Sommige headers zal je expliciet instellen, bv de Content-type, encoding etc en andere headers worden automatisch door de server meegestuurd.

In principe hoort het zo te zijn dat je eerst de headers verstuurd en daarna de content. Als je dit per ongeluk verkeerd om doet, krijg je de foutmelding.

<?php
echo "Hello world"; // dit is content die direct naar het scherm geschreven wordt
setcookie("iWasHere", "Yes", 60*60, "/"); // dit is een header.. dus in deze volgorde: foutmelding
?>

Oplossing

Er zijn twee oplossingen:

Oplossing 1: goede volgorde aanhouden

Zorgen dat er nooit content wordt getoond voordat er iets geheaderd wordt. Dit kan je doen door alle output in een variabele op te vangen en pas aan het einde van de pagina te echo'en

<?php
$html =  "Hello world"; // dit is content, maar wordt niet geechood
$html .=  "en nog een Hello world"; // dit is content, maar wordt niet geechood
setcookie("iWasHere", "Yes", 60*60, "/"); // dit is een header.. 
echo $html; // pas hier wordt de content naar het scherm geschreven
?>

Zoiets kan ook met Output buffering.

<?php
ob_start(); // buffert alle output
echo "Hello world";
setcookie("iWasHere", "Yes", 60*60, "/"); // dit is een header.. , maar vorige echo is niet naar scherm geschreven, dus dat gaat goed
$html = ob_get_contents(); // stop gebufferde in variable
ob_end_clean(); // leeg buffer
echo $html;// pas hier wordt de content naar het scherm geschreven
?>

Oplossing 2: output_buffering aan

Je kan ook output_buffering aan zetten door in de .htaccess van je hostingpakket de volgende regel op te nemen:

php_value output_buffering 4096

We raden dit alleen te doen als er niet ontwikkeld wordt in het hostingpakket. output_buffering staat standaard uit op onze webservers.