web-dev-qa-db-fra.com

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

Duplicate possible:
En-têtes déjà envoyés par PHP

Donc, j'ai cette sortie sur ma page .. ne comprenant pas pourquoi je l'ai faire apparaître. Je suis nouveau sur php cependant, alors c'est peut-être quelque chose de facile à réparer

-J'ai un fichier header.php, qui contient toutes les informations importantes, ainsi que la bannière de la page. Ce header.php est inclus sur chaque page.

-Je l'ai vérifier la valeur de session pour m'assurer que l'utilisateur est autorisé à être à une certaine page. Si l'utilisateur n'est pas autorisé à y être, je le renvoie à la page de connexion

C'est là que l'erreur se produit cependant. C'est ce que j'ai

include_once ("header.php");

if ($_SESSION['uid']!='programmer')
{                        
header('Location: index.php');
echo 'you cannot be here';
exit;
}   

L'index qu'il redirige a également l'en-tête. Alors, est-ce que ces multiples références d’en-tête me donnent cette erreur? Je ne vois pas d'autre moyen de faire ça, et ça me rend dingue!

11
Marcus

Vous ne pouvez pas utiliser header() une fois que le texte a été envoyé au navigateur. Étant donné que votre header.php contient normalement du HTML, vous ne pouvez pas utiliser header().

Vous pouvez résoudre ce problème de plusieurs manières:

  • Déplacez l'instruction if au-dessus de l'en-tête include (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 essentiels).
  • Appelez ob_start() en haut du script pour mettre la sortie en mémoire tampon.
32
ceejayoz

Si le fichier header.php "a la bannière", il est présumé que du contenu HTML est en sortie sur la page.

Vous ne pouvez pas émettre d'en-tête HTTP après avoir généré du contenu.

6
Quentin

Vous ne pouvez envoyer aucun en-tête après avoir envoyé un autre contenu. Un coupable très probable est un espace supplémentaire après votre balise ?> de clôture dans votre header.php. Il est généralement recommandé d’omettre la balise de fermeture dans tous les fichiers php uniquement scriptés.

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

6
keithjgrant

Bon, alors c'est réglé ...... je ne sais pas comment, quelqu'un peut peut-être expliquer pourquoi cela fonctionne tout d'un coup.

Ceci est mon code:

include_once ("header.php");

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

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

Laissez-moi répéter, tout fonctionne maintenant! PHP ... pourquoi travaillez-vous maintenant?

1
Marcus

J'ai rencontré une erreur similaire (apparemment aussi de nulle part) en ce qui concerne une fonction de redirection qui était comme suit: 

function Redirect($url) {
        flush(); // Flush the buffer
        header("Location: $url"); // Rewrite the header
        die;
    }

Apparemment, vous devez également ajouter ob_flush(); pour vider complètement l’ancien en-tête. La nouvelle fonction est:

function Redirect($url) {
        flush(); // Flush the buffer
        ob_flush();
        header("Location: $url"); // Rewrite the header
        die;
    }

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

1
citizenen