【问题标题】:CodeIgniter: Validation Not StoppingCodeIgniter:验证未停止
【发布时间】:2012-03-07 03:46:17
【问题描述】:

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

【问题讨论】:

    标签: php validation codeigniter


    【解决方案1】:

    在您的代码中

    如果数据通过模型验证即TRUE返回回调_check_loginreturn FALSElogin()因为

    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*/
    

    【讨论】:

    • 嘿,我试过了,但它似乎没有传递任何登录值,只是给出了 check_login。我还更新了我的问题模型,因为如果帐户处于活动状态,我希望该帐户能够登录。如果它不活跃,我将如何使该帐户错误。那会是使用 if else(value) 吗?
    【解决方案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”。希望清楚。

    【讨论】:

    • 嘿,我试过了,但它似乎没有传递任何登录值,只是给出了 check_login。我还更新了我的问题模型,因为如果帐户处于活动状态,我希望该帐户能够登录。如果它不活跃,我将如何使该帐户错误。那会是使用 if else(value) 吗?
    【解决方案3】:

    这里看起来像这样一行:

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

    您应该删除“loginUser”或弹出一个变量,例如 $loginUser,让您的数组感觉很有趣。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 2023-04-09
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2012-05-21
    相关资源
    最近更新 更多