CodeIgniter:验证不会停止

时间:2012-03-07 03:46:18

标签: php validation codeigniter

我很确定我错过了一些非常明显的东西,但在我看来,我无法弄清楚是什么。空表单验证工作正常但是当我在输入框中输入任意随机值并单击登录时它会显示'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>

3 个答案:

答案 0 :(得分:2)

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

在您的控制器中,您使用验证规则来检查正确的用户数据;除此之外,我不会这样做,因为正确地说它不是“表单验证”规则,我看到的是,如果您的用户存在并且他的凭据正确,则返回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”。希望很清楚。

答案 1 :(得分:2)

代码

如果数据经过模型验证,则TRUE返回的回调_check_login会因{/ 1}} return FALSE而导致{/ 1>}

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'
        )

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

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

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

function _check_login($password, $username)

答案 2 :(得分:-1)

这一行看起来像这样:

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

你应该删除'loginUser'或弹出一个变量,比如$ loginUser,对你的数组感到好笑。