831 votes

Comment réparer "Headers already sent" erreur dans le PHP

Lors de l'exécution de mon script, j'obtiens plusieurs erreurs de ce type:

Warning: Cannot modify header information - headers already sent by (output started at /certains/fichier.php:12) /some/file.php sur la ligne 23

Les lignes mentionnées dans les messages d'erreur contiennent header() et setcookie() des appels.

Quelle pourrait être la raison pour cela? Et comment le résoudre?

203voto

phihag Points 89765

Ce message d'erreur est déclenchée lorsque quelque chose est envoyé avant de vous envoyer les en-têtes HTTP (avec setcookie ou header). Les raisons courantes pour sortir quelque chose avant que les en-têtes HTTP sont:

  • Accidentelle des espaces, souvent au début ou à la fin des fichiers, comme ceci:

     <?php
    // Note the space before "<?php"
    ?>
    

Pour éviter cela, il suffit de laisser la clôture ?> - il n'est pas nécessaire de toute façon.

  • D'ordre d'octet au début d'un fichier php. Examiner vos fichiers php avec un éditeur hexadécimal pour savoir si c'est le cas. Ils devraient commencer avec les octets 3F 3C. Vous pouvez supprimer en toute sécurité la NOMENCLATURE EF BB BF depuis le début de fichiers.
  • Explicite de sortie, tels que les appels à echo, printf, readfile, passthru, code avant de l' <? etc.
  • Un avertissement envoyés par php, si l' display_errors php.ini propriété est définie. Au lieu de s'écraser sur un programmeur erreur, php silencieusement corrige l'erreur et émet un avertissement. Alors que vous pouvez modifier l' display_errors ou error_reporting configurations, vous devez résoudre le problème.
    Les causes courantes sont accède à undefined éléments d'un tableau (comme $_POST['input'] sans l'aide d' empty ou isset pour tester si l'entrée est réglée), ou à l'aide d'une constante indéfinie au lieu d'une chaîne littérale (en $_POST[input], note le manque de guillemets).

Tournant sur le tampon de sortie devrait le problème; toutes les sorties après l'appel à ob_start est mis en mémoire tampon jusqu'à ce que vous relâchez le tampon, par exemple, avec ob_end_flush.

Cependant, tandis que le tampon de sortie évite les problèmes, vous devriez vraiment savoir pourquoi votre application génère un corps HTTP avant de l'en-tête HTTP. Ce serait comme prendre un coup de téléphone et discuter de votre journée et la météo avant d'en parler à l'appelant qu'il a le mauvais numéro.

125voto

Manish Shrivastava Points 4380

J'ai eu cette erreur plusieurs fois avant.et je suis sûr que tout programmeur PHP au-moins une fois eu cette erreur. Pour résoudre cette erreur, vous pouvez résoudre l'utilisation de la solution à votre problème de niveau:

Solution Possible 1:

Vous avez peut-être laissé des espaces avant ou après (à la fin du fichier après ?> ) c'est à dire

THERE SHOULD BE NO BLANK SPACES HERE
<?php  

   echo "your code here";

?>
DO CHECK FOR BLANK SPACES HERE AS WELL; THIS LINE (blank line) SHOULD NOT EXIST.

La plupart du temps, ce qui devrait résoudre votre problème.Faire vérifier tous les fichiers associés avec le fichier require.

Remarque: Parfois, ÉDITEUR(IDE) comme gedit(par défaut linux de l'éditeur) ajouter une ligne vide sur enregistrer le fichier de sauvegarde.Cela ne devrait pas arriver. Si vous utilisez linux. vous pouvez utiliser l'éditeur VI pour supprimer l'espace/lignes après ?> à la fin de la page.

Si ce n'est pas votre cas, alors,vous pouvez utiliser ob_start pour le tampon de sortie, comme ci-dessous:

Solution 2:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

89voto

Ipsita Rout Points 628

Au lieu de la ligne ci-dessous

//header("Location:".ADMIN_URL."/index.php");

écrire

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

ou

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

Il va certainement résoudre votre problème. J'ai connu le même problème mais je l'ai résolu grâce à l'écriture de l'en-tête de l'emplacement de la façon décrite ci-dessus.

41voto

Seth Carnegie Points 45196

Vous n'

printf ("Hi %s,</br />", $name);

avant de paramétrer les cookies, qui n'est pas autorisé. Vous ne pouvez pas envoyer de sortie avant les en-têtes, pas même une ligne vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X