40

私はPHPを初めて使用しますが、PHP setcookie()を今すぐ練習しましたが、失敗しました。

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"];

?>

しかし、私はindex.phpを実行できませんでした、IEはこのように警告します。

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

間違いなくIE6のCookieを有効にしました。

上記の手順に何か問題がありますか?ありがとうございました。

WinXPOSおよびXAMPP1.7.3を使用。

4

5 に答える 5

56

警告は明確です。

警告:ヘッダー情報を変更できません-12行目のC:\ xampp \ htdocs \ test \ index.phpで(出力はC:\ xampp \ htdocs \ test \ index.php:9で開始されました)によって既に送信されたヘッダー

CookieはHTTP応答ヘッダーで送信されます。HTMLコンテンツはすでに開始されているため、ヘッダーに戻ってCookieを追加することはできません。

http://php.net/setcookieから:

setcookie()は、残りのHTTPヘッダーと一緒に送信されるCookieを定義します。他のヘッダーと同様に、スクリプトからの出力のにCookieを送信する必要があります(これはプロトコルの制限です)。<html>これには、タグや<head>空白を含む出力の前に、この関数を呼び出す必要があります。

setcookieHTMLが表示される前にそのステートメントを移動します。

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

 setcookie("TestCookie", $value);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
....
于 2010-04-17T10:52:35.793 に答える
24

Cookie は、HTTP ページの送信のヘッダーで送信されます。何らかの出力を与えると、これらを変更することはできなくなります。

あなたの場合の問題は、Cookie を設定しようとする前に HTML ドキュメントの一部を出力することにあります。

それを解決するにはいくつかの方法があります。そのうちの1つは、ページに何かを出力する前にCookieを設定することです

<?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>

または、出力をバッファリングして、明示的に指示するまで何も書き込まないようにすることもできます

<?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
?>

この最後のアプローチの詳細については、ob_startおよびob_end_flush関数を参照してください。

setcookieについても読むと役に立つかもしれません。

于 2010-04-17T11:01:03.187 に答える
14

それとも回すだけ

output_buffering = On

あなたのphp.ini

完全な解決策については、http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sentを参照してください

于 2011-11-05T02:51:21.860 に答える
7

Cookieを設定する前にHTMLを送信しています。Cookieは応答ヘッダーとともに送信されるため、出力を送信する前に設定する必要があります。これを行う:

<?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>
于 2010-04-17T10:52:26.773 に答える