gpt4 book ai didi

php - 注销时从 ci_sessions 表中删除 session

转载 作者:行者123 更新时间:2023-11-29 17:56:54 28 4
gpt4 key购买 nike

我已经实现了 Codeigniters cart 类,它自动启用 session (我从文档中收集的内容)并将 session 数据存储到数据库中的 ci_sessions 表中。

但是,当我以用户身份注销时, session 仍保留在数据库中。如果重新登录,旧 session 将保留并创建新 session 。它是否正确?登录时,我从来没有真正检查 ci_sessions 表中是否有现有 session ,这是我需要实现的东西还是 codeigniter 自动处理的东西?

这是我用于登录和注销的函数,我取消设置 session 变量,但这本身并不会从数据库中删除 session 。

class User extends CI_Controller {

function __construct() {
parent::__construct(); // Don't forget to call the parent constructor in this method

}

public function dashboard() {
$this->load->view('template/header');
$this->load->view('user/dashboard');
$this->load->view('template/footer');
}

public function index()
{
$this->load->view('template/header');
$this->load->view('landing_page');
$this->load->view('template/footer');
}

public function register() {
$this->load->view('template/header');
$this->load->view('user/register');
$this->load->view('template/footer');
}

public function login() {
$this->load->view('template/header');
$this->load->view('user/login');
$this->load->view('template/footer');
}

public function registerUser() {
//form validation rules
$this->form_validation->set_error_delimiters('<div class="error" style="color: red;">', '</div>');
$this->form_validation->set_rules('first_name', 'First Name', 'required');
$this->form_validation->set_rules('last_name', 'Last Name', 'required');
$this->form_validation->set_rules('dob', 'Date of Birth ', 'required');
$this->form_validation->set_rules('address_1', 'Address One', 'required');
$this->form_validation->set_rules('address_2', 'Address Two', 'required');
$this->form_validation->set_rules('postcode', 'Postcode', 'required');
$this->form_validation->set_rules('city', 'City', 'required');
$this->form_validation->set_rules('county', 'County', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');
$this->form_validation->set_rules('password1', 'Password One', 'required');
$this->form_validation->set_rules('passwordagain', 'Password Confirmation', 'required|matches[password1]');

if($this->form_validation->run() == FALSE) {
//if form validation fails, send user back and display errors
$this->register();
} else {
//prepare data for insert to db
$data = array(
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'date_of_birth' => $this->input->post('dob'),
'address_1' => $this->input->post('address_1'),
'address_2' => $this->input->post('address_2'),
'postcode' => $this->input->post('postcode'),
'city' => $this->input->post('city'),
'county' => $this->input->post('county'),
'email' => $this->input->post('email'),
'password' => $this->hashPassword($this->input->post('password1'))
);

$this->User_model->insertUser($data);
redirect('user/index');
}
}

public function loginUser() {
$this->form_validation->set_error_delimiters('<div class="error" style="color: red;">', '</div>');
$this->form_validation->set_rules('email', 'Email', 'required');
$this->form_validation->set_rules('password', 'password', 'required');

if($this->form_validation->run() == FALSE) {
$this->login();
} else {
$email = $this->input->post('email');
$password = $this->hashPassword($this->input->post('password'));

$user_id = $this->User_model->login($email, $password);

if($user_id) {
$user_data = array(
'user_id' => $user_id,
'email' => $email,
'logged_in' => true
);

$this->session->set_userdata($user_data);

redirect('user/dashboard');
} else {
redirect('user/login');
}
}
}

// Log user out
public function logout(){
// Unset user data
$this->session->unset_userdata('logged_in');
$this->session->unset_userdata('user_id');
$this->session->unset_userdata('email');

// Set message
$this->session->set_flashdata('user_loggedout', 'You are now logged out');
$this->session->sess_destroy();

redirect('user/login');

}

function hashPassword($password) {
return md5($password);
}
}

配置.php

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'applicationcookie';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

在上面添加了我的 config.php。我使用数据库作为 session 驱动程序。

最佳答案

您在登录 Controller 中错误地设置了 session 。这就是 session 仍然存在的原因。

我假设您已在 application/config/autoload.php 下自动加载 session 。

您创建的数组是正确的。

$user_data = array(
'user_id' => $user_id,
'email' => $email,
'logged_in' => true
);

接下来将其设置为 session ,如下所示。

$this->session->set_userdata('login_session',$user_data);//这里你犯了错误。

设置 session 后,将用户重定向到仪表板或主页。

注销用户,请使用以下代码

if($this->session->userdata('login_session'){
$this->session->unset_userdata('login_session');

// Set message
$this->session->set_flashdata('user_loggedout', 'You are now logged out');
redirect('user/login');
}else{
redirect('user/login');
}

现在,每次用户打开您的网站时,都会检查用户的登录 session 是否处于事件状态。

在构造函数下添加此代码。

class Dashboard extends CI_Controller{

public function __construct(){
parent::__construct();
if(!($this->session->userdata('login_session'))){
redirect('user/login','refresh');
}
}

同样,在您的登录 Controller 中,检查登录 session 是否处于事件状态。

class Login extends CI_Controller{
public function __construct() {
parent::__construct();
if($this->session->userdata('login_session')){
redirect('user/dashboard','refresh');
}
}
}

编辑 - 如果您在单个 Controller 中拥有这两种方法,则使用此代码

class User extends CI_Controller{
public function __construct() {
parent::__construct();
if(!$this->session->userdata('login_session')){
redirect('login','refresh');
}
}

public function login(){
$this->load->view('login_view');
}

public function dashboard(){
//since in controller I'm checking the session, you need not have to check it in the dashboard.
$this->load->view('dashboard_view');
}
}

希望这可以帮助你。

关于php - 注销时从 ci_sessions 表中删除 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48730963/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com