代码点火器:验证不会停止


CodeIgniter: Validation Not Stopping

我很确定我刚刚错过了一些非常明显的东西,但在我看来,我无法弄清楚是什么。 空表单验证工作正常,但是当我在输入框中输入任何随机值并单击登录时,它会显示'This is working fine';,所以我有一种感觉,这与我的回调函数有关。

我正在尝试这样做,以便该人可以使用他们的用户名或密码登录

验证:

'loginUser' => array(
        array(
            'field' => 'userLoginUsername',
            'label' => 'Username',
            'rules' => 'trim|required|xss_clean'
        ),
        array(
            'field' => 'userLoginPassword',
            'label' => 'Password',
            'rules' => 'trim|required|callback__check_login|xss_clean|sha1'
        )
    )// End of login user array

回调:

function _check_login($username, $password)
{
    if($this->users_model->login_check($username,$password))
    {
        $this->form_validation->set_message('_check_login', 'Sorry you have entered an incorrect %s ');
        return FALSE;
    }else{
        return TRUE;
    }
}

控制器:

function login()
    {
        if($this->form_validation->run('loginUser') == FALSE)
        {
            $data['success'] = '';
        }else{
            echo 'This is working fine';
        }
        $data['companyName'] = $this->core_model->companyDetails()->coreCompanyName;
        $data['pageTitle'] = "User Login";
        $this->load->view('frontend/assets/header', $data);
        $this->load->view('frontend/user_login', $data);
        $this->load->view('frontend/assets/footer');
    }   
}

型:

function login_check($username, $password)
    {
        $this->db->select('userName,userEmail,userPassword');
        $this->db->from('users');
            $this->db->where('userName', $username, 'userEmail', $username, 'userPassword' , $password, 'userActive', 1);
        $query = $this->db->get();
        if($query->num_rows() == 1)
        {
            return TRUE;
        }else{
            return FALSE;
        }
    }

视图:

<h1><?php echo $companyName; echo nbs(1);?> - <?php echo $pageTitle; ?></h1>
    <div class="formComments">
        <p class="error"><?php echo validation_errors();?></p>
        <p class="success"><?php echo $this->session->flashdata('success'); ?></p>
        </div>
<div class="user_login">
    <form class="form-inline" method="POST" action="login" >
        <input type="text" name="userLoginUsername" id="userLoginUsername" class="input-small" placeholder="Username">
        <input type="password" name="userLoginPassword" id="userLoginPassword" class="input-small" placeholder="Password">
        <button type="submit" class"btn">Login</button>
        </form>
    </div>
在你的

代码中

如果数据由模型 IE 验证TRUE返回的回调_check_loginreturn FALSE login(),因为

if($this->users_model->login_check($username,$password))
    {
        $this->form_validation->set_message('_check_login', 'Sorry you have entered an incorrect %s ');
        return FALSE;
    }

因此条件

if($this->form_validation->run('loginUser') == FALSE)

将成功,它将设置$data['success'] = '';

对于错误的输入或空的验证模型returns FALSE如此

if($this->users_model->login_check($username,$password))
    {
        $this->form_validation->set_message('_check_login', 'Sorry you have entered an incorrect %s ');
        return FALSE;
    }else{
        return TRUE; /* login check failed control comes here*/
    }

因此

if($this->form_validation->run('loginUser') == FALSE)
    {
        $data['success'] = '';
    }else{
        echo 'This is working fine'; /*control comes here now*/
    }

改变

if($this->users_model->login_check($username,$password))

if(!$this->users_model->login_check($username,$password))

它应该工作

希望这有帮助

编辑__

好吧,刚刚发现您缺少的东西可能会造成问题。 您在规则数组中设置的回调

array(
            'field' => 'userLoginPassword',
            'label' => 'Password',
            'rules' => 'trim|required|callback__check_login['.$_POST['userLoginUsername'].']|xss_clean|sha1'
        )

必须是

array(
            'field' => 'userLoginPassword',
            'label' => 'Password',
            'rules' => 'trim|callback__check_login['.$_POST['userLoginUsername'].']|xss_clean|sha1'
        )

因为回调函数需要 2 个值,而您使用它的方式只向它发送密码字段。 同样与此一起将回调参数重新排列为

function _check_login($password, $username)

所以第一个值是密码,第二个是用户名。 要检查"userActive",请将其从 where 子句中删除,如果查询返回了一些记录,请检查其值

if($query->num_rows() == 1){
    /* check its value if 1 do something as you asked in comment*/

好的,这是很多代码,但我发现了这个:

在您的控制器中,您使用验证规则来检查正确的用户数据;除此之外,我不会这样做,因为正确来说它不是"表单验证"规则,我看到的是,如果您的用户存在并且他的凭据正确,则返回 TRUE。

这很好,但在验证规则中,您有:

if($this->users_model->login_check($username,$password))
    {
        $this->form_validation->set_message('_check_login', 'Sorry you have entered an incorrect %s ');
        return FALSE;

这意味着当模型返回 TRUE(用户正常(时,您的验证返回 FALSE! 这意味着当用户是对的时,您的验证不会成功,而当您的用户"错误"(请参阅您的"随机输入"(时,规则返回 TRUE,使其成功。

我现在没有时间进一步看,但是浏览代码之外一切看起来都不错。因此,只需将该行更改为

if(!$this->users_model->login_check($username,$password))
    {

即"如果模型返回 FALSE,则使规则也返回 FALSE"。希望清楚。

这里看起来像这样一行:

if($this->form_validation->run('loginUser') == FALSE)

你应该删除"loginUser"或弹出一个变量,比如$loginUser,你的数组感觉很有趣。