セッションの破棄エラーについて

このQ&Aのポイント
  • セッションの破棄方法について質問です。
  • セッション変数を解除し、クッキーを削除してセッションを破棄しましたが、エラーが発生しています。
  • エラーメッセージによると、ヘッダ情報が既に送信されているようです。どのように解決すればいいのでしょうか?
回答を見る
  • ベストアンサー

セッションの破棄

セッションについて質問です。 $_SESSION['username']を複数ページで使用した後、破棄しようと思うのですが、エラーが出てしまいます。 セッション自体は破棄できていると思うのですが、これはどういったエラーなのでしょうか? ソースコード <?php session_start(); ?> <!DOCTYPE html> <head> <meta charset="utf-8" /> <title>セッション破棄</title> </head> <body> <?php //セッション変数を全て解除 $_SESSION = array(); //セッションクッキーの削除 if (isset($_COOKIE["PHPSESSID"])) { setcookie("PHPSESSID", '', time() - 1800, '/'); } //セッションを破棄する session_destroy(); if(empty($_SESSION['username'])){ echo "<p>セッション終了</p>"; echo "<a href='session.php'>はじめのページへ</a>"; echo "<a href='index.php'>top</a>"; } ?> </body> </html> エラーメッセージ Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php:1) in /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php on line 2 Warning: Cannot modify header information - headers already sent by (output started at /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php:1) in /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php on line 16 Warning: session_destroy(): Trying to destroy uninitialized session in /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/session3.php on line 20

  • PHP
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
回答No.4

>このような記事を見つけたのですが使えますか? やっぱり、HTMLとPHPを混在させるのではなく、 最初にクッキーに関連する(正確にはヘッダーに書かれる系の命令だけ)を最初に全部やった後に、結果をHTMLに 混ぜるのみで、やったほうがいいかもしれません。 今、HTMLを送ってからPHPからセッションクッキーを操作してるので、それが原因だとは思っているのですが。 が! 最初の1行目で、エラってる理由が、わからないのですよね。 これは、まだHTMLを送ってないように見えるので、 それで、違うかな~と思ってたところでした。 ただ、それ系の問題だとは思うので、 一度、HTMLを送らずに、PHP部分だけを 先にやってみてはどうでしょう? 切り分けることで、問題点が見つけやすくなるかもしれません。 今、暇なので試してもよかったんですが、 やる気が起きなくて(ごめんね)

dhtfyjh
質問者

お礼

いつも質問に答えていただきありがとうございます。

その他の回答 (3)

  • t_ohta
  • ベストアンサー率38% (5081/13278)
回答No.3

たぶん、setcookie() をする前にHTMLを書いているからでしょう。 cookie情報はHTMLヘッダーに記載されるのでHTMLの出力が始まる前に処理しなければいけません。 HTMLの中にPHPの処理を割り込ませるのではなく、まず最初に処理を全て終わらせてからHTMLの出力をするようにし、HTML内では処理結果を表示したり、処理結果を基に判定を入れて表示を切り替えるだけにした方が間違いを減らせますし、可読性が良くメンテナンスしやすくなりますよ。

回答No.2

いや、なんか違うな。。 先頭に書いてる文で、session cache limiter ってのが、引っ掛かる。 ちょっと私が過去にあった件とは違う関連かもしれないので。 別の方の意見を待ちましょ。

dhtfyjh
質問者

補足

サーバーのエラーってことですか? https://netlog.jpn.org/r271-635/2009/04/php_cannot_send_session_cache.html このような記事を見つけたのですが使えますか?

回答No.1

こちらでも試せるのですが、面倒で試してないのですが。 一番最初の"<?php" 内に全部を移動するとどうなりますか? HTTPリクエストって最初にヘッダーが送られ その後、続く空改行の後ボディーが続くので、 ボディーを送信後にヘッダーに関連する命令を書いたことが エラーの原因に見えた為です (このソースを検証はしていないので確信はないが、  過去に同じような問題を私も経験したので) 結局はクッキーなので、ヘッダー内のクッキーが 後から書き換えれない(送り出してしまった後は。。) のエラーだと思います。 たしか、対処法もあったのですが、忘れました^^ ヘッダーとボディーを全部バッファーにためてから、 別に送りだす方式で確か、私の時は解決した気がします。

