Headers already sent by
Noter ce cours :
Il vous est surement arrivé au moins une fois d'avoir l'erreur headers already sent by sur l'un de vos scripts. Ce message d'erreur signifie que vous tentez de modifier les en-têtes (headers) d'une page après avoir effectué une sortie vers le navigateur (envoi d'au moins un caractère au navigateur, même un espace).
Le code HTML ou textuel doit toujours être envoyé après la dernière modification sur les en-têtes.
Erreur courante
La plupart du temps, elle provient d'une redirection établie en plein milieu de conditions PHP dans votre code, alors que le haut du site (les premières balises HTML) a déjà été envoyé.
<?php
echo 'test';
header('location:page.php'); //le texte "test" a déjà été envoyé au navigateur, il y aura donc une erreur
?>
Correction de l'erreur
En décalant la sortie textuelle après les headers()
La première méthode, plutôt simple quand vous n'avez pas beaucoup de scripts à modifier, consiste à vérifier les appels à la fonction headers() et à placer ceux-ci (quand c'est possible) au dessus de toute sortie textuelle, même lorsque celle-ci est effectuée en dehors des balises PHP.
<?php
header("HTTP/1.0 404 Not Found"); //dernier header envoyé
echo 'test';
?>
En utilisant la bufferisation de sortie
La bufferisation de sortie en PHP est très utile. Elle permet de contrôler le moment où le buffer sera vidé puis envoyé au navigateur. Tant que le buffer n'est pas vidé, rien ne sera envoyé. Il devient alors possible de gérer l'ensemble des opérations sur les headers avant même d'envoyer le buffer, sans toucher à l'intérieur de votre code. Voyons cela :
<?php
ob_start();
header('location:page.php'); //Exemple correct
echo 'test';
ob_end_flush();
?>