2012-02-14 13 views
1

このコードで何が問題になっていますか?CodeIgniter sess_destroyで異常な動作が発生する

セッション変数 "user"には、ログに記録されたユーザーのIDがあります。ログイン処理時に設定されます。

$this->session->set_userdata("user",$user->id); 

このコードは常にエラーページを表示し、セッションを破棄します。なぜですか?私はます$ this->セッション - > sess_destroy()それが動作コメント場合

if (!$this->session->userdata("user")) 
{ 
    $error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ; 
    log_message('error', $error); 
    show_error($error); 
} 
else 
{ 
    $this->session->sess_destroy(); 
} 

、セッションが破棄されていないとエラーが

+0

オンラインチャットアプリケーションでCIセッションライブラリを使用しようとすると予期しない動作が発生しています。私は最終的にネイティブのPHPセッションを使用するように切り替えました。私はあなたがそのようなバグを見つけたと思う。良いキャッチ;それはいくつかの有用な洞察を提供するかもしれません。 –

答えて

1

あなたの機能は言う示されていない:「ユーザーではない場合エラーメッセージを表示してエラーを記録し、それ以外の場合はsess_destroy()でユーザーをログアウトしてください。

このページにアクセスしてログインしていないと、エラーが表示されます。ページにアクセスし、あなたがログインしている場合、関数はsess_destroyを呼び出し、ログアウトします。


明確化:あなたのコードでは1つのユーザー状態のみが許可されています:ログアウトされているため、ページに出力される唯一の方法です。ログインしているユーザーがそのページにアクセスすると、すぐにログアウトされます。

if($this->session->userdata('email')){ 
    //the user is logged in 
    echo "HELLO USER, YOU ARE LOGGED IN!"; 
}else{ 
    //you don't need session_destroy because 
    //they won't get here with a session to be destroyed 
    redirect('/home'); 
} 

さらに明確化:私はCodeIgniterのの新規インストールでこれをテストし、私が説明したように、それが動作します。時間を節約するために、デフォルトのウェルカムコントローラを変更

:あなたは歓迎/インデックスにアクセスすると

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Welcome extends CI_Controller { 

    function __construct() 
    { 
     parent::__construct(); 
     $this->load->library('session'); 

    } 

    function index() 
    { 

     $this->session->set_userdata("user","1234"); 
     echo "userdata set to: ".$this->session->userdata("user"). "<br>"; 
     echo "<a href='welcome/checksess'>check session</a>"; 
    } 

    function checksess() 
    { 


     if (!$this->session->userdata("user")) 
     { 
      $error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ; 
      log_message('error', $error); 
      show_error($error); 
     } 
     else 
     { 
      echo "userdata: ".$this->session->userdata("user"). " about to be destroyed with sess_destroy<br>"; 
      $this->session->sess_destroy(); 
      echo "<a href='checksess'>check session again after sess_destroy (refresh this page)</a>"; 
     } 
    } 
} 

/* End of file welcome.php */ 
/* Location: ./application/controllers/welcome.php */ 

それはセッションデータを設定します。チェックレスのリンクをクリックすると、チェックサムエコーのuserdataがsess_destroyを呼び出します。チェックレスを更新すると、userdataは設定されず(sess_destroyのため)、「ユーザーはログアウトせずにログアウトします...」というエラーが表示されます。

発生した動作を説明するためのコードには何もありません。

+0

いいえ、これは正しい動作です...私がログインしていて、私はエラーとセッションを破棄したページにアクセスします。それはページを2回実行するようなものです。私はなぜそれが起こっているのかわかりません... – alasarr

+0

いいえ、それはありません。私は例を使って答えを更新しました。しかし、あなたのコードはユーザがログアウトできるようにしています。 – stormdrain

+0

私は知っている...それは非常に奇妙ですが、これは私が深くテストを行ったことが起こる。私のステップは1)ログイン2)ユーザーページを起動3)ログアウト4)エラーログが表示され、セッションが破棄されます(セッションが破壊されていることがわかります。これはCIプロファイラで見ることができ、 2 – alasarr

関連する問題