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