0

我有以下代码:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Login extends MY_Controller
{

function __construct()
{
    parent::__construct();
    $this->load->model('users/user_model');
    $this->load->library('form_validation');
}

function _load_login_page()
{
    $this->load->model('sysconfig/sysconfig_model');

    $a = $this->sysconfig_model->get_sysconfig();
    $row = $a[0];

    $this->lang->load('klas',$row->sysconfig_language);

    $data['sys_name'] = $row->sysconfig_system_name;        
    $data['template_name'] = $row->systemplate_name; 
    $data['css_script'] = base_url().'assets/'.$row->systemplate_name;

    if($row->sysconfig_maintenance === 'Y')
    {
        $this->load->view('sysconfig/maintenance',$data);
    } 
    else {

        $this->load->view('login',$data);
    }
}

function index()
{            
    $this->form_validation->set_rules('username', 'Username', 'trim|required|max_length[12]|xss_clean|callback_check_auth');
    $this->form_validation->set_rules('password','Password','trim|required');

    if($this->form_validation->run($this) == FALSE)
    {
       $this->_load_login_page();     
    } else {
        redirect('welcome','refresh');
    }

}

function check_auth()
{
    if($this->user_model->authentication())
    {
        return TRUE;
    }

    $this->form_validation->set_message('check_auth',$this->lang->line('invalid_username'));
    return FALSE;
}
?>

用户模型.php

<?php

class User_Model extends CI_Model
{
function authentication() 
 {
    $this->db->where('useracc_id', $this->input->post('username'));
    $this->db->where('useracc_password', md5($this->input->post('password')));
    $q = $this->db->get('base_useracc');

    if($q->num_rows() == 1)
    {
        $session_data = array('isUserLogged'=>TRUE);

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

        return TRUE;
    } 
 }
?>

从这里我们可以看到如果用户没有填写用户名和密码字段,它将显示错误并且一切都按预期工作。问题是,如果用户提供了无效的用户名或密码,则不会显示错误消息。

对于信息,我已经放入$lang['invalid_username'] = 'Invalid username or password';了语言文件。

我正在使用 HMVC 技术进行此操作。请帮我。

4

2 回答 2

0

来自 HMVC wiki 页面:

使用 MX 进行表单验证时,您需要扩展 CI_Form_validation 类,如下所示,然后将当前控制器作为 $CI 变量分配给 form_validation 库。这将允许您的回调方法正常运行。(这也在 CI 论坛上讨论过)。IE:

<?php
/** application/libraries/MY_Form_validation **/ 
class MY_Form_validation extends CI_Form_validation 
{
    public $CI;
}

<?php
class Xyz extends MX_Controller 
{
    function __construct()
    {
        parent::__construct();

        $this->load->library('form_validation');
        $this->form_validation->CI =& $this;
    }
}
于 2012-04-27T11:26:40.713 回答
0

您似乎没有将任何数据传递给您的回调函数。回调函数期望输入字段的值作为参数传递。我认为您不能将其作为表单验证回调来工作,因为身份验证方法可能需要同时知道密码和用户名。目前,您没有将任何数据传递给您的 check_auth 方法,或者实际上没有传递给您的 user_model->authentication() 方法。这就是为什么 form_validation 忽略它的原因。

与其将 check_auth 作为回调调用,不如先运行 form_validation(这确实是它的用途 - 检查数据是否正确和已清理),然后将表单中的值作为 if 语句的一部分传递给 check_auth 函数。您将无法使用 form_validation set_message 方法来显示错误,但我认为这是一种更简洁的方法。

总而言之,使用 form_validation 检查您收到的数据是否正常,如果不是,则显示相关消息。根据该信息对用户进行身份验证是一个单独的过程,我认为它不属于验证。你看得到差别吗?

于 2012-04-26T10:05:02.777 回答