phpでのログアウト方法についてのご質問

このQ&Aのポイント
  • phpで会員制サイトの制作を勉強しています。データベースへの接続はPDOを使用し、MySQLデータベースを使用しています。現在、セッション変数を使用したログイン方法を実装していますが、ログアウト処理についてのご質問があります。
  • 現在のログアウト処理では、全ページ共通のメインメニューにログアウトボタンを作成し、押されたら$_POST['logout']にtrueという値を送信しています。トップページに遷移した後、$_POST['logout']の値がtrueの場合にセッション変数を破棄しています。
  • しかし、リンクを使用したログアウトボタンを実装したい場合、どのようにセッション変数を破棄すれば良いのかわかりません。ネットで調べたりもしましたが、ほとんどのサイトではログアウト処理確認専用の画面に遷移してからセッション変数を破棄する方法ばかりでした。よりスムーズなログアウト処理のプログラムについてご教示いただければ幸いです。
回答を見る
  • ベストアンサー

phpでのログアウトについて

phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 セッション変数($_SESSION["email"])の有無を使用したログイン方法を使用しています。 セッション変数の破棄(ログアウト処理)について質問があります。 前提として、現在会員制サイト制作の勉強で「ログアウト後は必ずTOPページに遷移する」という形にこだわっています。 ちなみに現在使っているログアウトの方法は 1、 全ページ共通の、ページ上部に表示されるメインメニューに <form method="post" name="logout" action="toppage.php"> <input type="hidden" name="logout" value="true"> <input type="submit" value="ログアウト"> </form> でログアウトボタンを作成し、 ログアウトボタンが押されたらtrueという値を持った$_POST["logout"]を トップページ(toppage.php)に送る。 2、トップページ(toppage.php)に画面遷移させ、 $logout = filter_input(INPUT_POST, 'logout'); if($logout=="true"){ unset( $_SESSION["email"] ); } でもしも$_POST["logout"]がtrueなら セッション変数$_SESSION["email"]を破棄する というプログラムによりログイン・ログアウトを管理しています。 きちんと動いてはいるのですが、不満が1つあります。 願わくばログアウトボタンをformタグのsubmitで作るのではなく、 <a href="toppage.php">ログアウト</a> とリンクを使用して作成したいです。 このようにリンクを使用する場合、遷移後のTOPページ(toppage.php)でセッション変数$_SESSION["email"]を破棄するには、どのようなプログラムを記述すれば良いのでしょうか? ネットで調べたりもしましたが、ほとんどのサイトで紹介していたものは、 ログアウトリンクをクリックすると、ログアウト処理確認専用の画面(「ログアウトしました!」とだけ書かれたような画面)に遷移し、セッション変数を破棄するものばかりでした・・・ 私個人としてはログアウト処理が完了した旨を報告する画面をワンクッション置くのは、あまり実用的ではない気がして好みません・・・ 巷にあふれているようなサイトではログアウトボタンをクリックすると TOPページに遷移するようなサイトばかりなので、 phpを使用した場合、どうやったらそのような仕組みになるのか考えた上で、 今のへんてこなログアウト処理プログラムに至りました。 ごちゃごちゃしていないもっと良いログアウト処理プログラムはないでしょうか? ご回答、よろしくお願いします。

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

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

anchor要素だと(QueryStringで渡すにしてもpathinfoで渡すにしても)間違ってログアウト後のTOPページをBookmarkされてしまうと、そのBookmarkでTOPに戻ろうとするとログアウトしてしまうけどそれはいいんですかね。 anchor要素でやるならlogout.phpのようなログアウト専用のスクリプトにリンクして、そちらでセッション情報を破棄してからLocationヘッダでtoppageへ遷移させる方が素直だと思います。 logput.php <?php session_start(); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } $_SESSION = array(); session_destroy(); header('Location: http://example.com/toppage.php');

mmm5orz
質問者

お礼

ご回答ありがとうございます! ブックマークされた場合とか、全く考えていなかったです・・・ 確かに動作的に危ないですね。 仰るとおり、headerで飛ばせば、ワンクッションページがあっても ログアウト処理が安全に行えて、無駄な画面は表示されないので良いですね! 非常に為になりました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

><a href="toppage.php">ログアウト</a> >とリンクを使用して作成したいです。 そのロジックだとtoppageにいったら必ずログアウトしてしまうけどいいの? <a href="toppage.php?logout=1">ログアウト</a> 的な処理にしたらどうですか?

mmm5orz
質問者

お礼

ご回答ありがとうございます! なるほど、GETを使用するやり方ですね。 確かに理にかなっていると思いますが、 できればURLをあっさりさせたいので、POSTを使用していました。

