[PHP]セッション破棄について

このQ&Aのポイント
  • phpを使ったログアウト処理について質問です。
  • ログアウト処理にはlogout01.phpとlogout02.phpという2つの方法がありますが、違いは何でしょうか。
  • また、セッションの破棄方法やクッキーの削除についても教えてください。
回答を見る
  • ベストアンサー

[PHP]セッション破棄について

はじめまして。 phpを始めて1週間の初心者です。 現在、ホームページでログイン処理とログアウト処理をphpのセッションを使って作成しています。 今回質問させて頂くのはログアウト処理についてです。 ログアウト処理をでセッションを破棄する際に http://oshiete1.goo.ne.jp/qa3224862.html を参考にして下記の処理を行わせています。 -------------------- logout01.php -------------------- <?php session_start(); $_SESSION = array(); if(isset($_COOKIE[session_name()])){setcookie(session_name(),'',time()-4200,'/');} session_destroy(); header("location: http://~トップページのURL~/"); ?> -------------------- 確認をしたところ、ログインしたユーザの情報は削除されているようでした。 また、http://oshiete1.goo.ne.jp/qa3224862.htmlを参考に下記のようなログアウト処理も行わせてみました。 -------------------- logout02.php -------------------- <?php session_start(); unset($_SESSION['access']); header("location: http://~トップページのURL~/"); ?> -------------------- 同じく確認したところ、ログインしたユーザ情報は削除されているようでした。 -------------------- 環境 -------------------- <サーバ> 【OS】 windows XP(テスト環境)、CentOS 5.2(公開環境) 【PHP】 5.2.6 【Apache】 2.2 <クライアント> 【OS】 windows XP 【ブラウザ】 Firefox 3.0.8 IE 7 -------------------- -------------------- 質問 -------------------- (1)logout01.phpとlogout02.phpの違いは何でしょうか。 (2)「unset($_SESSION);」は使用すると「$_SESSION」が使えなくなるとのことですが、  それはphpを再インストールしない限りは使えなくなるということでしょうか。  それとも、ブラウザを再起動すれば使えるという意味でしょうか。 (3)「unset($_SESSION);」と「unset($_SESSION['access']);」では何が違うのでしょうか。 (3)セッションを使用するとサーバ側にセッションIDを保存したファイルが保存され、  クッキーがクライアント側に保存されるとのことですが、logout01.phpとlogout02.phpを  実行した場合、サーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 (4)セッションの有効期限を指定していないため、logout01.phpとlogout02.phpを実行せずに  ブラウザを終了させた時もログインしたユーザ情報は削除されているようでしたが、  この場合もサーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 初歩的な質問で申し訳御座いませんがよろしくお願いします。

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

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

  • ベストアンサー
  • papa987
  • ベストアンサー率19% (21/106)
回答No.2

>「$_SESSION = array();」は全セッションの初期化 セッション変数$_SESSIONの中身を空(初期化、破棄)する。 >「session_destroy();」は全セッションの破棄 セッションを破棄する。ただしセッション変数は破棄しないから ですから一般的には $_SESSION = array(); をやってから session_destroy(); をする。 >「unset($_SESSION['access']);」は指定したセッションの破棄 セッション変数$_SESSION['access']の破棄。 だから別AとBという内容があり Aだけがいらなくなったら $_SESSION['A']でAのみ破棄してBを残すこともできます。 セッションとセッション変数は別々に考えましょう。

rfc137
質問者

お礼

ありがとうございます。 おかげでモヤモヤしていたものがスッキリしました。

その他の回答 (1)

  • papa987
  • ベストアンサー率19% (21/106)
回答No.1

$_SESSION = array(); の場合は破棄ではなくて配列を作る関数とでも書けば理解できますか? でarray();とすることで空の配列変数となっただけです。 すでに配列にないか入っている状態で配列変数を空にするときに使うことがあります。 次にまずunset関数のの役割を理解しよう。 http://www.google.co.jp/search?hl=ja&safe=off&q=PHP+unset&lr= 簡単に書くと変数を破棄する関数です。 で、 unset($_SESSION); と書いたら$_SESSIONそのものを破棄 unset($_SESSION['access']); と書いたら $_SESSION内のaccessという名前の連想配列を破棄したことになり $_SESSIONそのものは破棄はされないと言うことになります。

rfc137
質問者

お礼

ご回答ありがとうございます。 >$_SESSION = array(); >の場合は破棄ではなくて配列を作る関数とでも書けば理解できますか? >でarray();とすることで空の配列変数となっただけです。 >すでに配列にないか入っている状態で配列変数を空にするときに使うことがあります。 ⇒つまり、セッションの初期化ではなく、破棄をしたい場合、  logout01.phpでは「session_destroy();」のみで破棄が行われているということですね。 >unset($_SESSION); >と書いたら$_SESSIONそのものを破棄 >unset($_SESSION['access']); >と書いたら >$_SESSION内のaccessという名前の連想配列を破棄したことになり >$_SESSIONそのものは破棄はされないと言うことになります。 ⇒つまり、unset($_SESSION['access'])、unset($_SESSION['access02'])、unset($_SESSION['access03'])と  1つずつ破棄していくか、「session_destroy();」でまとめて破棄するかが違うだけで処理そのものは同じ  ことをしているということですね。 まとめると、下記の通りということですね。 「$_SESSION = array();」は全セッションの初期化 「unset($_SESSION['access']);」は指定したセッションの破棄 「session_destroy();」は全セッションの破棄

