1

我基本上是在尝试会话控制。如果用户已登录,则可以继续。但是如果他没有登录,那么它会显示一个登录屏幕然后死。但是,当我在构造函数中使用dieexit时,它不显示登录屏幕;它立即死亡。代码如下:

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?因为如果我不使用,它会在索引功能上移动,如果用户未登录,我不希望它执行索引功能。

这里有什么问题?我应该用什么来停止执行?

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();
    }

}

这是我发布的内容,也将会话保存在数据库中。

登录模型可以像这样原始:

类 Login_model 扩展 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 回答
1

Controller 类将自动运行 index() 函数。因此,要使其正常工作,如果登录签入构造失败,则必须返回 index()。在这里你可以做什么:

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

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');
        $this->no_login = true;
    }
}

function index(){
    if($this->no_login) return;
    // another statement if login success.....
}
于 2020-09-21T22:40:19.403 回答