CodeIgniter 3.1.5登录查询无法校验用户输入错误求助
帮你搞定CodeIgniter 3.1.5的登录校验问题
嘿,作为CodeIgniter新手碰到这个问题太正常了,我来一步步帮你排查和修复~先看看你的代码里几个关键的调整点:
1. 视图加载顺序错了,导致验证错误没法显示
你现在先加载了login视图,之后才做表单验证——这会导致验证失败时,错误信息根本传不到视图里(因为视图已经提前输出了)。正确的逻辑是先处理表单验证,再根据结果决定加载视图还是处理登录:
class Auth extends CI_Controller { public function __construct() { parent::__construct(); // 提前加载需要的库和助手,避免重复加载 $this->load->library('form_validation'); $this->load->library('session'); $this->load->helper('url'); } public function login() { // 先设置表单验证规则 $this->form_validation->set_rules('username','Username','required'); $this->form_validation->set_rules('password','Password','required|min_length[5]'); if($this->form_validation->run() == true){ // 验证通过,处理登录逻辑 // 用框架自带的输入类,比直接用$_POST更安全,还能自动过滤恶意内容 $username = $this->input->post('username'); $password = $this->input->post('password'); // --- 补上用户校验的核心逻辑 --- // 假设你的用户表名为users,先根据用户名查询用户 $this->db->where('username', $username); $user = $this->db->get('users')->row(); if($user){ // 重点:如果数据库里存的是用password_hash加密的密码,必须用password_verify验证 if(password_verify($password, $user->password)){ // 密码匹配,登录成功——设置会话信息 $this->session->set_userdata([ 'user_id' => $user->id, 'username' => $user->username ]); // 跳转到登录后的页面,比如仪表盘 redirect('dashboard'); } else { // 密码错误,传递错误信息到视图 $data['error'] = '用户名或密码错误'; $this->load->view('login', $data); } } else { // 用户名不存在 $data['error'] = '用户名或密码错误'; $this->load->view('login', $data); } } else { // 验证失败或者首次访问页面,加载登录视图 $this->load->view('login'); } } }
2. 视图里要加上错误信息显示
在你的login.php视图里,记得添加验证错误和自定义登录错误的显示区域,不然用户看不到哪里错了:
<!-- 显示表单验证的错误提示 --> <?php echo validation_errors('<div class="alert alert-error">', '</div>'); ?> <!-- 显示登录失败的自定义错误 --> <?php if(isset($error)): ?> <div class="alert alert-error"><?php echo $error; ?></div> <?php endif; ?> <!-- 你的登录表单 --> <form method="post" action="<?php echo base_url('auth/login'); ?>"> <input type="text" name="username" placeholder="请输入用户名" value="<?php echo set_value('username'); ?>"> <input type="password" name="password" placeholder="请输入密码"> <button type="submit">登录</button> </form>
3. 别忘了配置自动加载数据库
确保你已经在application/config/autoload.php里设置了自动加载数据库库,不然查询会报错:
$autoload['libraries'] = array('database', 'form_validation', 'session'); $autoload['helper'] = array('url');
这样调整后,你的登录校验逻辑应该就能正常工作啦~如果还是有问题,可以检查下数据库里的密码是不是用password_hash()加密存储的(千万别存明文!),或者确认用户名字段的拼写和数据库里一致。
内容的提问来源于stack exchange,提问作者Venkat Naidu
相关产品推荐
相关产品推荐