関連するQ&A

  • 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
  • ログアウト後、リフレッシュしたい

    お世話になります。 現在jspで、ログアウトした後トップページへ戻る処理を作成中です。 [logout.jsp] <!-- トップページへ戻る --> <tiles:insert page="top.jsp" /> <!-- セッションのクリア --> <% session.invalidate(); %> 困っているのは、logout.jspからtop.jspへ遷移したとき、一部、古い情報が表示されてしまうことです(ログアウト前の情報)。 全ページ共通で使用しているヘッダーに、「ログイン・ログアウト」リンクを持っており、ログイン中には「ログアウト」と表示し、ログアウト中には「ログイン」と表示させるようにしています。 この部分が、logout.jspからtop.jspへ遷移したとき、最新の状態で表示されません・・・ログアウトしてtop.jspへきた直後にはまだ「ログアウト」となっています。ページをリフレッシュすると、「ログイン」となり、最新の状態が正しく表示されます。 キャッシュをクリアする方法か、top.jspへきたときに1回だけページをリロードする方法か、他によい方法をご存知であれば、教えてください。 よろしくお願いします。

  • [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
  • php $_SESSIONで値が消える。

    いつもお世話になり誠にありがとうございます。 標記の件。 インプット画面ー>確認画面ー>戻るー>インプット画面 インプット画面に戻った時、どうしても最初のインプット画面で打った内容が消えてしまいます。 プログラムを診て、誤りを指摘して頂けないでしょうか? どうぞよろしくお願い致します。           記 <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['email'] = $_POST['email']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['email'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!DOCTYPE html> <html lang="ja"> <head> </head> <body> <div class="v_line_fix"> <h1>Blog K・T</h1> <h2><a href="index.html">トップページ</a></h2> <?php if( $mode=='input'){ ?> <form method=post> お名前(ニックネーム)<br> <input type="text" name="name" value="<?php echo $_SESSION['name'] ?>"><br> Eメール<br> <input type="email" name="email" value="<?php echo $_SESSION['email'] ?>"><br> カテゴリー<br> <input type="text" name="category" value="<?php echo $_SESSION['category'] ?>"><br> 本文<br> <textarea style="font-size:1.5em;" cols="30" rows="80" name="message"><?php echo $_SESSION['message'] ?></textarea><br> <input type="submit" name="confirm" value="確認" /> </form> <?php }else if( $mode=='confirm'){ ?> <!--確認画面--> <form method="post"> <?php echo $_SESSION['name']?><br> <?php echo $_SESSION['email']?><br> <?php echo $_SESSION['category']?><br> <br> <?php echo nl2br($_SESSION['message'])?><br> <input type="submit" name="back" value="戻る"/> <input type="submit" name="send" value="送信"/> } </form> <?php } else { ?> <!--完了画面--> <?php } ?> </body> </html>

    • ベストアンサー
    • 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
  • ログインしたページで、ある処理を実行中に他のページへ飛ぼうとするとログアウトする

    タイトルの通り、ログインしないと表示できないページ間の遷移中に、他のページへのリンクをクリックするとログアウトされていしまいます。原因がわからず困っています。 要件的には、あるページへの遷移中に、他のページへのリンクをクリックすると、最初のページへの遷移を中止して、後からクリックしたページへ遷移する、もしくは、後からのクリックを無視して、最初のページへ遷移する、のどちらかです。 ソースは以下のような感じです。PHP5.2.4です。 session_start(); session_regenerate_id(TRUE); if (isset($_SESSION["isloggedin"]) && $_SESSION["isloggedin"]) { // ログインしていないと見られないページを表示 } else { header ("Location: login.php");// ログイン画面へ ※どうやらこっちの分岐に入るようです。 } ちなみに遷移終了後にさらに他ページへ遷移する場合は問題が発生しません。

    • 締切済み
    • PHP
  • php $_SESSIONでデータが残らない。

    いつもお世話になり誠にありがとうございます。 標記の件。 インプット画面ー>確認画面ー>戻るー>インプット画面 インプット画面に戻った時、どうしても最初のインプット画面で打った内容が消えてしまいます。 プログラムを診て、誤りを指摘して頂けないでしょうか? 今度はCSSなども書きます。 どうぞよろしくお願い致します。 記 <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['email'] = $_POST['email']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['email'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="content-type" content="text/html" charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>ブログ</title> <meta name="description" content="このWebサイトは、初めてHTMLで作るブログページです。"> <link rel="stylesheet" href="./css/style.css"> <style> body{ width: 100%; max-width: 800px; margin-top: auto; margin-left: auto; margin-right: auto; background-color: rgb(71, 133, 157); padding: 10px; text-align: center; } div{ background-color: rgb(247, 248, 245); padding: 2em; } script{ margin-top: 12em; } p { margin-left: 2em; text-align: left; font-size: 25px; font-weight: bold; color: rgb(10, 10, 10); } form { font-size: 25px; font-weight: bold; color: blue; } input { font-size: 25px; margin:auto; } </style> </head> <body> <div class="v_line_fix"> <h1>Blog K・T</h1> <h2><a href="index.html">トップページ</a></h2> <?php if( $mode=='input'){ ?> <form method=post> お名前(ニックネーム)<br> <input type="text" name="name" value="<?php echo $_SESSION['name'] ?>"><br> Eメール<br> <input type="email" name="email" value="<?php echo $_SESSION['email'] ?>"><br> カテゴリー<br> <input type="text" name="category" value="<?php echo $_SESSION['category'] ?>"><br> 本文<br> <textarea style="font-size:1.5em;" cols="30" rows="80" name="message"><?php echo $_SESSION['message'] ?></textarea><br> <input type="submit" name="confirm" value="確認" /> </form> <?php }else if( $mode=='confirm'){ ?> <!--確認画面--> <form method="post"> <?php echo $_SESSION['name']?><br> <?php echo $_SESSION['email']?><br> <?php echo $_SESSION['category']?><br> <br> <?php echo nl2br($_SESSION['message'])?><br> <input type="submit" name="back" value="戻る"/> <input type="submit" name="send" value="送信"/> } </form> <?php } else { ?> <!--完了画面--> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • ログアウトを実行してもログアウトされていない。

    こんにちは、ログアウトについてお聞きしたのですが、 どなたかお力を貸してください。 ユーザーネームとパスワードでログインする会員サイトを作っています。 会員メンバーのみ閲覧できるページがあるというシステムです。 ログインをして会員ページを閲覧できるのですが、 「ログアウトボタン」を押してもログアウト処理がされず、 まだ会員しか閲覧できないページを見ることができる状態です。 見ることができます。 いままでは、 // セッションを壊す。 //setcookie ("USERNAME", ""); //setcookie ("PASSWORD", ""); と記述していましたが、うまくいきませんでした。 調べたところ // セッション変数を全て解除する $_SESSION = array(); // セッションを切断するにはセッションクッキーも削除する。 // Note: セッション情報だけでなくセッションを破壊する。 if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } // 最終的に、セッションを破壊する session_destroy(); という書き方があるとわかったのですが、 ユーザーネームとパスワードを初期化するという文法と 書き方が分からず、未だに、ログアウトできない状態です。 文法と書き方をどなたか教えて頂けないでしょうか。 また、セッションを保つ時間の記述の仕方も教えて頂けないでしょうか よろしくお願い致します。

    • 締切済み
    • PHP
  • htmlとphpのデータ受け渡し???

    いつもお世話になり誠にありがとうございます。 標記の件。 まだ、ボク自身、解っていないようです。 htmlとphpのソースコードを提示します。 どうすればデータの受け渡しができるか? 添削してくださらないでしょうか? html <!--入力画面--> <form action = "./Blog.php" method = "get"> <label class="label" for="name">お名前(ニックネーム)</label> <center><input id="name" type="text" name="name"></center> <label class="label" for="e-mail">メール</label> <input id="e-mail" type="e-mail" name="e-mail"> <label class="label" for="category">カテゴリー</label> <input id="category" type="category" name="categoryl"> <label class="label" for="message">本文</label> <textarea name="area1" style="color:rgb(8, 8, 8); font-size:100%;" cols="50" rows="30"></textarea><br> <input type="submit" name="confiem" value="確認"> </form> CSS <meta charset="utf-8"> <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['e-mail'] = $_POST['e-mail']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['e-mail'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!--確認画面--> <?php if( $mode == 'input' ){ ?> お名前(ニックネーム)<?php echo $_POST['name'] ?><br> Eメール<?php echo $_POST['e-mail'] ?><br> カテゴリー<?php echo $_POST['category'] ?><br> 本文<br> <?php echo nl2br($_POST['message']) ?><br> <input type="submit" name="back" value="戻る" /> <input type="submit" name="send" value="送信" /> <?php } else { ?> <!--完了画面--> <?php } ?> 上記の通りです。 全然ダメだと思います。 添削のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • docomoのセッションが切れてしまうのは?

    携帯サイト用のセッションでdocomoの時だけ思うように フォームによるページ遷移ができません。 色々試してみたのですが、サッパリです。 どなたかお知恵をお貸し下さい。 例) -- page01.php -- session_name( "test" ); session_start(); session_regenerate_id(true); $test = session_name()."=".session_id(); if ( ( $smp01 = auth() ) == FALSE ) { header( "Location: ./test.php?redirect=index_test.php?" ); exit; }←ログイン時の処理(ユーザー定義関数にて) ・        ・        ・        ・ <form action="page02.php?<?= $test ?>" method="get" /> 入力:<input name="test01" type="text" value="" /> <input name="smp02" type="submit" value="next" > </form> ↑入力させてpage02.phpにて処理 上記のようにしているのですが、 submitするとログイン時の処理に掛かってセッションが切れてしまい ログインページに戻ってしまいます。 ログイン時の処理を削除するとpage02.phpへと遷移します。 ログイン時の処理を残したままセッションが切れずにフォームによる ページ遷移ができるようにするにはどのようにすれば良いのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう