みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

COOKIEの保存がうまくいかない

PHP 5.0.4でテストしているのですが、
以下のソースでうまくCOOKIEが保存できません
原因がお分かりになる方がいらっしゃいましたらご指導のほどお願いします。

<html>
<body>
<?php setcookie("email","ABC",time()+(60*60*24*90)); ?>
クッキーを保存しました。
</body>
</html>

実行すると

Warning: Cannot modify header information - headers already sent by (output started at XXX.php:3) in XXX.php on line 3
クッキーを保存しました。

と表示されてしまいます。
COOIKEにも正常に保存されていないようです

Perlでのプログラミング経験はありますが、
PHPに関しては初心者です。
よろしくお願い申し上げます。

投稿日時 - 2005-10-07 12:00:07

QNo.1697778

困ってます

質問者が選んだベストアンサー

こんにちは。

クッキーの書き出しは何かを出力する前に行わなければいけません。

<?php
setCookie ( "email", "ABC", time()+(60*60*24*90) )
?>
<html>
<body>
</body>
</html>

どうでしょうか。

投稿日時 - 2005-10-07 12:02:40

お礼

LancerVIIさん、さっそくのご指導ありがとうございます。
教えていただいた記述でうまくいきました。
まずはお礼申し上げます。

私が先に記述したソースは、あるPHP5の入門用書籍のソースを、一部を除きそのまま転載したものです。
書籍の説明では<html>の後にCOOKIEの書き出しを行っているのですが、これは書籍が間違っているのでしょうか?それともバージョンの違いなどが原因によるものでしょうか。

とにかく勉強になりました。
ありがとうございました。

投稿日時 - 2005-10-07 13:39:32

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>書籍の説明では<html>の後にCOOKIEの書き出しを行っているのですが、これは書籍が間違っているのでしょうか?それともバージョンの違いなどが原因によるものでしょうか。

書籍が間違っています。
よく分かってない人があまりテストもしないで書いたのですかね・・・?

投稿日時 - 2005-10-07 20:03:26

お礼

moon_nightさん、ありがとうございます。
書籍の冒頭部を確認したところ、
私がphp.ini 内のoutput_bufferingの設定を飛ばしていた事に原因があったようです。
確かに、php.iniの設定を変更すると、最初のソースでも正常に動きましたので、
お礼と共にご報告申し上げます。
ありがとうございました。

投稿日時 - 2005-10-07 20:37:10

ANo.2

http://php.s3.to/man/function.setcookie.html
ということだそうです。

>ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります(これはHTTPプロトコルの制約です)。
>注意: PHP4では、この関数をコールする前でも出力できるように、 スクリプトの全ての出力をサーバー内にバッファリングさせることができます。 そのためには、ob_start()やob_end_flush() を使用するか、あるいは php.ini のoutput_buffering設定を 使用します。

なので、output_bufferingが設定されていない状況では

ヘッダー情報送信

HTML送信
(Koji001の出力では
<html>
<body>


クッキー送信☆ここでエラー

となりますが、

output_bufferingが設定されている状況では

ヘッダー情報送信

HTMLをサーバ内に保存
(Koji001の出力では
<html>
<body>


クッキー送信(まだHTMLがクライアントに送られていないのでエラーにはならない)

bufferingされたHTML送信

<html>
<body>
クッキーを保存しました。
</body>
</html>


となるのかな。

参考書と同じ環境で作るなら、
php.ini のoutput_bufferingの値を変更してWebサーバの再起動をかければよいかと思います。

投稿日時 - 2005-10-07 15:32:46

お礼

なるほど。設定次第というわけですね。
私も入門書どおりの順を追ってテストしていなかったので確認してみましたが、冒頭部にphp.ini の設定について同様の記述がありました。
私の見落としでした。
PHPのインストール後、まともに動いたので嬉しくて、設定をすっ飛ばしてすぐにサンプルソースを動かしてしまったのが原因のようです。
tecinfoさん、ありがとうございました。

投稿日時 - 2005-10-07 20:34:45

あなたにオススメの質問