web-dev-qa-db-ja.com

setcookie、ヘッダー情報を変更できません-ヘッダーは既に送信されています

私は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

私はIE 6 Cookieを有効にしました。

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

WinXP OSおよびXAMPP 1.7.3が使用されました。

35
Nano HE

警告は明確です。

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

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

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

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

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

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

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

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 について読むことも役立つかもしれません。

またはただ回す

output_buffering = On

あなたのphp.ini

完全なソリューションについては http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent を参照してください

9
digitalpbk

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>
7
Jack Sleight

注目に値するものは次のとおりです...

私は同じ問題を抱えていましたが、終了後にスペースがあることがわかりました?>出力が生成される前に正しい場所に含めていたファイルの最後。それは私を怒らせた!

3
Steve