我正在使用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语句。 有人可以帮忙吗?
答案 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