我创建了一个简单的登录系统,并使用CI Sessions来保存一些值。
但是CI会话没有像预期的那样工作,它没有检索任何值。
我试图跟踪问题,我发现了一些东西:
每当我刷新页面时,就会创建一个新会话!
只有一个会话保存我的自定义变量(is_logged
, username
)。
其他会话只保留默认数据。
我试着在数据库中保存会话,还是同样的问题。
这是我的加密密钥吗?
我只是用了一堆随机的字母,因为我不能让它空着。
这是我测试游戏的控制器。
注意:
我在这里使用了一些echo
,只是为了测试。注2:
我可以检索会话变量只有当我调用它在同一页上。
<?php
class site extends CI_Controller {
function index() {
if (!$this->session->userdata('is_logged')) {
$data['main_content'] = 'site_view';
$this->load->view('template/all_templates', $data);
} else {
echo 'you''re logged already';
}
}
function login() {
if (!$this->session->userdata('is_logged')) {
$username = $this->input->post('username');
$password = $this->input->post('password');
if ($username && $password) {
if ($this->site_model->validate($username, $password)) {
$user_data = array('username' => $username, 'is_logged' => TRUE);
$this->session->set_userdata($user_data);
echo 'you successfully log in.';
redirect('site/index', 'refresh');
} else {
echo 'cannot login';
}
} else {
echo 'username and/or password not set';
}
} else {
echo 'you''re logged in already!';
}
}
}
?>
注意:
这个问题与这个问题有关
Edit1:
我登录了几次,有时没有错误。
几次刷新/登录后,查看会话数据库:
02d6e3521046ffe7df36b07e88624a60 127.0.0.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K 1323803371
66a9cf3d6b7e0521dcc7e5bd3d5d4ad1 127.0.0.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K 1323803380
923a78db029ee3e3ae4bf9e09873fcae 127.0.0.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K 1323803366 a:3:{s:9:"user_data";s:0:"";s:8:"username";s:4:"aziz";s:9:"is_logged";b:1;}
99ac075792b7818aadac60d00ca46947 127.0.0.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K 1323803367
bbe10f3338226c8d83b0ae58d1ca5149 127.0.0.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K 1323803343 a:3:{s:9:"user_data";s:0:"";s:8:"username";s:4:"aziz";s:9:"is_logged";b:1;}
ed6a22ae1d2fd21b6ef66668c2078a11 127.0.0.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K 1323803375
feb5806176dc8a4f7ed8f30763f65f8b 127.0.0.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (K 1323803380 a:3:{s:9:"user_data";s:0:"";s:8:"username";s:4:"aziz";s:9:"is_logged";b:1;}
您可能注意到,有些结果与用户数据有关。
my validate function:
function validate($username, $password) {
$this->db->where('username', $username);
$this->db->where('password', $password);
$query = $this->db->get('users');
if ($query->num_rows() == 1) {
return true;
} else {
return false;
}
}
注意:
我在FF &Chrome .
Aziz几个月前,我在使用原始CI会话库(包括您提到的内容)时遇到了很多麻烦。最后我找到了这个使用native PHP session
的替代品。它的工作原理!
相信我,在项目进行到一半的时候,我没有停下来想过为什么。只是作品。
但是,由于它是一个旧的库,你必须做一些hack。你可以在图书馆的论坛查看这些简单的技巧
只需将该文件放到codeigniter的库目录中。然后我们来谈谈前向兼容性,我是认真的!:)
试试这个:
function index()
{
if(!$this->session->userdata('is_logged'))
{
$data['main_content'] = 'site_view';
$this->load->view('template/all_templates', $data);
}
else
{
echo 'you''re logged already';
}
}
function login()
{
if(!$this->session->userdata('is_logged'))
{
$username = $this->input->post('username');
$password = $this->input->post('password');
if($username && $password)
{
if($this->site_model->validate($username,$password))
{
$user_data = array('username' => $username,'is_logged' => TRUE);
$this->session->set_userdata($userdata);
echo 'you successfully log in.';
//redirect('somewhere','refresh');
}
else
{
echo 'cannot login';
}
}
else
{
echo 'username and/or password not set';
}
}
else
{
echo 'you''re logged in already!';
}
}
注意:
- 你需要加载会话库和site_model;
- 你不能在设置会话后直接调用它,因为它只会在后续请求中可用;实际上,CI的会话是cookie。
-
echo
这里只是为了说明流程,你应该把它们改为视图或重定向或其他东西