4

在 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 内)?

4

3 回答 3

8

您的代码按预期工作。您基本上总是使用字符串 用户名作为参数调用回调方法 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.
}
于 2013-10-11T18:54:31.153 回答
1

您可以随时通过 post 获取参数,而不是通过回调发送参数

这是您的回电

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;
    }
}
于 2013-10-12T06:00:32.133 回答
0

// 回调

公共函数 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;

        }  
    }
于 2015-03-02T01:40:15.223 回答