CI框架本地测试首次登录失败,再次登录正常求助
问题分析与解决方案
看起来你遇到的是首次登录无响应、第二次正常的典型Session初始化问题,我帮你梳理下代码里的几个关键问题:
1. 核心问题:Session库未加载
你的Admin_login控制器构造函数里只加载了模型,但没有加载CodeIgniter的Session库和Form Validation库。虽然Form Validation可能会被自动调用,但Session库必须显式加载(或在自动加载配置中设置)。首次登录时,调用$this->session->set_userdata()或unset_userdata()时,Session还未初始化,会导致流程中断,看起来就是页面无反应;第二次操作时,Session可能已经被隐式初始化,所以能正常工作。
2. 次要问题:不必要的Session操作
在表单验证失败的分支里,你调用了$this->session->unset_userdata('logged_in');——此时用户还未登录,这个Session变量本来就不存在,而且如果Session未加载,这行代码会直接抛出错误,导致页面卡住。
3. 潜在问题:Session存储的用户ID格式错误
你的模型返回的是$result->row()(一个对象),但控制器里直接把整个对象存到user_id里,这会导致Session存储异常,后续校验登录状态时可能出问题。
修复后的代码示例
控制器修改(Admin_login.php)
<?php class Admin_login extends CI_Controller{ public function __construct(){ parent::__construct(); // 必须加载Session和Form Validation库 $this->load->library('session'); $this->load->library('form_validation'); $this->load->model('admin_model','secure_admin_model'); } public function login(){ $this->form_validation->set_rules('username','Username','trim|required'); $this->form_validation->set_rules('password','Password','trim|required'); if($this->form_validation->run()==FALSE){ $this->load->view('admin/layouts/admin_login'); // 移除不必要的Session unset操作 } else{ $username=$this->input->post('username'); $password=$this->input->post('password'); $user=$this->secure_admin_model->login($username,$password); if($user){ // 存储用户ID字段(假设你的admin表主键是id,根据实际调整) $user_data=array( 'user_id'=>$user->id, 'username'=>$username, 'logged_in'=>true ); $this->session->set_userdata($user_data); $this->session->set_flashdata('pass_login','You are logged in'); redirect('admin/dashboard'); } else{ $this->session->set_flashdata('wrong_pass','Wrong Username and password'); redirect('admin/login'); } } } }
额外建议
- 全局自动加载Session:打开
application/config/autoload.php,把Session加入自动加载列表,避免每个控制器都手动加载:$autoload['libraries'] = array('session'); - Dashboard页面的登录校验:确保你的
admin/dashboard控制器有登录状态校验,比如:<?php class Admin extends CI_Controller{ public function __construct(){ parent::__construct(); if(!$this->session->userdata('logged_in')){ redirect('admin/login'); } } public function dashboard(){ $this->load->view('admin/dashboard'); } }
内容的提问来源于stack exchange,提问作者karan loona
相关产品推荐
相关产品推荐

