CI_Session создает два session_id при входе в систему - PullRequest
1 голос
/ 29 февраля 2012

Здесь я сталкиваюсь со странной проблемой, пытаясь инициализировать проект воспламенителя кода для друга.

У меня есть контроллер user с двумя функциями: login и dashboard

Функция 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);
}

В представлении входа в систему есть форма, обозначающая функцию login, и когда я вхожу в систему с хорошими учетными данными, я перенаправляюсь в представление sashboardnon, а это не то, чего я ожидаю.

Вот мой 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 в моей базе данных, я вижу, что при нажатии кнопки входа в систему появляются две новые записи. Один с userdata, который я только что добавил из моей user_model, а другой без него.

Проблема в том, что значения в пользовательских данных стираются при создании второй записи в БД. Поэтому я не могу войти.

Кто-нибудь знает, откуда может возникнуть проблема?

Спасибо

1 Ответ

0 голосов
/ 29 февраля 2012

Я думаю, что приведенный выше код является довольно логичным противоречивым, и вы должны его исправить. Вы должны переместить логику из модели в контроллер. Кроме того, поместите управление сессиями в контроллер и попробуйте использовать модель только для взаимодействия с базой данных.

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

    {


}

Надеюсь, приведенный выше пример поможет вам улучшить ваш код;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...