関連するQ&A

  • セッション管理に関する質問

    レンタルサーバで、セッションを使ったアクセスカウンターを書いているのですが(管理人のアクセスで、カウンタが回らない様に) ↓のような警告が出ました 「Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /home/httpd/maagairu/public_html/index.php:7) in /home/httpd/maagairu/public_html/index.php on line 7」 「Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/httpd/maagairu/public_html/index.php:7) in /home/httpd/maagairu/public_html/index.php on line 7」 これは、「キャッシュが送れない」「クッキーを送れない」、という意味だと思うのですが、これは私のブラウザの設定の問題でしょうか。 この警告の解決方法を教えてください

    • ベストアンサー
    • PHP
  • セッションについて

    以下のソースコードですが、 レンタルサーバによって worningが出てしまうのはなぜでしょうか。 どなたかご教授いただけませんでしょうか? <ソースコード> <?php session_start(); $err=$_SESSION['err']; echo $err; session_destroy(); ?> //セッションデータをもらってくる前のPHPファイル //でも先頭にsession_start();をつかっています。 <レンタルサーバ> ■kagoya(PHP4.3.10)は正常に動作 ■lolipop(PHPver.4.3.11)は以下worningが表示される ・Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/sites/lolipop.jp/users/lolipop.jp-dp40152853/web/pc/attestation/regist/err.php:5) in /home/sites/lolipop.jp/users/lolipop.jp-dp40152853/web/pc/attestation/regist/err.php on line 6 <画面遷移> index.html(ユーザが入力)→write.php(入力規制エラー)→err.php(エラー内容を表示)

    • ベストアンサー
    • PHP
  • cookieが破棄できない【PHP】

    今PHPを習得中なんですが、以下のプログラムでクッキーの破棄ができません。 どこか間違いがあればご指摘お願いします。 <?php session_start(); print <<<____HTML____ <!doctype html> <html> <head> <meta charset="utf-8"> <title>無題ドキュメント</title> </head> <body> ____HTML____; /* -------------------- 処理を分岐 ------------------------ */ if(isset($_POST["do_logout"])){ $key = "do_logout"; } else $key = "do_not_logout"; switch($key){ case "do_not_logout": do_not_logout(); // ログアウトしない break; case "do_logout": do_logout(); // ログアウトする break; } /* --------------------- do_not_logout() ----------------------- */ function do_not_logout(){ header("Location:main.php"); } // do_not_logout() /* ------------------ do_logout() ---------------------- */ function do_logout(){ print "現在のセッション変数<br>"; // 現在のセッション変数 print_r($_SESSION); print "<br><br>"; print "現在のクッキー変数<br>"; // 現在のセッション変数 print($_COOKIE["PHPSESSID"].'<br>'); $_SESSION = array() ; // すべてのセッション変数を初期化 if (isset($_COOKIE["PHPSESSID"])) { // ここでクッキーを破棄 print "ここでクッキーを破棄<br>"; setcookie("PHPSESSID", '', time() - 1800, '/'); } session_destroy() ; // セッションを破棄 $Massage = "ログアウトが完了しました。\nまたのお越しをお待ちしております。\n"; print('セッション変数の確認<br>'); // セッションが破棄されているかの確認 if (!isset($_SESSION["login"])){ print "セッション変数は破棄されています。<br>"; }else{ print"セッション変数は破棄されていません。→{$_SESSION["login"]}<br>"; } print "セッションIDの確認をします。<br>"; // クッキーが破棄されているかの確認 if (!isset($_COOKIE["PHPSESSID"])){ print "クッキーは破棄されています。<br><br>"; }else{ print"クッキーは破棄されていません。→{$_COOKIE["PHPSESSID"]}<br>"; } } // do_logout() echo $Massage; print "<p><a href=\"index.php\">トップページに戻る</a></p>"; ?> </body> </html> /* -------------- 実行結果 (一部)------------------*/ 現在のクッキー変数 **************************d5ee33b19ef197aef ここでクッキーを破棄 Warning: Cannot modify header information - headers already sent by (output started at logout.process.php:18) in logout.process.php on line 81 セッション変数の確認 セッション変数は破棄されています。 セッションIDの確認をします。 クッキーは破棄されていません。→************************d5ee33b19ef197aef

    • ベストアンサー
    • PHP
  • セッションとヘッダーの順序について

    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
  • session_start()の際のCannot send session cache limiterエラーについて

    現在、SJISだったサイトをUTF-8に変換する作業をしております。 今まで起こらなかったエラーなのですが、検索エンジンで、フォーム(index.php)に入力して送信した結果がsearch.phpに出るプログラムです。search.phpに下記のようなエラーが表示されるようになりました。 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/homepage/public_html/search/search.php:1) in /home/homepage/public_html/search/search.php on line 2 session_start()関数はもちろん<html>ヘッダーより前、プログラムの一番上に下記のように書いております。 <? session_start(); ?> <html> 他のページは問題無いのですが、今の所この検索プログラムの結果画面でのみ起こります。また、SJISで書いていた時はこのようなエラーは起こりませんでした。 恐らくUTF-8に変換した点がポイントだと思いますが、解決策が見つからずこちらに質問させていただきました。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 完全なセッション破棄をしたい

    現在運営中のアンケートフォームを改善したいと思い、質問させていただきます。 現在のアンケートフォームは、入力画面.php→確認画面.php→メール送信.php→完了画面.htmlの4ファイルで構成していて、画面としては3画面です。 また、入力値についてはセッション管理をしています。 メール送信後は、以下の命令でセッション破棄・完了画面.htmlの呼び出しを行っております。 $_SESSION = array(); session_destroy(); header("Location: 完了画面.html"); ところが、セッションが完全に破棄されておりません。 具体的にあげますと、完了画面でブラウザの戻るをクリックして確認画面.phpへ戻り、「ページの有効期限が切れています」と表示されるためリロードを行うと値が入った確認画面が表示されてしまうのです。 ページの有効期限が切れていますうんぬんはかまわないのですが、リロードした時に破棄したはずの値がなぜ表示されてしまうのでしょうか。 また、最終的に求めている「同じ内容が二重送信されないようにする」のために、どのように修正すればよいでしょうか。 アドバイス、お願いいたします。

    • ベストアンサー
    • PHP
  • session_start()を使うと警告メッセージが出ます。

    PHP4.2.2、apche1.3.27、VineLinux2.6を使っています。 PHPで、session_start()を使うと以下のような警告メッセージが出てしまいます。何かphp.ini内に、セッティングしないといけないことが あるのでしょうか? [ブラウザに表示されたメッセージ] Warning: Cannot send session cookie - headers already sent by (output started at /usr/local/apache/htdocs/a/a02.php:10) in /usr/local/apache/htdocs/a/a02.php on line 12 Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/a/a02.php:10) in /usr/local/apache/htdocs/a/a02.php on line 12 10 + 200 = 210 [実行したスクリプト] <html> <head> <title>aaa</title> </head> <body bgcolor="red"> <?php session_cache_limiter('private'); session_start(); $a = 10; $b = 200; $c = $a + $b; print("$a + $b = $c"); ?> </body> </html>

    • ベストアンサー
    • PHP
  • wordpressのエラーメッセージの対処方法

    wordpressのエラーメッセージを解消する方法についてご教示頂ける方 何卒宜しくお願い申し上げます。 【質問事項】 管理画面(ダッシュボード)から私が作成していますサイトにログインしようとID及びPASS を入力し、ログインを試みますと、以下のメッセージが発生し、ログインが不可能な状態 となりました。 解消する方法について、 ご教示賜われる方がいらっしゃいましたら、何卒宜しくお願い申し上げます。 ***以下エラーメッセージ*** Warning: Cannot modify header information - headers already sent by (output started at /home/~/~/public_html/wp-includes/functions.php:2908) in /home/~/~/public_html/wp-includes/pluggable.php on line 709 Warning: Cannot modify header information - headers already sent by (output started at /home/~/~/public_html/wp-includes/functions.php:2908) in /home/~/~/public_html/wp-includes/pluggable.php on line 710 Warning: Cannot modify header information - headers already sent by (output started at /home/~/~/public_html/wp-includes/functions.php:2908) in /home/~/~/public_html/wp-includes/pluggable.php on line 711 Warning: Cannot modify header information - headers already sent by (output started at /home/~/~/public_html/wp-includes/functions.php:2908) in /home/~/~/public_html/wp-includes/pluggable.php on line 712 ************************************************ 【エラーメッセージが出ることになった直接的な原因】 エラーメッセージが出る事になった原因。 functions.php修正によるもの。 * / / function.php(子テーマ) ADD_FILTER( 'widget_tag_cloud_args'、 'my_widget_tag_cloud_args'); 関数my_widget_tag_cloud_args($ argsを){ $ argsを=配列( '順番' => 'RAND'、 '数' => 50、 '最小'=> 8、 '最大' => 10 ); $ argsをを返します。 } (注)リターン$args;を入れ漏れていたことにより、     途中経過的として、サイト事態が白紙となり、     現段階の【メッセージ内容】になっております。 何卒宜しくお願い申し上げます。

  • 初心者です。includeでエラーがでます。

    PHP初心者です。 宜しくお願い致します。 <head> <?php include("../php/shop.php"); ?><?php include("../php/menu.php"); ?> <TITLE><? echo $shop[0]; ?> <? echo $page[1]; ?></TITLE> 上記の様に記述して別のファイルのテキストを読み込ませたいのですが、 Warning: Cannot modify header information - headers already sent by (output started at /home/my-styleone-com/public_html/shop/test/pc/index.php:10) in /home/my-styleone-com/public_html/shop/test/php/shop.php on line 2 Warning: Cannot modify header information - headers already sent by (output started at /home/my-styleone-com/public_html/shop/test/pc/index.php:10) in /home/my-styleone-com/public_html/shop/test/php/menu.php on line 2 のようなエラー表示がされます。 文字は問題なく読み込んでいるのですが・・・ ファーストサーバーでは上記のようなエラー表示はでないのですが、 ワダックスといるサーバーにアップすると上記のようなエラー表示がでます。 解決方法があれば教えてください。 お願いします。

    • 締切済み
    • PHP
  • ローカル環境で動くのに本番環境で動かない(セッション変数が渡せず)

    以下は、 (1) テキストフォームに記入された値をPOSTすると (2) 文字列はSESSION変数としてセットされてpage2に遷移し (3) page2 に書き出される というものですが、 ローカルのWInXP(SP3)+IIS+PHP5.2.6では動作するプログラムが 今般レンタルしたサーバー上で(FreeBSD+Apache1.3.37+PHP5.2.2) では動作しません。 具体的には、page2.phpに遷移できずに Warning: Cannot modify header information - headers already sent by (output started at /usr/home/myaccountname/public_html/page1.php:7) in /usr/home/myaccountname/public_html/page1.php on line 14 となります。 ちなみに、page1.phpの<?php $_SERVER["PHP_SELF"] ?>を page1.phpに書き換えても改善ありませんでした。 ローカルで動いていたものがそのまま動作するとも思っていませんが、 見直すべき設定項目として、何がありますでしょうか? ---------------------------page1.php <?php session_cache_limiter('none'); session_start(); ?> <html> <body> <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>"> <input type="text" name="email"> <input type="submit" name="reg"> </form> <?php if ($_POST['email'] != "") { $_SESSION["email"] = $_POST["email"]; header("Location: page2.php"); } ?> </body> </html> ---------------------------page2.php <?php session_cache_limiter('none'); session_start(); ?> <html><body> <?php echo $_SESSION["email"]; ?> </body></html>

    • ベストアンサー
    • PHP

専門家に質問してみよう