En PHP, la fonction d'en-tête () est utilisée pour envoyer des informations d'en-tête HTTP brutes. Il est généralement utilisé pour la redirection, la définition du type de contenu de la page, le contrôle du cache et d'autres opérations. Cependant, lorsque vous utilisez la fonction en-tête () , vous rencontrez souvent un message d'erreur: "En-têtes déjà envoyées". Cet article expliquera en détail les causes et les solutions à ce problème.
Lorsque vous utilisez la fonction d'en-tête () dans un script PHP, il doit envoyer des informations d'en-tête avant toute sortie (telles que le contenu HTML, les espaces, les pauses de ligne, etc.). Cette erreur en résultera si le script PHP a envoyé le contenu (c'est-à-dire que des données sont sorties avant d'appeler la fonction d'en-tête () ). Un message d'erreur invite généralement "les en-têtes déjà envoyés", ce qui signifie que le message d'en-tête a été envoyé au navigateur et ne peut pas être envoyé.
Les causes courantes des erreurs "en-têtes déjà envoyées" comprennent:
HTML ou les espaces sont sortis à l'avance :
Cette erreur sera déclenchée si un contenu HTML, des espaces ou des nouvelles lignes a été sorti dans le script PHP avant d'appeler la fonction en-tête () . Surtout les espaces ou les nouvelles lignes en dehors des balises PHP ( <? PHP?> ) Sont facilement négligés.
Problèmes d'encodage de fichiers :
Si le format de codage du fichier PHP est UTF-8 et que le fichier contient une nomenclature (marque d'octet), la nomenclature sera considérée comme une sortie même si le contenu de sortie n'est pas affiché en haut du fichier, ce qui entraîne les informations d'en-tête envoyées à l'avance.
Problème de tampon de sortie :
Dans certains cas, les paramètres de tampon de sortie de PHP peuvent être inappropriés, ce qui entraîne une sortie de contenu à l'avance. Par exemple, si vous ne démarrez pas le tampon de sortie avec ob_start () , PHP peut envoyer une partie de la sortie avant d'appeler En-tête () .
Assurez-vous qu'il n'y a pas de sortie avant l'appel d'en-tête () :
Vous devez vérifier le code avant l'appel d'en-tête () pour vous assurer qu'il n'y a pas de sortie HTML ni de caractères blancs. Même un espace ou une nouvelle ligne lance cette erreur. La meilleure chose à faire est de placer la fonction d'en-tête () en haut du script PHP pour s'assurer qu'il n'y a pas de sortie.
Exemple d'erreur :
<html>
<body>
<?php
header("Location: https://m66.net/somepage.php"); // Cette interdiction rapportera une erreur
?>
</body>
</html>
Exemple correct :
<?php
header("Location: https://m66.net/somepage.php"); // Utiliser correctement
exit();
?>
<html>
<body>
</body>
</html>
Vérifiez le codage du fichier et supprimez la nomenclature :
Si votre fichier est encodé UTF-8 et contient BOM, vous pouvez réactiver le fichier via un éditeur de texte (tel que le texte sublime, Notepad ++) et sélectionner le format BOM sans lui. De plus, lors de la lecture de fichiers à l'aide de file_get_contents () ou fopen () , vous devez également vous assurer qu'il n'y a pas de nomenclature incluse.
Activer le tampon de sortie :
Vous pouvez activer le tampon de sortie au début du script PHP et démarrer le tampon via ob_start () afin que même s'il y a de sortie, il peut être temporairement stocké dans le tampon jusqu'à ce que vous appeliez manuellement ob_end_flush () ou le script se termine.
Exemple :
<?php
ob_start(); // Démarrer la tampon de sortie
header("Location: https://m66.net/somepage.php"); // Cette ligne ne rapportera aucune erreur
ob_end_flush(); // Contenu du tampon de sortie
exit();
?>
Vérifiez les fichiers importés :
Si vous utilisez Inclure ou avez besoin pour introduire d'autres fichiers PHP, vous devez vous assurer que ces fichiers n'appellent pas la fonction en-tête () avant de sortir quoi que ce soit. Vous pouvez placer l'appel d'en-tête () avant tous les autres code PHP pour vous assurer qu'il n'est pas interféré par le contenu de sortie.
Outils de débogage :
L'utilisation de la fonction Headers_Sent () peut vous aider à diagnostiquer les problèmes. Cette fonction vous indiquera où et quand le message d'en-tête a été envoyé. Vous pouvez l'utiliser pour savoir où se trouve l'erreur.
Exemple :