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?
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.
3F 3C
. Vous pouvez supprimer en toute sécurité la nomenclature EF BB BF
dès le début des fichiers.echo
, printf
, readfile
, passthru
, code avant <?
etc.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.$_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.
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.
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.
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.
C'est à cause de cette ligne:
printf ("Hi %s,</br />", $name);
Vous ne devriez pas print/echo avant d'envoyer les en-têtes.
(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;
_
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;)
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:
Unix LF (linefeed) line ending
. single blank line
. omitted
à partir de fichiers contenant only php
Croyez-moi, le respect de ces normes peut vous faire économiser de nombreuses heures de votre vie :)
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.
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