• ベストアンサー

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に関しては初心者です。 よろしくお願い申し上げます。

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

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 クッキーの書き出しは何かを出力する前に行わなければいけません。 <?php setCookie ( "email", "ABC", time()+(60*60*24*90) ) ?> <html> <body> </body> </html> どうでしょうか。

Koji001
質問者

お礼

LancerVIIさん、さっそくのご指導ありがとうございます。 教えていただいた記述でうまくいきました。 まずはお礼申し上げます。 私が先に記述したソースは、あるPHP5の入門用書籍のソースを、一部を除きそのまま転載したものです。 書籍の説明では<html>の後にCOOKIEの書き出しを行っているのですが、これは書籍が間違っているのでしょうか?それともバージョンの違いなどが原因によるものでしょうか。 とにかく勉強になりました。 ありがとうございました。

その他の回答 (2)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.3

>書籍の説明では<html>の後にCOOKIEの書き出しを行っているのですが、これは書籍が間違っているのでしょうか?それともバージョンの違いなどが原因によるものでしょうか。 書籍が間違っています。 よく分かってない人があまりテストもしないで書いたのですかね・・・?

Koji001
質問者

お礼

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

  • tecinfo
  • ベストアンサー率52% (32/61)
回答No.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サーバの再起動をかければよいかと思います。

Koji001
質問者

お礼

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

関連するQ&A