CI_Session在登录时创建两个session_id

时间:2012-02-29 09:41:42

标签: php codeigniter session

我正在尝试为朋友初始化代码点火器项目时遇到一个奇怪的问题。

我有一个控制器user,有两个功能:logindashboard

login功能:

function login()
{
    if ($this->user_model->isLoggedIn())
        redirect('user', 'refresh');
    else 
    {
        $this->load->library('form_validation');
        $this->form_validation->set_rules('username', 'Login', 'required');
        $this->form_validation->set_rules('password', 'Password', 'required');
        if (!$this->form_validation->run())
            $this->load->view('login');
        else 
        {
            $username = $this->input->post('username');
            $password = $this->input->post('password');
            $validCredentials = $this->user_model->validCredentials($username, $password);
            if ($validCredentials)
                redirect('user/dashboard', 'refresh');
            else 
            {
                $data['error_credentials'] = 'Wrong Username/Password';
            $this->load->view('login', $data);
            }
        }
    }
}

dashboard函数:

function dashboard()
{
    $data = array();
    $data['test'] = $this->session->all_userdata();
    if($this->user_model->isLoggedIn())
        $this->load->view('dashboard');
    else
        $this->load->view('sashboardnon', $data);
}

在登录视图中,有一个poiting login函数的表单,当我登录时,凭借良好的凭据,我被重定向到sashboardnon视图,这不是我所期待的。 / p>

这是我的user_model.php:

class User_model extends CI_Model
{
    function User_model()
    {
        parent::__construct();
        $this->load->library('session');
    }

    function validCredentials($username, $password)
    {
        $this->load->library('encrypt');
        $password = $this->encrypt->sha1($password);

        $req = "SELECT username, password FROM users WHERE username = ? AND password = ?";
        $data = array($username, $password);
        $req = $this->db->query($req, $data);
        if ($req->num_rows() > 0)
        {
            $res = $req->result();
            $session_data = array(
                'username' => $res[0]->username,
                'logged_in' => TRUE,
            );
            $this->session->set_userdata($session_data);
            return true;
        }
        else
            return false;
    }

    function isLoggedIn()
    {
        if ($this->session->userdata('logged_in'))
            return true;
        else
            return false;
    }

    function logout()
    {
        $this->session->sess_destroy();
    }

}

当我查看数据库中的ci_sessions表时,我看到当我点击登录按钮时有两个新条目。一个是我刚刚从我的user_model添加的userdata,另一个没有它。

问题是,当创建db中的第二个条目时,将删除userdata中的值。所以我无法登录。

有人知道问题可能来自哪里吗?

由于

1 个答案:

答案 0 :(得分:0)

我认为上面的代码非常符合逻辑,你应该纠正它。您必须将逻辑从模型移动到控制器。此外,将会话管理放在Controller中,并尝试仅使用Model与数据库进行交互。

(1)模型

class User_model extends CI_Model {

    function User_model()
    {
        parent::__construct();
    }

    function get($params) 
    {
        if(isset($params)) {

            $this->db->where("username", $params['username']);
            $this->db->where("password", $params['password']);
            $query = $this->db->get(users);

            if ($query->num_rows() > 0) {
               return $query->result();
            }
        }
        return false;  
    }

}

(2)控制器

class Auth extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->model("users_model", "user");
    }

    function isLogdedIn() 
    {
        if ($this->session->userdata('logged_in')) {
            return true;
        }

        return false;
    }

    function login() 
    {
        if ($this->isLoggedIn()) {
            redirect('user', 'refresh');
        }
        else {
            // show login form and put the logic here
        }        
    }



    function logout()
    {
        $this->session->sess_destroy();
    }

    function validateCredentials($username, $password) 
    {
        $params = array('username' => $username, 'password' => $password);
        $result = $this->user->get($params);

        if($result !== false) {
             return true;
        }
        return false;

    {


}

我希望上面的示例可以帮助您改进代码;)