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(); 
?>
Vous avez aimé cet article intitulé Headers already sent by ? Partagez-le !
Vulgarisation-informatique.com
Cours en informatique & tutoriels