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

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

PHPクッキーの使い方でトラブル

友人からもらったコンピューターにWindowsXPを再インストールして、XamppというパッケージでApache、MySQL,PHPをインストールし、前に使っていたコンピューターからPHPプログラムファイルをコピーして走らせましたが、次のようなメッセージが出てきて、思いどうりに働いてくれません。 Warning: Cannot modify header information- header already sent by (output stated at C:プログラム名) in 再度プログラム名 on line 94 この94行というのは setcookie() を使って、各顧客別に作成したテキストファイルの名前を設定するためのものです。PHPで設定したクッキーの値(つまりファイ名)をJacaScriptで取得し、その名前のファイルをAJAXを使って読み出すという仕組みにしてあります。 以前のコンピュータでは今でもちゃんと走りますが、同じプログラムをコピーしてきただけなのに、なぜ新しいマシンで走らないのかわかりません。これから先まだまだ作らなくてはならないルーチンがたくさんあるので、なるべく早くこの問題を解決して先に進みたいと思っています。 PHPのマニュアルをあったって、クッキーや出力バッファー関数なども調べてみましたが、どうすれば良いのかわかりません。 どなたかお知恵を貸していただければありがたく存じます。 なお、この質問は「Ajaxな掲示板」というところにも出してありますが、まだ誰からもアドバイスをいただいておりません。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
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

  • PHPでクッキーをセットできない

    PHPとJavaScriptを使っゲームを作っていますが、PHPでクッキーをセットしようとすると以下のようなメッセージが出てきて、データがセットされません。 「ヘッダー情報を修正できない」というメッセージはどんな意味なのでしょうか? setcookie()関数をどこで使えばうまくいくのでしょうか? 詳しい方がいらっしゃいましたら、よろしくお願いいたします。 使った関数=setcookie("gameOverTime", $cookieData, time() + 60*60); メッセージ= Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\QAgameOver.php:1) in C:\xampp\htdocs\QAgameOver.php on line 10

    • ベストアンサー
    • PHP
  • クッキーの削除がうまくいきません

    <?php setcookie("a","おいしいクッキー"); $a=$_COOKIE["a"]; print "$a"; print "<br />"; setcookie("a","",time()-60); $b=$_COOKIE["a"]; print "$b"; ?> と書いて、クッキーの設定は出来たのですが、有効期限を過去にしても クッキーが削除されずにエラーメッセージが出ます。 エラーメッセージ Warning: Cannot modify header information - headers already sent by (output started at C:\Eclipse\workspace\PHP\cookie.php:7) in C:\Eclipse\workspace\PHP\cookie.php on line 11 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHPのクッキー情報を活用したい

    PHPのクッキー情報を活用したい 現在入門書で勉強中、例のとおりに打ち込んだつもりなのですが、プログラムがうまく動きません。アドバイスお願いします。使用OSはwindows7、ブラウザはfirefox3.6.11です。apatcheは2.2で、PHPは5.2.14です。 プログラムは以下のとおりです。 (1)cookie.php <html> <head> <title>クッキーでデータを記録する</title> </head> <body> <form method="POST" action="cookie_rec.php"> E-Mailアドレス: <input type="text" name="email" size="30" maxlength="50" value="<?php print($_COOKIE['email']); ?>" /> <input type="submit" value="送信" /> </form> </body> </html> (2)cookie_rec.php <html> <head> <title>クッキーでデータを記録する</title> </head> <body> <?php setcookie("email",$_POST['email'],time()+(60*60*24*90)); ?> クッキー"email"を保存しました。 </body> </html> これを動かして、一枚目はうまく出るのですが、2枚目には Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php10\day02-3\cookie_rec.php:6) in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php10\day02-3\cookie_rec.php on line 6 とエラーが出ます。cookie_rec.phpの6行目はしっかり確認しました。他のところも確認しましたが、なぜエラーなのかわかりません。どこが悪いのでしょうか?

    • ベストアンサー
    • PHP
  • クッキーの名前について

    はじめまして、PHPでクッキーを利用したいのですが、 クッキーの名前で悩んでいます。 Windowsに保存されているクッキーを見てみると、 クッキーの名前が、 Cookie:******@?????? ****:Windowsにログインしているユーザー名 ????:ドメイン となっているものがあります。 概して大手サイトより発行されたクッキーがこのようになっているように思えます。 自分で作成したPHPでクッキーを発行してみると、 setcookie()で指定したpathの部分が名前となるようです。 また、pathを指定しないと発行元のphpが存在するディレクトリ名に なります。  クッキーの名前が”Cookie:******@??????”となるのは、何か意味があるのでしょうか? セキュリティーなどにからんでこうなるとしたら、同じようにしないといけないのかな?でも、Windowsのユーザー名ということは、他のOSでは不都合が生じるのかな?と悩んでしまい、質問させていただきました。 お分かりになる方いらっしゃいましたらご回答よろしくお願いします。

    • ベストアンサー
    • PHP
  • クッキーの削除

    お世話になります。 PHPにて下記の命令文でクッキーの削除を試みているのですが、削除することができません。 setcookie('クッキー名', '', time() - 1800); 何故でしょうか? 宜しくお願いいたします

    • ベストアンサー
    • PHP
  • PHPのクッキーの設置について質問です。

    PHPのクッキーの設置について質問です。 他にも下記のようなエラーの質問があるのを見つけて、それを見たのですが、そこを読んで対応しても駄目だったので、少し問題点が違うのかなと思い質問させていただきました。 ※初心者ですのでものすごく初歩的なミスをしていそうな気がしています・・・。 あるフォームを作成していまして、a.phpというファイルで、確認画面からメールを送信、その後、includeで3つファイル(send.php、cookie.php、thanks.php)を読み込む構成にしています。 3つのファイルのうち、cookie.phpを入れたときだけ、下記のエラーが出てしまうのですが、対処の仕方を教えていただけますでしょうか? ※PHP4で作成しています。 ※cookie.php以外ではエラーはないようです。cookie.phpを入れなければ正常に動作。 ※thanks.phpは、<html>から始まるファイルで、このファイルを単独で表示しても大丈夫なHTMLのファイルです。 ○エラーメッセージ Warning: Cannot modify header information - headers already sent by (output started at ディレクトリ on line 12) ○a.php(大元のファイル。) <? ・ ・ ・ switch($status){ ・ ・ ・ case thanks: include('send.php'); include('cookie.php'); include('thanks.php'); break; ・ ・ ・ ?> ○cookie.php内は、下記の内容だけ。 <? $expire= time()+60*60*24; if(isset($_COOKIE['visitcount'])){ $visit = $_COOKIE['visitcount']; }else{ $visit = 0; } $visit++; setcookie('visitcount', $visit , $expire); ?> 以上です。 どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • PHP のsetcookie()関数について

    PHP5を使ったHTML文書で、setcookie()関数を使っていますが、以下のようなメッセージが出てきてクッキーに新しいデータを書き込むことが出来ません。 環境はWindows10, IE11です。 PHP使用方法: $fname="mondai10.txt" setcookie("filename", $fname);  // line 38 setcookie("version",3); // line 39 メッセージ: Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\QAmondaiDisplay.php:3) in C:\xampp\htdocs\QAmondaiDisplay.php on line 38 Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\QAmondaiDisplay.php:3) in C:\xampp\htdocs\QAmondaiDisplay.php on line 39 そしてこのクッキーを次のようにJavaScriptで読み込んでいるのですが、表示させてみると書き込んだものとは全く異なるものが表示されます。 JavaSript 使用法: var cookiedata = window.document.cookie; window.document.getElementById("q1").innerHTML =cookiedata;; 実際に表示されるもの: PHPSESSID=57c35633ffc2fe44622ee27e61bf44eb; filename=yasudaShiroexpires=Mon, 08 Oct 2018 21:44:48 GMT そしてこの表示は、最後の時間以外はいつも同じです。 どこに問題があるのでしょうか? 詳しい方、どうか教えてください。

    • ベストアンサー
    • PHP
  • クッキーが保存されずに困っています

    どなたか、詳しい方がおりましたらアドバイスをお願い いたします。私はプログラムを仕事としている者では ありませんが、独学でPHPを勉強しております。 クッキーが保存されなくて困っています。 以下の部分です。 クッキーの有効期間は設定していませんが、ブラウザを 閉じずにテストしていての情況です。 ---------------------------------------------------- ファイル名:rogin.php <?php setcookie("userck","ckdata=100"); print $_COOKIE[userck]; ?> <html> <body> <br><br><br> <center> <table border="1"> <form method="post" action="<?=*********"> <tr> <td> Email: </td> <td><input type="text" name="data1" size="30"> </td> </tr> <tr> <td> pass: </td> <td><input type="text" name="data2" size="30"> </td> <tr> <td colspan="2" align="center"> <input type="submit" name="sousin" value="送信"> </td> </tr> </form> </center> </body> </html> ---------------------------------------------------- どうしてクッキーが保存されないのか自分なりにいろいろと 調べたり、テストをしてみたりしました。 テストの内容 test1.php <?php setcookie("userck","ckdata=100"); ?> test2.php <?php print $_COOKIE[userck]; ?> 上の2つのファイルを作成して、test2.phpで出力してくるか どうかを試してみますと、問題なく「data=10」が出力されて きます。(保存されているかどうかだけを調べたいので、 parse_strは省略しています。) ところが、問題のrogin.phpでクッキーを保存して別のファイル で$_COOKIE[userck]を取得しようとしてもどうやら保存されて いないようです。 rogin.phpの内部に記載した、print $_COOKIE[userck];では ckdata=100は出力してきます。 それではと思い、test1.phpでセットしたクッキーはrogin.phpで 取得できるのかどうかをテストしてみますと、無事に取得できます。 setcookie()の前にはHTMLの出力はありません。 クッキー名にアンダーバーも使っていません。 何か、php.iniに関係するのかと思い、一応iniファイルに output_buffering = On を書き足したりもしました。 クッキーが保存されない原因で、考えられることはどんなこと なのかが知りたいです。 どなたか、お分かりになる方アドバイスをお願いできないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • クッキーの利用

    xfreeのphpサーバーを利用祖いているのですが、クッキーの利用ができません。 (Warning: Cannot modify header information - headers already sent by (output started at hoge/cookie.php bom付ではないか確認をしました。) (sessionも変数を破棄するページでWarning: Cannot modify header information - headers already sent by (output started at hoge/session.php のようなエラーが出ます。破棄のページのみなのでbom付ではないかと思われます。) 下記の画像php.iniはどのように設定すればいいですか?

  • クッキー認証>クッキー削除ができない!!

    今回は、クッキー認証画面を作成している際、 エラーが出てしまって先に進めず投稿しました。 下記にプログラム記載 ----H_01.html---------------------------------- <html> <head> <title>クッキー認証</title> </head> <body> <center> <form method="POST" action="H_02.php"> 名前<input type="text" name="name"> パスワード<input type="Password" name="pass"> cookieを記録する<input type="checkbox" name="chk"> <input type="submit" value="送信"> <input type="reset" value="リセット"> </form> </center> </body> </html> ------------------------------------------------ -----H_02.php---------------------------------- <?php $name = $_COOKIE['name']; $pass = $_COOKIE['pass']; $cnt = $_COOKIE['chk']; if ($cnt == True) { $lim = time()+7*24*60*60; //有効期限1週間 setcookie('name',$name,$lim); setcookie('pass',$pass,$lim); } else { setcookie('name'); setcookie('pass'); } ?> ------------------------------------------------ else文内の、setcookie二行にエラーが出ます。 htmlでチェックボックスにチェックが施されていない場合、クッキーを削除。 調べてみたのですが、どうしたらよいのかわからず 投稿しました。よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう