11
votes

Erreur PHP: impossible de modifier les informations d'en-tête - les en-têtes déjà envoyés

Duplicaté possible:

Les en-têtes déjà envoyés par PHP

Donc, j'ai cette sortie sur ma page .. Ne pas comprendre pourquoi je l'ai fait apparaître. Je suis nouveau à PHP, alors peut-être que c'est quelque chose de facile à corriger

-i avoir un fichier header.php, qui inclut toutes les informations importantes, ainsi que la bannière de la page. Ce header.php est inclus sur chaque page.

-I Avez-vous de vérifier la valeur de la session pour vous assurer que l'utilisateur est autorisé à être à une certaine page. Si l'utilisateur n'est pas autorisé à y être, je les ramasse à la page de connexion

C'est ici que l'erreur se présente cependant. C'est ce que j'ai: xxx

l'indice qu'il redirige pour aussi l'en-tête. Ainsi, de ces références multiples en-tête me donnent cette erreur? Je ne vois pas d'autre moyen de le faire, et ça me conduit noix!


6 commentaires

Qu'est-ce que le fichier "header.php"?


Bannière, la configuration inclut-le pour me connecter à DB et à une jQuery. Fichier très important.


Pourquoi est-ce appelé "Header.php" alors? Pourquoi pas 'init.php' ou quelque chose?


J'ai toujours appris à inclure les choses redondantes dans le fichier d'en-tête et à inclure cela dans toutes les pages. Ce fichier d'en-tête ne contient pas la session truc, cela est inclus cependant. Cela n'a jamais été un problème auparavant.


C'est probablement le message d'erreur le plus bien documenté dans PHP. Googling Le message d'erreur donne 3 millions de résultats.


~~~~~~~~~~~ Votre codage de fichier ne doit pas être utf-8 , mais utf-8 (sans nomination) ~~~~~~~~ ~~~


5 Réponses :


33
votes

Vous ne pouvez pas utiliser en-tête () une fois que le texte a été émis sur le navigateur. Comme votre Header.php inclure probablement des sorties HTML, en-tête () ne peut pas être utilisé.

Vous pouvez résoudre cela en quelques manières:

  • Déplacez l'instruction IF au-dessus de l'en-tête incluant (cela ne fonctionnera pas, comme vous l'avez indiqué dans les commentaires que Header.php définit la session UID et d'autres éléments vitaux).
  • appel ob_start () en haut du script pour tamponner la sortie.

4 commentaires

Notez également que, à moins que vous soyez une sortie en mémoire tampon, cette erreur peut être rencontrée en ayant même une seule ligne blanche (ou un espace?) Avant la balise PHP de démarrage, car même les espaces comptent comme une sortie pour déterminer si vous pouvez envoyer des en-têtes.


D'accord, j'ai donc ajouté l'en-tête Include après la déclaration IF, et cela s'est débarrassé de l'erreur, cependant, maintenant lorsque je me connecte correctement, je suis redirigé vers l'index.php, peu importe ce que ça va? URL: Nait.jtlnet.com/~fpkj5v0r/index.php Utilisateur: programmateur Mot de passe: PROG123 -C'est maintenant mon code:


Et vous, merci pour la tête de Dathan, j'ai lu sur le virus de l'espace blanc, et cela ne semble pas être ça. Je souhaite que ce soit aussi facile!


L'en-tête est-il responsable de la logique qui authentifie l'utilisateur et attribue la valeur $ _Session ["uid"]? Si tel est le cas, votre instruction IF interroge toujours la valeur de l'UID avant qu'elle soit définie.



6
votes

Si le fichier header.php "a la bannière", il émise probablement du contenu HTML sur la page.

Vous ne pouvez pas émettre des en-têtes HTTP après avoir eu du contenu sorti.


0 commentaires

6
votes

Vous ne pouvez pas envoyer d'en-têtes après avoir envoyé d'autres contenus. Un coupable très probable est un espace supplémentaire après votre fermeture ?> tag dans votre tête.php. C'est généralement une bonne pratique pour omettre la balise de fermeture entièrement dans tous les fichiers PHP uniquement script.

Votre erreur devrait vous dire exactement quelle ligne (et quel fichier) envoie la sortie.


0 commentaires

1
votes

D'accord, il est donc réparé ...... Je ne sais pas comment, peut-être que quelqu'un peut expliquer pourquoi cela fonctionne tout à coup.

Ceci est mon code: P>

include_once ("header.php");

if ($_SESSION['uid']!='programmer') {  
    if(isset($_SESSION['uid'])) {
        echo $_SESSION['uid'];
    }                           

    header('Location: index.php');
    exit;
}


2 commentaires

Cela ne fonctionnera pas est $ _Session ['UID'] est défini. Ensuite, l'écho se produira avant l'appel à l'en-tête, ce qui est une mauvaise chose! Donc, à moins que vous allumez la mise en mémoire tampon de sortie dans Header.php, cela ne fonctionnera que lorsque $ _Session ['Kid'] n'est pas défini.


@Peterbagnall est correct, la logique est imparfaite; Tout d'abord, vous vérifiez la valeur $ _Session ['UID] lorsque vous croyez qu'il y a une possibilité qu'il pourrait ne pas être défini, puis vous vérifiez s'il est défini ... Si (ISSET ($ (_ Session («UID»))) {devrait aller dans la première instruction si la déclaration à la place. second : la raison pour laquelle il pourrait fonctionner est de savoir si $ _session ['uid'] = null; Par conséquent, aucune donnée n'est envoyée au navigateur.



1
votes

J'ai rencontré une erreur similaire (aussi apparemment hors de nulle part) en ce qui concerne une fonction de redirection qui était la suivante: xxx

apparemment, vous devez également ajouter OB_FLUSH (); pour éliminer complètement l'ancienne en-tête. La nouvelle fonction est la suivante: xxx

espère que cela aide quelqu'un d'autre à avoir ce problème!


1 commentaires

Je ne vois pas comment cela fonctionnerait à moins que OB_START () a été utilisé ... que vous n'avez pas indiqué dans votre code. Selon PHP: Flush () tente de Poussez la sortie du courant d'appui jusqu'au navigateur avec quelques mises en garde. Une fois que les données de contenu sont envoyées au navigateur, il n'ya aucun moyen de revenir en arrière et de modifier les en-têtes. PHP.net/manual/fr/function.flush.php