0

我正在使用 codeigniter 并且我有 3 个控制器,我使用会话存储来自第一个控制器的用户名,我使用它来确定另一个控制器是否有人登录。

这是第一个控制器的构造函数,在这个类中,我还使用了我给它一个值的语句,$_SESSION['username']以便另一个控制器使用它:

class Login extends CI_Controller {

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

}

public function index()
{

  $this->load->library('form_validation');
  $this->form_validation->set_rules('username', 'Username');
  $this->form_validation->set_rules('password', 'Password', 'required|min_length[4]');

  if ( $this->form_validation->run() !== false ) {
     // then validation passed. Get from db
     $this->load->model('Login_Model');
     $res = $this->Login_Model->verify_user(
                 $this->input->post('userName'), 
                 $this->input->post('password')
              );

     if ( $res !== false ) {
        $tempuser = $this->input->post('username');
        $_SESSION['username'] = $tempuser;
        redirect(base_url());
     }

  }

  $this->load->view('login_view');
}

这是第二个控制器,在他的构造函数上,我创建了一个条件语句来确定是否有人登录,我对此进行了测试,它仍然可以:

class Pagination extends CI_Controller {

public function __construct() {
    parent:: __construct();
    $this->load->helper("url");
        session_start();
        if(!isset($_SESSION['username'])){
           redirect(base_url().'index.php/login');
        }

}

在第三个控制器中,这是我遇到问题的地方,我无法访问存储用户名的变量,这里是代码:

class Blood_Controller extends CI_Controller {

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

    if(!isset($_SESSION['username'])){
        redirect(base_url().'index.php/login');
    }
 }

即使我在第一个控制器上输入正确的用户名,它也总是进入 if 语句。谁能帮忙?

4

5 回答 5

1

在构造函数中加载这个“$this->load->library('session');”,即在这里

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

 }

并删除 session_start() 并使用

 `$this->session->set_userdata('username', $tempuser);`
于 2013-08-27T12:51:33.373 回答
0

在这种情况下需要使用 $_SESSION 数组而不是 CI 会话库来设置会话数据,即。替换$this->session->set_userdata('username', $tempuser);$_SESSION['username'] = $tempuser

于 2013-08-27T12:31:06.020 回答
0

删除所有 session_start(); 并将其设置在 config -> autoload.php

将 ' !==' 更改为 " !=' 并检查会话变量值

于 2013-08-27T12:31:38.350 回答
0

您可以在控制器构造函数中手动初始化 Session 类,使用 $this->load->library 函数:

$this->load->library('session');

不需要在 codeigniter 中使用 session_start()。

加载后,Sessions 库对象将可用:$this->session

另一方面,如果您不想在每个控制器构造函数中手动初始化 Session 类,那么您可以从 application/config/autoload.php 文件中自动加载它,只需在 $autoload['libraries' 中添加会话类名称] 数组是这样的:

$autoload['libraries'] = array('database', 'form_validation', 'session');

现在您可以像这样设置会话数据:

$this->session->set_userdata('user_name', $user_name);

您可以像这样检索会话数据:

$user_name = $this->session->userdata('user_name');

转到此处了解有关 CI 会话的更多信息:http: //ellislab.com/codeigniter/user-guide/libraries/sessions.html

于 2013-08-28T21:04:32.583 回答
0

检查会话是否已经存在总是一个好主意。

尝试:

if (!session_id())
  session_start();

并尝试 var_dump($_SESSION); 在 session_start() 之后的第三个控制器中检查里面有什么。

于 2013-08-27T12:26:54.723 回答