関連するQ&A

  • セッションとクッキーの関わりについて

    いつもお世話になりますm( __ __ )m 質問の前に前提条件としてセッションによるログインサイトなどは、以下のようなやり取りを行っていると認識しています。 1. サーバーからクライアントにセッション ID を発行する 2. クライアントのクッキーにセッション ID が保存される 3. 以降、クライアントがサーバーにアクセスするとクッキーに保存されているセッション ID が一緒にサーバー側に送信され、サーバー側で保存しているセッションデータと関連つける。 ここまで間違っていたらご指摘ください。 以下、質問です。 上記の仕組みを PHP などを用いて既存のセッション関数を使わず自作するとした場合、以下のシーケンスで同等と考えてよろしいでしょうか? 1. サーバー側で乱数などを用いてセッション ID を独自に生成する 2. Set_Cookie 関数などでクライアントのクッキーにセッション ID を保存する。 3. 以降、クライアントのクッキーからセッション ID を取得し、サーバー側でその値を元に DB などから値を取り出す。 私には前者と後者が全く同じ処理に見えるのですが、違うのでしょうか。それとも同じなのでしょうか。と言ったところが聞きたいと考えています。 以上です。 よろしくご教授くださいm( __ __ )m

  • セッションの仕組み

    php初心者です セッションの仕組みを教えてください 質問1 セッションidとセッションクッキーは同じものですか? 質問2 セッションidやセッションクッキーはデフォルトでは、ブラウザを閉じた時に削除されますか? 質問3 レンタルサーバーのphp.iniを調べてみたところ 保存場所がsession.save_path no valueでした。この場合、訪問者のパソコンにクッキーが保存されてしまうのでしょうか?サーバーに保存する方法はありますか? 質問3 session_start();でセッションを開始したときセッションidが自動で付けられるのはわかりましたが、 セッションid(MD5で作られた数字)の使い道がわかりません 質問4 セッションidはどこに利用すればいいのでしょうか? session_start(); session_id(); //このセッションidの利用方法がわかりません $_SESSION['id'] = $_POST['id']; よろしくお願いします

    • ベストアンサー
    • PHP
  • ログアウトする際にセッションファイルを削除したい

    PHPでWEBアプリケーションを作成しています。 携帯対応にするために、フォームを使用できないところは セッションIDをURLに付加しています。 ログアウト後(ユーザーがログアウトボタンをクリック)は、戻るボタンをクリックしても「ログインしていません」のエラーメッセージが表示されるようにしたいのです。 現在、ログアウトする際、すべてのセッション変数を削除しているのですが、ブラウザの戻るボタンをクリックすると、もとの画面が表示されます。 その画面にはセッションIDを埋め込んだリンクがあり、 クリックすると正常にリンク先に移動してしまいます。 セッションファイルが残っているために、セッションが継続されたような状態になってしまっているのではないかと思います。 セッションファイルを削除すれば、上記エラーメッセージが表示されるのです。 そこで、ログアウト時にセッションファイルを自動的に削除してしまいたいのですが、どのような方法をとればよいのでしょうか? やっぱり普通にセッションファイルの場所を取得して、削除するしかないのでしょうか? 教えてください。 以下、ログアウト時の処理です。 // セッションの初期化 session_start(); // セッション変数を全て解除する $_SESSION = array(); (session_id('')); // セッションを切断するにはセッションクッキーも削除する。 // Note: セッション情報だけでなくセッションを破壊する。 if (isset($_COOKIE[session_name()])) {   setcookie(session_name(), '', time()-42000, '/'); } // 最終的に、セッションを破壊する session_unset(); session_destroy();

    • 締切済み
    • PHP
  • セッション

    セッションとクッキーで質問です。 1.session_id()やsession_name()っていつ使うのでしょうか? ブラウザは特定できても個人を特定できるわけではないですよね?それとも ブラウザを特定して管理するためなのでしょうか? 2.自動グイン機能を実装しようと思うとき、 クッキーとサーバー側(正確にはdb)にランダムな文字列を格納し、次回サイトを訪れた際、保存している値とクッキーにある値を照合し合えばログインしたことにする。 上記のようなロジックで大丈夫でしょうか?

    • ベストアンサー
    • PHP
  • WEBのクッキーとセッションは、クライアント側で変更できるのでしょうか?

    クッキーとセッションについて教えてください。 (例として使用している言語はphpです。) オートログイン機能用に、IDとパスワードの情報をクライアント側のクッキーに保存してもらい、 指定のサイトをブラウザで開いたらクッキーから情報を読み込み、 該当したらログイン用のセッションにサイトに入れるフラグを入れるとします(たとえば$_SESSION["login"]="on")。 この場合、セッションの[login]の値が"on"なら、ログインできるのですが、 ブラウザ自体の機能やUNIXのプログラム等にセッションの値自体を変更する何かしらの方法があり、 IDとパスワードをしらなくてもセッションの[login]を"on"にしてログインされてしまうということはあるのでしょうか? また、今回の処理でクッキーを読み込む際、変数に一度格納している(例:$id=$_COOKIE["id"])のですが、 この場合でも、別ドメインのサイトに行った際IDやパスワードがログとして表示されてしまうのでしょうか? (セッションは別ドメインのサイトにリンクした際、飛び先のドメインでも並文としてログが表示されてしまうらしいので) 教えていただけるようお願いします。

  • セッション変数の破棄について、いまひとつスッキリしない部分があります。

    セッション変数の破棄について、いまひとつスッキリしない部分があります。どなたか詳しい方是非ご教授お願いいたします。会員サイトからログアウトするときは、$_SESSION=array(),session_destroy(),そしてクッキーの削除で処理をしてきました。特に問題なく動作をしておりますが、もしログアウト でunset($_SESSION[hogehoge])のように変数を破棄した場合、他のuserの$_SESSION[hogehoge]も削除されてしまうのでしょうか?この部分が、ず~っと疑問に残り解決できませんでした。PCが複数 台あれば、実験してたりかめることもできるのですが1台しかないのでそれができません。ネット上で ずいぶん検索して調べましたが、そこら辺のところをスッキリと理解できるように説明されたページも 見当たらないようでした。もしよいWEBがありましたら、そちらのWEBを紹介していただく形でも結構です。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • sessionについて

    こんばんは。お世話になっております。 題名にあるようにセッションに関してアドバイスいただきたく投函させて頂きます。 (他に似たような質問はあったものの、上手く解釈できなくて・・) 現在、DBに登録された会員のみがログイン出来る機能を有したサイトを作成しておりますが、DB参照の後、idなどを、セッション変数に代入し、そのデータを持ち歩いています。 書籍や他の方からセッションIDのことを耳にしますが、いまいち、その必要性というものを理解する事が出来ないのですが、このセッションIDは、どこでどういったところで必要になってくるものなのでしょうか? また、チェックボックスなどで任意により、自動でログインする機能を持たせるとした場合、クッキーを用いるという事までは理解したのですが、調べた範囲では、先のセッションIDをクッキーに保存させる・・という内容を多くみました。 現在、セッションハイジャックを避けるようサーバー側に保存されるセッションIDを書き換える設定をしているのですが、このような場合はクッキーを用いての自動ログインはどうしたらいいのだろう?と糸口が見えずにいる次第です。 以下、アドバイスを頂戴したいことをまとめると、 1.ログイン状態を認識させるためには、セッション変数だけで事足りるのか?また、この場合においてのセッションIDの意味するとは? 2.セッションハイジャックを避けるためサーバー側に保存させるセッションIDを随時変更している場合、自動ログイン機能を用いるには、どのような流れ(内容)になるのか? です。お忙しい中恐縮ですが、アドバイスなど頂けたら幸いに思います。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • ログアウト処理

    <?php if(isset($_SESSION["sdata"])) { print "ようこそ".$_SESSION["sdata"]."さん"; print "<INPUT type=\"button\" value=\"ログアウト\" onClick=\"location.href='自分自身'\">"; unset ($_SESSION["sdata"]); } else { print "ようこそゲストさん"; print "<INPUT type=\"button\" value=\"ログイン\" onClick=\"location.href='ログイン画面'\">"; exit; } ログイン画面で認証できたら、$_SESSION["sdata"]=ユーザー名 として、他の画面では上のような処理をしようかと思ったのですがこれではブラウザの更新ボタンを押してもログアウト扱いになってしまうことに気づきました。 onClick=\"unset ($_SESSION["sdata"]);\" にしたらいけるかと思ったのですが、エラーになってしまいました。ログアウトボタンを押したらセッション変数を削除したいのですが、どうしたらいいでしょうか? それと、ログイン処理はクッキーとかも使ったほうがいいのでしょうか?

    • 締切済み
    • 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
  • セッションの有効期限の設定方法とログアウト方法

    会員システムをPHPのセッション管理を使って作っているのですが、 1.セッションの有効期限の時間を変更するためにはsession_cache_expireを使うんだと思うんですが、これは全ページのsession_start()の前に書かないといけないのでしょうか? それとも、ログインするときに必ず通るPHPファイルに書いておけば大丈夫なのでしょうか? 2.会員ログアウトをする場合は、 unset($_SESSION['****']); でログインするときに入れた変数をunsetするだけで大丈夫なのでしょうか? もっと他に一般的な方法があったりするのでしょうか? どちらかだけでもお分かりの方がいれば教えていただければうれしいです。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう