web-dev-qa-db-fra.com

setcookie, Impossible de modifier les informations d'en-tête - en-têtes déjà envoyés

Je suis nouveau sur PHP, j'ai pratiqué PHP setcookie () tout à l'heure et j'ai échoué.

http: // localhost/test / index.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>

    </head>
    <body>
     <?php
     $value = 'something from somewhere';

     setcookie("TestCookie", $value);
     ?>
    </body>
</html>

http: // localhost/test / view.php

<?php
 // I plan to view the cookie value via view.php
 echo $_COOKIE["TestCookie"];

?>

Mais je n'ai pas réussi à exécuter index.php, IE avertissement comme celui-ci.

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\test\index.php:9) in C:\xampp\htdocs\test\index.php on line 12

J'ai activé mon cookie IE 6 sans aucun doute.

Y a-t-il un problème avec ma procédure ci-dessus? Merci.

OS WinXP et XAMPP 1.7.3 utilisés.

35
Nano HE

L'avertissement est clair.

Avertissement: impossible de modifier les informations d'en-tête - en-têtes déjà envoyés par (sortie démarrée à C:\xampp\htdocs\test\index.php: 9) dans C:\xampp\htdocs\test\index.php à la ligne 12

Les cookies sont envoyés dans l'en-tête de réponse HTTP. Puisque le contenu HTML a déjà commencé, vous ne pouvez pas revenir à l'en-tête et ajouter le cookie.

De http://php.net/setcookie :

setcookie () définit un cookie à envoyer avec le reste des en-têtes HTTP. Comme les autres en-têtes, les cookies doivent être envoyés avant toute sortie de votre script (il s'agit d'une restriction de protocole). Cela nécessite que vous passiez des appels à cette fonction avant toute sortie, y compris <html> et <head> balises ainsi que tout espace blanc.

Déplacez cette instruction setcookie avant que le code HTML n'apparaisse:

<?php
 $value = 'something from somewhere';

 setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
....
50
kennytm

Les cookies sont envoyés dans les en-têtes de la transmission de la page HTTP. Une fois que vous avez donné une sortie, vous ne pouvez plus les modifier.

Le problème dans votre cas réside dans la sortie d'une partie du document HTML avant d'essayer de définir le cookie.

Il existe plusieurs façons de le résoudre; dont l'un définit le cookie avant de publier quoi que ce soit sur la page comme ça

<?php
    $value = 'something from somewhere';
    setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>

    </head>
    <body>

    </body>
</html>

Alternativement, vous pouvez mettre en mémoire tampon votre sortie de sorte que rien ne soit écrit jusqu'à ce que vous le disiez explicitement à

<?php
    ob_start(); // Initiate the output buffer
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>

    </head>
    <body>
     <?php
         $value = 'something from somewhere';
         setcookie("TestCookie", $value);
     ?>
    </body>
</html>
<?php
    ob_end_flush(); // Flush the output from the buffer
?>

Pour plus d'informations sur cette dernière approche, jetez un œil aux fonctions ob_start et ob_end_flush .

Il pourrait également être utile de lire setcookie .

Ou tout simplement tourner

output_buffering = On

dans votre php.ini

Reportez-vous http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent pour une solution complète

9
digitalpbk

Vous envoyez du code HTML avant de définir le cookie. Le cookie doit être défini avant d'envoyer une sortie, car il est envoyé avec les en-têtes de réponse. Faites ceci:

<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>

    </head>
    <body>

    </body>
</html>
7
Jack Sleight

Voici quelque chose à surveiller ...

J'ai eu le même problème et j'ai découvert qu'il y avait un ESPACE après la fermeture ?> à la fin d'un fichier que j'incluais au bon endroit avant de générer une sortie. Ça me rendait fou!

3
Steve