Php 无法使用会话变量
我使用一个codeigniter,我有3个控制器,我使用会话存储来自第一个控制器的用户名,我使用它从另一个控制器确定是否有人登录 这是第一个控制器的构造函数,在这个类中,我还使用语句,其中我给会话['username']一个值,以便其他控制器使用它:Php 无法使用会话变量,php,codeigniter,session,Php,Codeigniter,Session,我使用一个codeigniter,我有3个控制器,我使用会话存储来自第一个控制器的用户名,我使用它从另一个控制器确定是否有人登录 这是第一个控制器的构造函数,在这个类中,我还使用语句,其中我给会话['username']一个值,以便其他控制器使用它: class Login extends CI_Controller { public function __construct() { session_start(); parent::__construct(); } public
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文件的顶部添加一次,我只是尝试了一下,但它不起作用,第二个控制器也无法访问它。