1

私は基本的にセッション制御を試みています。ユーザーがログインしている場合は、次に進んでも問題ありません。しかし、彼がログインしていない場合は、ログイン画面を表示して終了します。ただし、コンストラクターでdieorを使用するexitと、ログイン画面が表示されません。それはすぐに死ぬ。コードは次のとおりです。

private $username = null;
private $mongoid = null;
private $neoid = null;

public function __construct(){
    parent::__construct();

    // session to global
    $this->username = $this->session->userdata( 'username');
    $this->mongoid = $this->session->userdata( 'mongoid');
    $this->neoid = $this->session->userdata( 'neoid');

    // check if user is logged in
    if( $this->username == "" || empty( $this->username)){
        $this->load->view( 'access/login');
        die;
    }
}

dieが書かれていない場合はログインページを表示しますが、 の場合は表示されdieません。なぜ使用したいのdieですか?使用しないと index 関数に移動し、ユーザーがログインしていない場合は index 関数を実行したくないためです。

ここで何が問題なのですか?実行を停止するには何を使用すればよいですか?

4

3 に答える 3

1

メソッドを作成して、コンストラクターで呼び出すことができます。

function __construct() {
    parent::__construct();
    $this->_is_logged_in();
}

メソッドは次のようになります。

function _is_logged_in() {
    $is_logged_in = $this->session->userdata('is_logged_in');
    if (!isset($is_logged_in) || $is_logged_in != true) {
        redirect('login');
        die();
    }
}

そしてもちろん、ログイン用のコントローラーが必要です。これは次のようになります。

<?php

class Login extends CI_Controller {

    function index() {
        $this->load->view('LOGIN-VIEW');
    }

    function validate() {
        $this->load->model('login_model');
        $data = $this->login_model->validate();

        if ($data != false) {
            $data['is_logged_in'] = true;
            $this->session->set_userdata($data);
            redirect('MAIN-CONTROLLER-AFTER-LOGIN');
        }
        else {
            $this->index();
        }
    }

    function logout() {
        $this->session->sess_destroy();
        $this->index();
    }

}

これは私が投稿したもので、セッションもデータベースに保持します。

ログインモデルは、次のように原始的です。

class Login_model extends CI_Model {

function validate() {


    $this->db->where('username', $this->input->post('username'));
    $this->db->where('password', md5($this->input->post('password')));
    $query = $this->db->get('users');

    if($query->num_rows == 1) {
        $data = $query->row_array();
             return $data;
        } else {
            return false;
        }
}
于 2012-10-30T05:20:46.210 に答える
1

CodeIgniter は、ビューを で読み込んだときに即座にビュー$this->load->view();を出力するのではなく、代わりにビューの出力を出力バッファーに置き、すべてが読み込まれた後、出力全体をユーザーにフラッシュします。そうは言っても、あなたが見ている問題は、出力をバッファリングしてから、フラッシュせずに死ぬことです。

dieは本当に悪いので、デバッグ以外では使用しないでください。変数スイッチのようなものを使用することをお勧めします。コントローラーのスコープのみの場合は、

private $show_everything_else = true;

コンストラクターで:

if( $this->username == "" || empty( $this->username)){
    $this->load->view( 'access/login');
    $this->show_everything_else = false;
}

コントローラのメソッドのいずれかで:

if($this->show_everything_else) {
    // ...
}

いずれにせよ、この解決策は迅速な解決策であり、これを行う方法ははるかに優れていますが、すべて別のアプローチが必要です。

于 2012-10-27T17:06:14.093 に答える