web-dev-qa-db-fra.com

Comment corriger l'erreur "En-têtes déjà envoyés" dans PHP

Lorsque j'exécute mon script, plusieurs erreurs se produisent comme ceci:

Avertissement: impossible de modifier les informations d'en-tête - les en-têtes déjà envoyés par ( la sortie démarrée à /some/file.php:12) dans /some/file.php à la ligne 23

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

Quelle pourrait en être la raison? Et comment le réparer?

833
Moses89

Ce message d'erreur est déclenché lorsque quoi que ce soit est envoyé avant l'envoi des en-têtes HTTP (avec setcookie ou header ). Les raisons courantes de générer un contenu avant les en-têtes HTTP sont les suivantes:

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

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

Pour éviter cela, omettez simplement le ?> de clôture - de toute façon, il n’est pas nécessaire.

  • marque d'ordre d'octet au début d'un fichier php. Examinez vos fichiers php avec un éditeur hexadécimal pour savoir si c'est le cas. Ils devraient commencer par les octets 3F 3C. Vous pouvez supprimer en toute sécurité la nomenclature EF BB BF dès le début des fichiers.
  • Sortie explicite, telle que les appels à echo, printf, readfile, passthru, code avant <? etc.
  • Un avertissement émis par php, si la propriété display_errors php.ini est définie. Au lieu de planter sur une erreur de programmation, php corrige l'erreur en silence et émet un avertissement. Bien que vous puissiez modifier les configurations display_errors ou error_reporting , vous devriez plutôt résoudre le problème.
    Les raisons courantes sont les accès aux éléments non définis d'un tableau (tels que $_POST['input'] sans utiliser empty ou isset à tester. si l'entrée est définie) ou en utilisant une constante non définie à la place d'un littéral de chaîne (comme dans $_POST[input], notez les guillemets manquants).

L'activation de la mise en mémoire tampon de la sortie devrait résoudre le problème. toutes les sorties après l'appel à ob_start sont mises en mémoire tampon jusqu'à ce que vous libériez la mémoire tampon, par exemple. avec ob_end_flush .

Cependant, bien que la mise en mémoire tampon de sortie évite les problèmes, vous devez vraiment déterminer pourquoi votre application génère un corps HTTP avant l'en-tête HTTP. Ce serait comme prendre un appel téléphonique et discuter de votre journée et de la météo avant de dire à l'appelant qu'il avait le mauvais numéro.

192
phihag

J'ai eu cette erreur plusieurs fois auparavant. Et je suis sûr que tous les programmeurs PHP au moins une fois ont eu cette erreur. Pour résoudre cette erreur, vous pouvez résoudre la solution d'utilisation selon votre niveau de problème:

Solution possible 1:

Vous avez peut-être laissé des espaces vides avant ou après (à la fin du fichier après?>) , c.-à-d.

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, cela devrait résoudre votre problème. Vérifiez tous les fichiers associés au fichier require.

Note: Parfois un EDITOR (IDE) comme gedit (un éditeur linux par défaut) ajoute une ligne vierge dans le fichier de sauvegarde, ce qui ne devrait pas arriver. Si vous utilisez Linux. vous pouvez utiliser l'éditeur de VI pour supprimer des espaces/lignes après?> à la fin de la page.

Si ce n'est pas votre cas, vous pouvez utiliser ob_start pour la mise en mémoire tampon de la sortie, comme ci-dessous:

Solution possible 2:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

Cela activera la mise en tampon de sortie et vos en-têtes seront créés après la mise en mémoire tampon de la page.

114
Manish Shrivastava

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

Ça va définitivement résoudre votre problème. J'ai rencontré le même problème mais j'ai résolu en écrivant l'emplacement de l'en-tête de la manière ci-dessus.

83
Ipsita Rout

Tu fais

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

avant d’installer les cookies, ce qui n’est pas autorisé. Vous ne pouvez envoyer aucune sortie avant les en-têtes, pas même une ligne vide.

40
Seth Carnegie

C'est à cause de cette ligne:

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

Vous ne devriez pas print/echo avant d'envoyer les en-têtes.

32
Sarfraz

PROBLÈMES COMMUNS:

(copié de: source )

=====================

