PHPでクッキーがセットできない理由と対処法

このQ&Aのポイント
  • PHPでクッキーをセットしようとすると「ヘッダー情報を修正できない」というメッセージが表示され、データがセットされません。
  • setcookie()関数を使う際に「ヘッダー情報を修正できない」エラーが発生する原因は、出力される前にヘッダー情報がすでに出力されているためです。
  • ヘッダー情報を修正できないエラーを解決するには、以下の方法を試してみてください。 1. setcookie()関数を実行する前に、すべての出力(echo、HTMLタグ、スペース、改行など)を削除する 2. setcookie()関数の前にob_start()関数を使用して出力のバッファリングを開始する
回答を見る
  • ベストアンサー

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
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

>output started at C:\xampp\htdocs\QAgameOver.php:1 当該スクリプトの1行目ですでにhttpレスポンスヘッダが出力されてしまっていますね。 ソース保存時に「BOM付のutf-8」で保存していませんか? BOMの調整が不可なエディタというのもあり得ませんが、もしも「メモ帳で編集した」とかであれば、真っ当なエディタで(BOMなしのutf-8で)で保存し直してください。

papashiroSooke
質問者

お礼

ご回答有難うございます。 お礼が遅くなってしまい、申し訳ありません。 エディターとしては、SAKURAを使っていますが、当該のファイルを「名前を付けて保存する」事を試してみたところ、Shimixさんのご想像通り、文字コードがUTFー8でBOMにチェックマークがついていました。 このチェックマークを外してセーブしたもので実行したら、見事にクッキーが機能しました。 次回にクッキーを使うときはこのことをよく心に銘記しておこうと思います。  3人の方から、それぞれ貴重な回答を頂き、ベストアンサーを決定するのは難しいのですが、一人を選ぶとなると、やはり直接に問題解決につながったShimixさんにさせて頂きます。

その他の回答 (2)

  • t_ohta
  • ベストアンサー率38% (5070/13246)
回答No.2

setcookie より前にHTMLが書かれていたり、PHPのプログラムでprintやechoを使って何か出力していると、そのエラーになります。 通常は php.ini で output_buffering を On にしてヘッダーの出力順なんて気にしなくていいようにするんですけどね。

papashiroSooke
質問者

お礼

早速にご回答いただき、有難うございます。 以下に示すように、php.ini ファイル(101行目)をアドバイス頂いたように変更して、コンピューターを再起動してやりましたが、状況は変化しません。 output_buffering = On 何か他に方法はありませんか?

  • catpow
  • ベストアンサー率24% (620/2527)
回答No.1

setcookieはすべての出力に先立って指定する必要があるそうです。 だから、HTMLの先頭あたりに置かないとだめみたいです。

papashiroSooke
質問者

お礼

早速に回答を頂き、有難うございます。 setcookie()関数は以下に示すようにHTMLヘッダーよりも前に書いてありますが、状況は変わりません。 <?php $deleteFile=$_POST["deleteFileName"]; //var_dump($deleteFile); $deleteFile=$_SERVER['DOCUMENT_ROOT'].'/'.$deleteFile; //echo "**************** $deleteFile **************</br>"; $point=$_POST["point"]; $cookieData=date("Y-"."m-"."d-"."G:"."i:"."s", time()); setcookie("filename", $deleteFile, time() + 60*60); setcookie("gameOverTime", $cookieData, time() + 60*60); unlink($deleteFile); ?> <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-store"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="-1"> <title> QAgameOver.php</title> </head>

