ブラウザ終了時にセッションを削除する方法

このQ&Aのポイント
  • ログアウト後のセッションの削除方法について説明します。
  • IEとFirefoxでのセッションの挙動の違いについて説明します。
  • セッションを削除するためのプログラムの例を示します。
回答を見る
  • ベストアンサー

ブラウザ終了時にセッションを削除する方法

ログイン入力画面を作成し、以下の動作を確認しています。 (1)正常にログインしてブラウザを終了する。 (2)再びブラウザを起動してログイン後の画面を表示する。 (3)セッションがないため自動的にログイン入力画面へ移動する。 IEだとセッションが消えてログイン入力画面へ移動しますが、 Firefoxではセッションが消えず、ログイン入力画面へ移動しません。 Firefoxでもブラウザ終了後にセッションを消す方法はないでしょうか? 下記のプログラムで確認しました。 -------------------------------------------------------------------- login.php <?php session_start(); $error_message = ""; if(isset($_POST["login"])){ if($_POST["member_name"] == "php" && $_POST["pass"] == "pass"){ $_SESSION["login_name"] = $_POST["member_name"]; $login_url = "http://{$_SERVER["HTTP_HOST"]}/admin/anq_result.php"; header("Location: {$login_url}"); exit; } $error_message = "メンバー名かパスワードが間違ってます。"; } ?> <html> <body> <?php if($error_message){ print '<font color="red">'. $error_message. '</font>'; } ?> <form name="form1" method="post" action="login.php"> <p>メンバー名 <input type="text" name="member_name" value=""> <br> パスワード <input type="password" name="pass" value=""> <br> <input type="submit" name="login" value="ログイン"> </p> </form> </body> </html> ------------------------------------------------------------------------------------------------------------------------- anq_result.php <?php session_start(); if (!isset($_COOKIE["member_name"])) { unset($_SESSION["login_name"]); } if (!isset($_SESSION{"login_name"})) { $no_login_url = "http://{$_SERVER["HTTP_HOST"]}/admin/login.php"; header("Location: {$no_login_url}"); exit; } else { print "ログイン成功です。"; } ?>

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

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

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

サーバ側で「ブラウザを閉じた」というのが検知できない以上は無理だと思います。 実際にはセッションではなくCookie(保存期限なし=ブラウザを閉じるまでの期限)をチェックしていますよね? >if (!isset($_COOKIE["member_name"])) { >  unset($_SESSION["login_name"]); >  } こればかりはブラウザの仕様なので、如何ともし難いです。セッションもFirefoxは(サーバ側でタイムアウトするまでは)復元可能ですしね。

takaroby
質問者

お礼

回答ありがとうございます。 >こればかりはブラウザの仕様なので、如何ともし難いです。 そうですか。 ブラウザの仕様では仕方がないので諦めます。

takaroby
質問者

補足

すみません。 ↓のクッキーは間違えです。 if (!isset($_COOKIE["member_name"])) { unset($_SESSION["login_name"]); }