1) il ne devrait y avoir aucune sortie (c'est-à-dire echo.. ou des codes HTML) avant la commande header(.......);.

2) supprime tout espace blanc (ou newline ) avant les balises _<?php_ et après _?>_.

3) RÈGLE D'OR! - vérifiez si ce fichier php (et aussi , si vous include autres fichiers) ont UTF8 sans codage BOM (et pas seulement UTF-8 ). C'est un problème dans beaucoup de cas (parce que UTF8 le fichier encodé a quelque chose de spécial au début du fichier php, ce que votre éditeur de texte ne montre pas) !! !!!!!!!!!

4) Après header(...);, vous devez utiliser _exit;_

5) utilisez toujours les références 301 ou 302:

_header("location: http://example.com",  true,  301 );  exit;
_

6) Activez le signalement des erreurs et recherchez l'erreur. Votre erreur peut être causée par une fonction qui ne fonctionne pas. Lorsque vous activez le rapport d'erreurs, vous devez toujours corriger les erreurs les plus importantes en premier. Par exemple, il pourrait s'agir de "Avertissement: date_default_timezone_get (): il n'est pas prudent de s'appuyer sur les paramètres de fuseau horaire du système". - puis plus bas, vous pouvez voir l'erreur "en-têtes non envoyées". Après avoir corrigé la première erreur, rechargez votre page. Si vous avez toujours des erreurs, corrigez à nouveau l'erreur la plus importante.

7) Si rien de ce qui précède ne vous aide, utilisez la redirection JAVSCRIPT (méthode fortement déconseillée), peut être la dernière chance dans les cas personnalisés ... :

_echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
_
30
Jorn

Un conseil simple: un simple espace (ou un caractère spécial invisible) dans votre script, juste avant la toute première balise <?php, peut provoquer cela! Surtout lorsque vous travaillez en équipe et que quelqu'un utilise un "faible" IDE ou a foiré dans les fichiers avec des éditeurs de texte étranges.

J'ai vu ces choses;)

26
Sliq

Une autre mauvaise pratique peut invoquer ce problème qui n’est pas encore précisé.

Voir l'extrait de code:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

Les choses vont bien, non?

Et si "a_important_file.php" est ceci:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

Cela ne fonctionnera pas? Pourquoi? Parce qu'une nouvelle ligne est déjà générée.

Maintenant, bien que ce ne soit pas un scénario courant, que se passe-t-il si vous utilisez un framework MVC qui charge un grand nombre de fichiers avant de transférer des éléments à votre contrôleur? Ce n'est pas un scénario rare. Soyez prêt pour cela.

De PSR-2 2.2:


  • Tous les fichiers PHP DOIVENT utiliser la Unix LF (linefeed) line ending.
  • Tous les fichiers PHP DOIVENT se terminer par un single blank line.
  • La balise de fermeture?> DOIT être omitted à partir de fichiers contenant only php

Croyez-moi, le respect de ces normes peut vous faire économiser de nombreuses heures de votre vie :)

21

Parfois, lorsque le processus de développement comporte à la fois des postes de travail WIN et des systèmes LINUX (hébergement) et que, dans le code, aucune sortie n’est affichée avant la ligne correspondante, il peut s’agir du formatage du fichier et de l’absence de nix LF (saut de ligne) fin de ligne.

Pour résoudre rapidement ce problème, nous avons l'habitude de renommer le fichier. Sur le système LINUX, créez un nouveau fichier à la place du fichier renommé, puis copiez le contenu dans celui-ci. Plusieurs fois, cela résout le problème car certains fichiers créés dans WIN ont été déplacés une fois vers l’hébergement, ce qui est à l’origine de ce problème.

Ce correctif est un correctif facile pour les sites que nous gérons par FTP et peut parfois faire gagner un peu de temps à nos nouveaux membres d’équipe.

15
Lupin

Généralement, cette erreur survient lorsque nous envoyons un en-tête après un écho ou une impression. Si cette erreur se produit sur une page spécifique, assurez-vous que cette page ne renvoie rien avant d'appeler start_session().

Exemple d'erreur imprévisible:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

Un autre exemple:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Conclusion: N'émettez aucun caractère avant d'appeler session_start() ou header(), pas même un espace ou une nouvelle ligne

2
Biswadeep Sarkar