为什么每当我刷新页面时,都会创建新的CI会话?

时间:2011-12-13 18:26:04

标签: php mysql codeigniter session error-handling

我创建了一个简单的登录系统,我使用CI Sessions来保存一些值 但CI会话没有按预期工作,它没有检索到任何价值 我试图追踪问题,我发现了一些事情:
每当我刷新页面时,都会创建一个新会话! 并且只有一个会话保留我的自定义变量(is_loggedusername) 其他会话只保留默认数据  我试着在数据库中举行会议,但问题仍然存在 是我的加密密钥吗?
我只是用了一堆随机字母,因为我不能把它留空 这是我测试过我的会话的控制器 注:
我在这里使用了一些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:
我登录了几次,有时没有错误 几次刷新/登录后,请参阅sesssion数据库:

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;}  

您可能会注意到,某些结果包含用户数据。

我的验证功能:

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&amp;铬。

2 个答案:

答案 0 :(得分:0)

试试这个:

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!';
   }
}

注意:

  1. 您需要加载会话库和site_model;
  2. 设置后无法直接调用会话,因为它仅在后续请求中可用; CI的会话实际上是cookie。
  3. echo这里只是为了说明流程,您应该将它们更改为视图或重定向或其他方式

答案 1 :(得分:0)

Aziz几个月前,我在原始CI会话库中遇到了很多麻烦(包括你提到的内容)。最后,我到达了使用native PHP session的替换者。它有效!
相信我,在一个项目的中间,我没有停下来想知道为什么。只是工作。

这是:Codeigniter's Native session(底部有一个下载链接)

但是,由于它是一个旧图书馆,你必须做一些黑客攻击。您可以在library's forum

中查看这些简单的黑客攻击

将此文件放在codeigniter的库目录中。让我们谈谈前向兼容性,我的意思是! :)