• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPクッキーの使い方でトラブル)

【解決方法教えてください】PHPクッキーの使い方でトラブル

このQ&Aのポイント
  • 友人からもらったコンピューターにWindowsXPを再インストールして、XamppというパッケージでApache、MySQL,PHPをインストールし、前に使っていたコンピューターからPHPプログラムファイルをコピーして走らせましたが、次のようなメッセージが出てきます。
  • 94行というのは setcookie() を使って、各顧客別に作成したテキストファイルの名前を設定するためのものです。PHPで設定したクッキーの値(つまりファイ名)をJacaScriptで取得し、その名前のファイルをAJAXを使って読み出すという仕組みにしてあります。
  • PHPのマニュアルをあったって、クッキーや出力バッファー関数なども調べてみましたが、どうすれば良いのかわかりません。なお、この質問は「Ajaxな掲示板」というところにも出してありますが、まだ誰からもアドバイスをいただいておりません。

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

  • ベストアンサー
noname#94983
noname#94983
回答No.1

クッキーを設定する前に、ヘッダーが送信されているのだろう。クッキー情報はヘッダーに追加して送る。ヘッダーは、最初に一度しか送られない。このため、動かないのだろうと思う。 では、なぜ他のマシンでは動いたのか? それは、おそらくPHPの設定で、ヘッダーをキャッシュしておき、すべての処理が終わってから送信するように設定されていたためだろう。少し前のPHPでは、デフォルトでそう設定されていたかも知れない。 php.iniの中で、output_buffering = Off という行を探し、これをoutput_buffering = On に変更してサーバーをリスタートすれば、出力がキャッシュされ、処理後にまとめて送信されるようになるため、問題は回避できると思う。ただ、基本的にはどのサーバーでも正常に動くよう、プログラムの途中でヘッダーを送らないようプログラム自体を修正するのが正しい解決法とは思うが。

papashiro
質問者

お礼

logger_man さん、貴重なアドバイスをありがとうございました。 php.ini ファイルを訂正して当面の問題は解決しました。 ただ、あなたがおっしゃる「プログラムの途中でヘッダーを送らないようにプログラム自体を修正する」という意味がよくわかりません。 私のプログラムでもsetcookie()関数は、その他の前処理の関数群と一緒に <head> </head> タグの中に入れてありますが、これではだめなのでしょうか?またご回答をいただけるとうれしく思います。 papaShiro

その他の回答 (1)

noname#94983
noname#94983
回答No.2

>私のプログラムでもsetcookie()関数は、その他の前処理の関数群と一緒に <head> </head> タグの中に入れてありますが、これではだめなのでしょうか? たとえば、 <html> <?php …… echo $hoge; // 何かを表示 ?> </html> こんな形でコードが書いてあった場合、<?php ?>部分を実行する前に、<html>タグが既にクライアントに書き出されている。このため、この<html>の手前で、既にヘッダーが送信されている。そこで、 <?PHP …… ?> <html> <?=$hoge ?> </html> たとえばこのように必要な処理を最初に行っておき、HTML内では単に、変数などに用意しておいた値を書き出すだけにしておく。こうすれば、<html>タグの前にある<?php ?>部分を実行している段階では、まだヘッダーは送られない。 たとえばだが、そのような感じで、header関数やクッキー、セッションなどヘッダーに関係する処理はすべて最初の段階で行っておくようにすることで、ヘッダーの二重送信を防げる。基本は、そういう感じだろうと思う。

papashiro
質問者

お礼

<?php ... ?> を <HTML> の開始タグの前においてやったら、たとえ php.ini の中で output_buffering = Off に設定したままでもクッキーはちゃんと送られることが確認できました。 確かにこうすることで、今開発中のサイトを公開したときも利用するサーバーの設定を気にせずに済むので、これが正当な解決方法ですね。 logger_man さんのアドバイスに心から感謝いたします。 papashiro

関連するQ&A