Codeigniter 3 和会话
Codeigniter 3 and session
我在 CI 的 2.x 版本中工作正常。我曾经使用默认 CI 会话选项(我相信是浏览器)来保存它们,但我现在决定使用数据库。我已经设置 table 和配置文件中的所有其他内容。问题是我从来没有得到任何错误。会话和加密库在自动加载配置文件中。在我的模型中,我使用以下代码将数据放入会话中:
$this->session->set_userdata(array(
'email' => $email,
'is_logged_in' => 1)
);
但是当我尝试使用时:
var_dump($this->session->userdata());
我得到以下输出:
array(1) { ["__ci_last_regenerate"]=> int(1448664996) }
会话中未添加任何内容,未显示任何错误。有人可以帮忙吗?
编辑:
config.php
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'mydomain';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
autoload.php
$autoload['libraries'] = array('database', 'email', 'encryption', 'session');
我已按照文档显示的所有说明进行操作。
编辑 2:
控制器:
public function login_into_site()
{
if($this->input->post('viaAjax') == 1)
{
$this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email|callback_validate_credentials');
$this->form_validation->set_rules('password', 'Password', 'required|md5|trim');
$user_url = base64_decode($this->input->post('rand'));
if ($this->form_validation->run())
{
$sulo = array();
$sulo['res'] = '1';
$sulo['address'] = $user_url;
echo json_encode($sulo);
}
else
{
$formError = array();
$formError['email'] = form_error('email');
$formError['password'] = form_error('password');
echo json_encode($formError);
}
}
else
{
echo json_encode("fail");
}
}
public function validate_credentials()
{
$this->load->model('user/model_user_auth');
$this->model_user_auth->can_log_in($message);
if($message == 1)
{
return true;
}
else if($message == 2)
{
$this->form_validation->set_message('validate_credentials','not activated');
return false;
}
else
{
$this->form_validation->set_message('validate_credentials','bad username or password');
return false;
}
}
型号:
public function can_log_in(&$message)
{
$email = $this->input->post('email');
$this->db->where('email',$email);
$this->db->where('password',md5($this->input->post('password')));
$query = $this->db->get('users');
$message = '';
if($query->num_rows() == 1)
{
$this->session->set_userdata(array(
'email' => $email,
'is_logged_in' => 1)
);
foreach ($query->result() as $row)
{
$activated = $row->activate;
$membership = $row->membership;
}
if($activated == NULL && $membership == 'a')
{
$message = 1; //success
}
else if($activated != NULL && $membership == 'a')
{
$message = 2; //not activated
}
else
{
$message = 3; // user exist but info wrong
}
}
else
{
$message = 0; // user does not exist
}
}
模型生成 $message = 1;
,因为我在控制器回调函数和控制器函数中得到 return 作为 "TRUE",该函数使用户继续进行,没有任何错误
已解决。问题是我的 cookie 覆盖了数据库会话。在配置文件中,如果会话使用数据库,此行不能有值"=12=]
$config['sess_cookie_name'] = 'mydomain';
为了使会话能够使用数据库工作,该值必须为空:
$config['sess_cookie_name'] = '';
如果它不为空,CI 将默认为您的会话使用 cookie。这并不意味着您不能使用 cookie。您只需通过帮助程序加载它们,它们就可以正常工作。
我在 CI 的 2.x 版本中工作正常。我曾经使用默认 CI 会话选项(我相信是浏览器)来保存它们,但我现在决定使用数据库。我已经设置 table 和配置文件中的所有其他内容。问题是我从来没有得到任何错误。会话和加密库在自动加载配置文件中。在我的模型中,我使用以下代码将数据放入会话中:
$this->session->set_userdata(array(
'email' => $email,
'is_logged_in' => 1)
);
但是当我尝试使用时:
var_dump($this->session->userdata());
我得到以下输出:
array(1) { ["__ci_last_regenerate"]=> int(1448664996) }
会话中未添加任何内容,未显示任何错误。有人可以帮忙吗?
编辑:
config.php
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'mydomain';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
autoload.php
$autoload['libraries'] = array('database', 'email', 'encryption', 'session');
我已按照文档显示的所有说明进行操作。
编辑 2:
控制器:
public function login_into_site()
{
if($this->input->post('viaAjax') == 1)
{
$this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email|callback_validate_credentials');
$this->form_validation->set_rules('password', 'Password', 'required|md5|trim');
$user_url = base64_decode($this->input->post('rand'));
if ($this->form_validation->run())
{
$sulo = array();
$sulo['res'] = '1';
$sulo['address'] = $user_url;
echo json_encode($sulo);
}
else
{
$formError = array();
$formError['email'] = form_error('email');
$formError['password'] = form_error('password');
echo json_encode($formError);
}
}
else
{
echo json_encode("fail");
}
}
public function validate_credentials()
{
$this->load->model('user/model_user_auth');
$this->model_user_auth->can_log_in($message);
if($message == 1)
{
return true;
}
else if($message == 2)
{
$this->form_validation->set_message('validate_credentials','not activated');
return false;
}
else
{
$this->form_validation->set_message('validate_credentials','bad username or password');
return false;
}
}
型号:
public function can_log_in(&$message)
{
$email = $this->input->post('email');
$this->db->where('email',$email);
$this->db->where('password',md5($this->input->post('password')));
$query = $this->db->get('users');
$message = '';
if($query->num_rows() == 1)
{
$this->session->set_userdata(array(
'email' => $email,
'is_logged_in' => 1)
);
foreach ($query->result() as $row)
{
$activated = $row->activate;
$membership = $row->membership;
}
if($activated == NULL && $membership == 'a')
{
$message = 1; //success
}
else if($activated != NULL && $membership == 'a')
{
$message = 2; //not activated
}
else
{
$message = 3; // user exist but info wrong
}
}
else
{
$message = 0; // user does not exist
}
}
模型生成 $message = 1;
,因为我在控制器回调函数和控制器函数中得到 return 作为 "TRUE",该函数使用户继续进行,没有任何错误
已解决。问题是我的 cookie 覆盖了数据库会话。在配置文件中,如果会话使用数据库,此行不能有值"=12=]
$config['sess_cookie_name'] = 'mydomain';
为了使会话能够使用数据库工作,该值必须为空:
$config['sess_cookie_name'] = '';
如果它不为空,CI 将默认为您的会话使用 cookie。这并不意味着您不能使用 cookie。您只需通过帮助程序加载它们,它们就可以正常工作。