在Codeigniter中:
以下是我用于验证的回调函数:
public function has_match($password, $username){
if (0) {
// user exists
return true;
}
else {
$this->form_validation->set_message('has_match', 'Invalid Username/password entered ' . $password . ' ' . $username);
return false;
}
}
以下是验证规则:
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required|callback_has_match[username]');
任何人都可以告诉我在调用回调函数时我做错了什么,因为我无法获取用户名字段的值并且它一直显示'username'(在回调中的变量$ username内) ?
答案 0 :(得分:7)
您的代码按预期工作。您基本上总是使用字符串 用户名作为参数调用回调方法has_match。我认为你希望这可以转化为:
callback_has_match[$username]
因此,当您访问has_match()方法时,您可以访问 $ username 的值。然而,这不是回调方法的工作方式。您在其中设置的参数是一个字符串,它是硬编码的,就像您为min_length [10]添加规则时一样 - 它不是PHP变量的值。一个简单的修复,我没有测试,但怀疑工作是:
$this->form_validation->set_rules('password', 'Password', 'required|callback_has_match[' . $username . ']');
然而,上面的代码并不干净,在我看来似乎设计不好。
现在我们已经发现了代码的问题,我知道它超出了问题的范围,但我想指出它 - 我发现这更像是一个设计问题。为什么要在密码字段的回调中检查用户名/密码对?
请记住,您正在验证表单,不应将其与模型工作混淆。表单并不关心提供的用户名/密码组合是否正确,它应该只看两个字段是否都已正确提供,如果是,它应该对它做一些事情。
我会将您的代码调整为:
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required|callback_has_match[username]');
if ($this->form_validation->run() != FALSE) {
$validLogin = $this->muser->checkLogin($username, $password);
if ($validLogin) {
//Username/password combo exists in DB, save in session or whatever.
} else {
//Username/password combo does not exist in DB, show an error.
}
} else {
//Code for when form fields have not been provided correctly.
}
答案 1 :(得分:1)
不是通过回调发送参数,而是始终通过帖子
获取它们这是你的回电
public function has_match(){
if (0) {
// user exists
return true;
}
else {
$password = $this->input->post('password');
$username = $this->input->post('username');
$this->form_validation->set_message('has_match', 'Invalid Username/password entered ' . $password . ' ' . $username);
return false;
}
}
答案 2 :(得分:0)
// CALLBACKS
public function check_user(){
$result = FALSE;
$username=$this->input->post('username');
$email=$this->input->post('emailad');
$dbmember=$this->members->get_members();
foreach ( $dbmember as $key){
// condition of username and email
if($username==$key && $email==$key){
if($username == $key->UserName && $email == $key->EmailAddress){
$this->form_validation->set_message('check_user','already existed!
Please check username and email agian.');
return FALSE;
break;
}
return TRUE;
}
}