4

CI 1.7.3 アプリでユーザー管理にTank Authを使用しています。flash_messageすべて正常に動作していますが、ユーザーがログアウトしたときに表示されるように設定しようとしています。問題は、$this->tank_auth->logout();関数がセッションを破棄することです。Tank Auth ライブラリのログアウト機能を次のように変更しました。

    function logout()   {
        $this->delete_autologin();

        // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
        $user_session_data = array('user_id' => '', 'username' => '', 'status' => '');
        $this->ci->session->set_userdata($user_session_data);
        $this->ci->session->unset_userdata($user_session_data);
    }

以前は

function logout()
        {
            $this->delete_autologin();

            // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
            $this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => ''));

            $this->ci->session->sess_destroy();
        }

私のコントローラーには

function logout(){
    if ($this->tank_auth->is_logged_in()) { // logged in
        $this->session->set_flashdata('status_message', $this->lang->line('auth_message_logged_out'));
        $this->tank_auth->logout();

        redirect('');           

    } 

}

関数を削除すると$this->tank_auth->logout();、メッセージは正常に表示されます。私はそれが単純なセッションの問題だと確信しています

4

3 に答える 3

7

を呼び出した後、同じリクエストでデータベースを使用しているときに flashdata を設定しようとしても、機能しsess_destroy()ません (flashdata を追加するセッションがないため)。

この問題を解決する$this->ci->session->sess_create();には、 への呼び出しの後に を追加しsess_destroy()ます。これは、セッションにデータを追加する前にセッションを再作成しているためです。sess_destroy()これは、データベースでセッションを使用している場合にフラッシュデータを使用する唯一の方法です。

于 2012-07-24T13:56:45.287 に答える
2

このsess_destroy()関数は、メッセージの受け渡しに使用されたセッションフラッシュ変数も破棄します。

Uはすでにあなたの質問に答えました、ライブラリlogout()関数で、あなたは置き換える必要があります

$this->ci->session->sess_destroy();

$this->ci->session->unset_userdata(array('user_id' => '', 'username' => '', 'status' => ''));

これにより、セッションが完全に破棄されるわけではなく、ログインに使用されるユーザーデータのみが破棄されるため、代わりにlogout()、コントローラーの関数を変更し、ビューに渡すことでメッセージを手動で表示することをお勧めします。

于 2011-12-31T15:26:10.537 に答える
1

これは回避策ですが、うまくいくかもしれません...

これらを表示している場所はどこでも、ビューでチェックインしていると仮定します...

<? if ($this->session->flashdata('status_messege'): ?>

    <p><?= $this->session->flashdata('status_message') ?></p>

<? endif; ?>

それにelseifを追加して、リファラーがログアウト関数であることを確認できます...

<? if ($this->session->flashdata('status_messege'): ?>

    <p><?= $this->session->flashdata('status_message') ?></p>

<? else if ($this->agent->referrer() == site_url('path/to/logout'): ?>

    <p><?= $this->lang->line('auth_message_logged_out') ?></p>

<? endif; ?>

この問題を克服するための少しハックな方法ですが、それでもおそらく方法です。

于 2011-03-17T13:04:49.823 に答える