関連するQ&A

  • PHP初心者です。何処がエラーなのかさっぱり解りません。

    超初心者です。 PHPの勉強を始めたばかりで、いきなりつまずいています。 下記の表示になりエラーになっているのですが、何処がエラーなのか意味が解りません。 Parse error: syntax error, unexpected $end in C:\xampp\htdocs\phplesson\03\login.php on line 31 どなたか教えてください。 よろしくお願いします。 ----------------- <?php session_start(); $error_message = ""; //ログインボタンが押されたかを判定 if (isset($_POST["login"])) { if ($_POST["member_name"] == "php" && $_POST["password"] == "password") { //ログインが成功した証拠をセッションに保持 $_SESSION["login_name"] = $_POST["member_name"]; //管理者専用画面へWebブラウザをリダイレクトさせる $login_url = "http://{$_SERVER["HTTP_HOST"]}/phplesson/03/anq_result.php"; header("Location: {$login_url}"); exit; } $error_message ="メンバー名かパスワードを間違えています。"; } ?> <html> <body> <?php if ($error_message) { print '<font color="red">' .$error_message. '</font>'; } ?> <form action="/phplesson/03/login.php" method="post"> メンバー名:<input type="text" name="member_name" value="" /><br /> パスワード:<input type="password" name="password" value="" /><br /> <input type="submit" name="login" value="ログイン" /> </form> </body> </html>

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

    PHPのセッションについて 現在ログインフォームを作成しているのですが、 ログインフォームからIDとパスワードを送信して、合っていれば セッションを発行してロケーションで飛ばそうと思っているのですが、 初回時にIDとパスワードを入力して送信しても、セッションが引き継がれず 2回目以降だとセッションが引き継がれる症状に悩んでおります。 どなたかご教授ください。 宜しくお願いいたします。 【login.php】-------------------------------- <?php session_name("stock"); session_start(); $error_flag = 0; if(isset($_POST["login"])){ $id = htmlentities($_POST["id"],ENT_COMPAT); $password = trim(htmlentities($_POST["password"],ENT_COMPAT)); if($login_id == $id && $login_pass == $password){ $_SESSION["id"] = $id; $_SESSION["password"] = $password; header("Location:stock.php"); exit; }else{ $error_flag = 1; } } echo <<<EOD <form method="post" action="login.php" id="login"> <input type="text" name="id" id="id" > <input type="password" name="password" id="password"> <input type="submit" name="login" value="ログイン" /> </form> EOD; 【stock.php】--------------------------------- <?php session_name("stock"); session_start(); echo $_SESSION["id"]; echo $_SESSION["password"]; ?>

    • ベストアンサー
    • 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ファイルでログイン画面を作りたい

    一つのphpファイルでログイン画面を作りたい 一つのphpファイルでログイン画面→管理者画面 ログインエラー画面を作りたいと思っております。 下記のスクリプトで上手くセッションが保持できないので、 どなたかご教授ください。 宜しくお願いいたします。 -------------------------------------------- session_start(); //パスワードチェック $error_flag = 0; if(isset($_POST["login"])){ if($_POST["id"] == $login_id && $_POST["password"] == $login_pass){ $_SESSION["login"]["admin"] = 1; }else{ $error_flag = 1; } } if(isset($_SESSION["login"]["admin"]) && $_SESSION["login"]["admin"] == 1){ //管理者画面 }else{ //エラー画面 }

    • ベストアンサー
    • PHP
  • php フォーム入力のあと同じページ内に移行

    <?php session_start(); $error_message = ""; if(isset($_POST["login"])) { if($_POST["user_name"] == "webtan" && $_POST["password"] == "webtan_pass") { $_SESSION["user_name"] = $_POST["user_name"]; $login_success_url = "login_success.php"; header("Location: {$login_success_url}"); exit; } $error_message = "※ID、もしくはパスワードが間違っています。<br> もう一度入力して下さい。"; } ?> ① $login_success_url = "login_success.php"; ② $error_message = "※ID、もしくはパスワードが間違っています。<br> もう一度入力して下さい。"; 同ページ内でのPOSTの受け渡しをしたいのですが、どうしたら良いでしょうか?

    • 締切済み
    • PHP
  • PHPのログイン処理について

    PHPのログイン処理について教えてください。 「login_auth.phpファイル」 <?php //session開始 session_start(); session_regenerate_id(true); //エラーメッセージを格納する変数を初期化 $error_message=""; //ログインボタンが押されたかを確認 if(isset($_post["sub"])){ if($_post["auth_id"] == "auth" && $_post["auth_pass"] == "1234"){ //ログインが成功した証拠をセッションに保持する $_session["login_name"] = $_post["auth_id"]; //管理者トップへWebブラウザをリダイレクトさせる $login_url = "http://{$_server["http_host"]}/reservation/auth_top.php"; header("Location: {$login_url}"); exit; } $error_message = "IDかPASSが間違えています"; } ?> <html> <body> <?php if($error_message){ print '<font color="red">'.$error_message.'</font>'; } ?> <center> <hr size="2" color="blue" width="50%"><br><br> <font size="4"><b>管理者認証画面</b></font> <br><br><hr size="2" color="blue" width="50%"><br><br> ユーザID/パスワードを入力してください。 <form action="login_auth.php" method="post"> <table border="2"> <tr> <td bgcolor="cyan">ユーザID</td> <td><input type="text" name="auth_id" value=""></td> </tr> <tr> <td bgcolor="cyan">パスワード</td> <td><input type="password" name="auth_pass" value=""></td> </tr> </table> <input type="submit" name="sub" value="ログイン"> </form> <a href="javascript:window.close();" target=_parent>閉じる</a> </center> </body> </html> 「auth_top.phpファイル」 <?php //セッションを開始する session_start(); //ログインが成功した証拠である変数のチェックを行なう if (!isset($_SESSION["login_name"])) { //変数に値がセットされていない場合は不正な処理とみなし、ブラウザをログイン画面へリダイレクトさせます $no_login_url ="http://{$_server["http_host"]}/reservation/login_auth.php"; header("Location: {$no_login_url}"); exit; } ?> 管理者画面です。 この簡単なプログラムなんですが、IDとPASSを入力しても画面が切り替わりません。 今、そこで行き詰っています。 どなたか教えていただけないでしょうか??

    • 締切済み
    • 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
  • ログイン時で、php+sessionについて

    普通のページは静的なhtmlなのですが、1ページだけログインページを付けています。 ログイン自体は問題ないのですが、普通のページは静的なhtmlなので、アカウントやパスは普通、データは渡せません。 できるのはphp+session(+javascipt)だけかな?と考えています。 1ページだけログインを付ける為にphpで作成しました。 問題は、html内にphp+sessionを使える方法を知りたいです。 IDやPASSの暗号化は分かっているので、その部分は今回スルーしてます。 変数名も書き方もバカなぐらい簡易化してます。 とにかくデータの渡し方を知りたいです。 ○test.html <form method="post" action="test.php"> <input type="text" name="id" id="id" value=""> <input type="text" name="pw" id="pw" value=""> <input type="submit" value="submit"> </form> ○test.php session_start(); session_name("id"); session_name("pw"); $_SESSION["id"]=$_POST["id"]; $_SESSION["pw"]=$_POST["pw"]; このIDとPASSをどうやったら、test.htmlのフォーム内に自動的に入れられるか、それがわかりません。 やっぱりjavascriptで、SESSIONを取得し、document.getElementByIdのinputか何かを使ってやるのでしょうか? 時間がないのですが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • セッションについて教えてください。

    PHPを独学で勉強中の初心者です。(HTMLとCSSくらいしか分からない所からのスタートです) ログインフォーム→パスワード処理→コンテンツ表示というながれで作っています。 質問は、セッションの有効期限はデフォルトではブラウザを閉じるまでと聞いたのですが、それはウインドウを閉じるではなく、アプリケーションを終了するまでということでよいのでしょうか?ウインドウを閉じただけだと、コンテンツを表示できてしまいます。 また、コードがこんなんでよいものかアドバイスよろしくお願い致します。 --パスワード処理-- <?php session_start(); $id =p; $password =11; $n_id = $_POST["n_id"]; $n_password = $_POST["n_password"]; if(($n_id == $id ) && ($n_password == $password)){ $_SESSION['pass'] = 1; header("Location: page1.php"); }else{echo "IDまたはパスワードが違います。"; } ?> ----コンテンツページ----- <?php session_start(); if(isset($_SESSION["pass"]) && $_SESSION["pass"] == 1){ echo "コンテンツ"; echo "<html><head> <meta http-equiv=Content-type content=text/html; charset=EUC-JP> </head><body>"; echo "<form action =logout.php method=post>"; echo "<input type=submit name=sbm value=ログアウト>"; echo "</form></body></html>"; }else{ header("Location:login1.php"); } ?>

    • 締切済み
    • PHP
  • PHP ログインについて

    PHPを使い会員サイトを作っています。 遷移としては index→login→top でログインして中の各ページで、サイトロゴをクリックすればマイページトップに戻るようにしたいです。 ログイン時はPOSTでデータを受け取り、ログイン後はセッションで全ページを繋いでいます。 そののtopで困っています。 ログインしようとすると画面が真っ白になり、検証を見てもエラーは出ていませんでした。エラー表示になるよう設定しており、今までのエラーは見れていました。 session_start(); if(!isset( $_SESSION["uid"])&&(!isset( $_SESSION["pass"]))){ if(!isset ( $_POST ["uid"] )&&(!isset( $_POST["pass"]))){ header ( "Location: login.php" );} } if((isset ( $_POST ["uid"] ))&&(isset( $_POST["pass"]))){ login(); exit; } 上記で$_SESSIONのuidとpassがなければ$_POSTのuidとpassをチェック。$_POSTもなければ、login画面に移動。 $_POSTが入っていたら次のIF文で、関数login()。 関数login()は下記の通りです。 function login(){   function inputCheck($uid, $pass){ $flg=0; // IDの登録チェック require("dbConnect.php");//接続 $sql = "select * from usr where uid ={$uid}" ; //echo "sql=".$sql."<br>"; $result = $dbInfo->query ( $sql ); $record = $result->fetch ( PDO::FETCH_ASSOC ); $count = $result->rowCount (); if($count<=0){ echo "このIDは存在しません<br>"; $flg=1; } if($pass<>$record["pass"]){ echo "パスワードが違います<br>"; $flg=1; // データベースの切断 $dbInfo = null; } return $flg; } // 送信データの取得 $uid = htmlspecialchars($_POST ["uid"], ENT_QUOTES); $pass = htmlspecialchars($_POST ["pass"], ENT_QUOTES); $flg=inputCheck($uid, $pass); if($flg<>0){ require("login.php"); exit; }} 関数に入れ子で関数が使えると見たので中に入れましたが、inputCheck()をlogin()の外に出してみても同じように画面が真っ白になりました。 最初にログインだけ作って動かした際にはログインすることが出来ました。 ログイン状態のチェックが悪いのか関数の使い方が悪いのか、わかりません。 ご教授いただければ幸いです。

    • ベストアンサー
    • PHP

専門家に質問してみよう