【问题标题】:Why whenever i refresh the page, new CI Session is created?为什么每当我刷新页面时,都会创建新的 CI 会话?
【发布时间】:2012-01-19 14:56:51
【问题描述】:

我创建了一个简单的登录系统,并使用 CI Sessions 来保存一些值。
但是 CI 会话没有按预期工作,它没有检索到任何值。
我试图追踪问题,我发现了一些东西:
每当我刷新页面时,都会创建一个新会话!
只有 1 个会话包含我的自定义变量(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!';
        }
    }
}
?>

注意:
这个问题和这个有关

编辑1:
我登录了几次,有时没有错误。
几次刷新/登录后,查看会话数据库:

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 和 Chrome 中测试过。

【问题讨论】:

    标签: php mysql codeigniter session error-handling


    【解决方案1】:

    Aziz 几个月前,我在使用原始 CI 会话库(包括您提到的内容)时遇到了很多麻烦。最后我找到了这个使用native PHP session的替代品。它有效!
    相信我,在一个项目的中间,我并没有停下来想知道为什么。刚刚好。

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

    但是,由于它是一个旧库,您必须进行一些修改。您可以在library's forum 中查看这些简单的技巧

    只需将此文件放在 codeigniter 的库目录中即可。之后让我们谈谈前向兼容性,我是认真的! :)

    【讨论】:

    • 谢谢!它工作正常,但我仍然有一个问题,它没有将它们保存在数据库中,有什么建议吗?
    • 太棒了!关于DB,我不知道。对不起。试着把它作为一个新问题放在 SO 中。干杯...
    【解决方案2】:

    试试这个:

    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. echos 这里只是为了说明流程,您应该将它们更改为视图或重定向或其他东西

    【讨论】:

    • 我试过你的新代码,还是一样的问题。我修改了我的问题,添加了数据库行,并验证了函数代码
    猜你喜欢
    • 2014-01-15
    • 2013-04-01
    • 2017-12-07
    • 1970-01-01
    • 2016-02-03
    • 2014-09-02
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    相关资源
    最近更新 更多