2017-04-15 14 views
0

この質問には多くの重複がありますが、いくつか試してみましたが、回答はありませんでした。ここでPHPセッションはログアウト/設定解除されていません

はlogout.phpのための私のコードです:

<?php 
    session_start(); 
    require './codefiles/dbhelper.php'; 
    $dbh = new DbHelper(); 
    $dbh->Execute('UPDATE surveyors SET LoggedIn=\'0\', SessionID=\'\' WHERE Username=\''.$_SESSION['username'].'\''); 
    session_unset(); 
    session_abort(); 
    session_destroy(); 
    $_SESSION = array(); 
    unset($_SESSION['username']); 
    unset($dbh); 
    header('location:index.php'); 
?> 

しかし、セッション変数を除去することがあまりにも「頑固」です。セッション変数は削除されません。オブジェクト$ dbhは設定されていませんが、$ _SESSION ['username'];

私のSQLクエリでLoggedIn = 0を設定しているにもかかわらず、別の関係のない問題は、データベースに1のままです。 LoggedInフィールドのタイプは「ビット」です。 SessionIDフィールドは空白に設定されています。

解決方法はありますか?

EDIT:それは不要だったとして

echo $dbh->errorを削除しました。

EDIT 2:ホッサムMagdyにより示唆されるように

session_destroy()を追加しました。

+0

あなたは 'session_destroy();'を試してみましたか?http://php.net/manual/en/function.session-destroy.php? – Hossam

+0

ああ、そうです。私が持っています。 –

+0

私が間違っていれば私を訂正してください。セッションを中止すると、セッションを終了するように見えるので、ストレージへの書き込みができなくなります。そして、 'sessionHandlerInterface'を実装しているクラスで' session_set_save_handler() 'を使用するのを止めたのでしょうか? – frz3993

答えて

0

なぜか分かりませんが、セッションを破壊するコードは何らかの形で動作していませんでした。logout.phpそれはindex.phpと他のファイルで働いていましたが、あらゆる種類の予測不可能な動作をします。

問題を回避するための回避策が見つかりました。 logout.phpは、以下のようなコードがあります。

<?php 
    session_start(); 
    $_SESSION['logout'] = TRUE; 
    header('location:index.php'); 
?> 

そして、index.phpのにこのコードを追加します。

# Implement logout functionality 
<?php 
    session_start(); 
    if(isset($_SESSION['logout']) && $_SESSION['logout'] == TRUE){ 
     foreach($_SESSION as $var => $value){ 
      unset($_SESSION[$var]); 
     } 
     session_destroy(); 
     session_unset(); 
    } 
?> 

それは標準化されたソリューションではないかもしれないが、コードは私の作品毎回、予期しない動作がない。

皆様のご意見をお寄せいただきありがとうございます。

+0

私はあなたが必要とするセッションを破壊するので、私はforeach設定がlogout.phpまたはlogin.phpになければならないと思います。新しいセッション値を設定する前に、index.phpは私にはうまくいかない。とにかくそれは奇妙な問題です。あなたはこれをテストしましたか?http://stackoverflow.com/questions/16759719/i-just-cant-destroy-a-session-in-php? –

+0

私が言ったように、私のコードはどんなファイルでも動作しましたが、私の** logout.php **では動作しませんでした(なぜか分かりません)。それがあなたのために働かないなら、それは私たちの異なる論理のためかもしれません。どのような方法でも、私が別の問題を解決して提案したリンクは、すべてのログアウト後に新しいセッションIDを再生成します。ありがとう。 –

0
<?php 
include 'codefiles/dbhelper.php'; 

if(!isset($_SESSION['id'])) 
{ 
    header ("Location: login_form.php"); 
} 
else 
{ 
    session_destroy(); 
    die('You have been logged out.<meta http-equiv="refresh" content="0;url=login_form.php">'); 
} 
?> 

これは基本的に「ログアウト」構造です。

+0

しかし、 'session_destroy()'はlogout.phpや他のページのどちらでも動作していません。 –

0

この

<?php 
session_start(); 
require './codefiles/dbhelper.php'; 
$dbh = new DbHelper(); 
$dbh->Execute('UPDATE surveyors SET LoggedIn=\'0\', SessionID=\'\' WHERE Username=\''.$_SESSION['username'].'\''); 

echo session_status() . '<br />'; 

session_unset();  
session_destroy(); 

echo session_status(); 

// header('location:index.php'); 

がのが何session_status(見てみましょう試してみてください)は述べています。 私のプロジェクトでは、& &の作業を解除しています。

+0

私はsession_start()を使用していますが、 'session_destroy()'を呼び出すと警告が以下のようにスローされます:*警告:session_destroy():C:\ xampp \ htdocs \ xxxxxxxxx \ index.php *の初期化されていないセッションを破棄しようとしています。 'echo session_status()'に関しては、** 1 **を出力します。 –

+0

session_statusは、1回目、2回目、またはその両方を返しますか? http://php.net/manual/es/function.session-status.phpによると、1はアクティブなセッションがないことを意味します。 –

+0

'session_unset()'と 'session_destroy()'の前に 'session_status()'を呼び出すと、** 2 **を返します。 'print_r($ _ SESSION);'を呼び出すと、セッション内のすべての変数が表示されます。 –

関連する問題