関連するQ&A

  • 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
  • クッキーの利用

    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はどのように設定すればいいですか?

  • phpでcookieのセット

    こんばんは。 php4 apache でプログラミングしています。 cookieをセットしようとして、マニュアル通り setcookie ("TestCookie", "Test Value"); と記述すると、 Warning: Cannot add header information - headers already sent by (output started at /url~ といったエラーが出ます。 原因に心当たりのある方はアドバイス宜しくお願い致します。

    • ベストアンサー
    • 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のプログラムエラー

    とあるサイトを参考にして、 excelファイルをダウンロードできるようにしたいと思い記述しましたが、 エラーが出て困っています。 どのように修正すればよいか、アドバイスいただけないでしょうか? php初心者のため、初歩的な質問かもしれませんこと、お許しください。 windows7を利用しています。 ■表示されたエラーの内容 Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\phpkiso\download.php:9) in C:\xampp\htdocs\phpkiso\download.php on line 15 Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\phpkiso\download.php:9) in C:\xampp\htdocs\phpkiso\download.php on line 17 Warning: readfile(依頼書ダミー.xls) [function.readfile]: failed to open stream: No such file or directory in C:\xampp\htdocs\phpkiso\download.php on line 19 ■プログラム <?php // ダウンロードさせるファイル名 $tmp_file = "依頼書ダミー.xls"; $j_file = "依頼書.xls"; $j_file = mb_convert_encoding($j_file, "SJIS", "EUC"); // ヘッダ header("Content-Type: application/octet-stream"); // ダイアログボックスに表示するファイル名 header("Content-Disposition: attachment; filename=$j_file"); // 対象ファイルを出力する。 readfile($tmp_file); exit; ?>

  • セッションとヘッダーの順序について

    session_name("WebID"); session_start(); を header("Content-Type: text/html; charset=UTF-8"); のあとに呼び出すとエラーになります。 Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\php\index.php:56) in C:\xampp\htdocs\php\verify.php on line 3 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\php\index.php:56) in C:\xampp\htdocs\php\verify.php on line 3 やはりセッションを先に呼び出さないといけないのでしょうか? session_unsetというものを使えばこの順序でもうまくいきますか? index.phpからエラーが起きたファイルを表示させているので、 順序は変えにくいのですが、順序を変えなくてもクリアできる 方法があったら教えてください。

    • ベストアンサー
    • PHP
  • PHPで他のページへジャンプする方法

    phpを使って、WEBを作っています。だいぶPHPを使えるようになってきて、今が一番楽しいときです。 実は以前から引っかかっていて、解決できないことがありますのでお助けください。 if文などで、条件を満たしたときに別のページに移動したいのですが、その移動のさせ方に下のようなソースを記入しています。 if($row==1){ header("location:********.php"); } でも、どうもあまり良い方法ではないような気がしています。 (※*****はユーザー名やファイル名です。) 下のようなエラーが表示されました。 Warning: Cannot modify header information - headers already sent by (output started at /usr/local/www/htdocs/******/public_html/******.php:17) 他のページにジャンプするような関数は何かないのでしょうか。 どなたか詳しい方宜しくご指導お願いいたします。

    • ベストアンサー
    • PHP
  • 会員管理システムを作っているのですが、エラーが出て困っています。

    phpとsmartyで会員管理システムを構築しているのですが、以下のようなエラーが出て困っています。 エラー文 Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\Login.class.php:1) in C:\xampp\htdocs\login.php on line 5 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\Login.class.php:1) in C:\xampp\htdocs\login.php on line 5 Warning: Smarty error: unable to read resource: "login.tpl" in C:\xampp\htdocs\Smarty.class.php on line 1092 このエラー文は何と言っているのですか? また、解決方法が分かる方、ご回答お願いします。

    • 締切済み
    • PHP
  • 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
  • PHPでのリダイレクト

    PHPでウェブアプリを作成しています。 PHPでのリダイレクト方法として、 header("Location: xxxxx.php"); を使うことが多いのですが、HTML出力のあとで使おうとすると、 「Warning: Cannot modify header information - headers already sent by (~」というPHPエラーが発生します。 HTML出力前にリダイレクトができればいいのですが、 HTMLをかいたあとに、PHP処理をさせている処理構造上、header関数以外でリダイレクトする方法はあるのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう