Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法使用会话变量_Php_Codeigniter_Session - Fatal编程技术网

Php 无法使用会话变量

Php 无法使用会话变量,php,codeigniter,session,Php,Codeigniter,Session,我使用一个codeigniter,我有3个控制器,我使用会话存储来自第一个控制器的用户名,我使用它从另一个控制器确定是否有人登录 这是第一个控制器的构造函数,在这个类中,我还使用语句,其中我给会话['username']一个值,以便其他控制器使用它: class Login extends CI_Controller { public function __construct() { session_start(); parent::__construct(); } public

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

这是第一个控制器的构造函数,在这个类中,我还使用语句,其中我给会话['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');
    }
 }
即使我在第一个控制器上输入rightusername,它也总是在if语句中。
有人能帮忙吗?

最好检查会话是否已经存在

尝试:


并尝试var_dump($_会话);在会话启动()后的第三个控制器中检查会话数据。

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

删除所有会话\u start();并在config->autoload.php中进行设置

更改“
==
'to“
!=
”并检查会话变量值

加载此“$this->load->library('session');“就在这里

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

 }
并删除会话_start()并使用


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

$this->load->library('session');
不需要在codeigniter中使用session_start()

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

另一方面,如果不想在every controller构造函数中手动初始化会话类,则可以从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');
您可以通过以下方式检索会话数据:

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

转到此处了解有关CI会话的更多信息:

您在哪里将
用户名写入会话?当有人使用正确的用户名和密码登录时,在第一个控制器上。您也应该粘贴该代码。我只看到
会话\u start
。根本没有分配。您可以尝试添加
会话\u start()
到main index.php文件的顶部?并从代码中删除所有其他
会话\u start()
。我对此没有问题,因为第二个控制器中仍然可以访问$\u会话['username']。问题是,$\u会话['username']当我在第三个控制器上使用它时没有任何值OK,你是说你在第一个控制器中对$\u会话['username']有值,你是否在第三个控制器的if语句之外回显了它,但它们的值都是零。当我在第二个控制器上尝试时,它有一个值删除所有会话\u start();并在config->autoload.phpDid中进行设置。如果您试图从控制器中删除所有
会话_start()
,并且只在主(CI root)index.php文件的顶部添加一次,我只是尝试了一下,但它不起作用,第二个控制器也无法访问它。