无法使用会话变量

时间:2013-08-27 12:19:08

标签: php codeigniter session

我正在使用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');
        }

}

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

class Blood_Controller extends CI_Controller {

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

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

即使我在第一个控制器上输入一个rightusername,它总是进入if语句。 有人可以帮忙吗?

5 个答案:

答案 0 :(得分:1)

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

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

 }

并删除session_start()并使用

 `$this->session->set_userdata('username', $tempuser);`

答案 1 :(得分:0)

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

尝试:

if (!session_id())
  session_start();

尝试var_dump($ _ SESSION);在session_start()之后的第3个控制器中检查内部是什么。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

删除所有session_start();并在配置中设置 - > autoload.php

将“!==”更改为“!=”并检查会话变量值

答案 4 :(得分:0)

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

$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