2

我试图弄清楚为什么当我的数据库中与我的用户名或电子邮件地址匹配时它不报告验证错误。

它仍然将此显示为正确的帖子参数。在将焦点移开时,它确实会执行两个不同的发布请求。

注册控制器:

public function is_username_available()
{
    if ($this->users_model->is_username_available($this->input->post('username')))
    {
        return false;
    }
    else
    {
        return true;
    }        
}

public function is_email_available()
{
    if ($this->users_model->is_email_available($this->input->post('email_address')))
    {
        return false;
    }
    else
    {
        return true;
    }        
}

注册.js

rules: {
        username: {
            minlength: 6,
            maxlength: 12,
            remote: {
                type: 'post',
                url: 'register/is_username_available',
                data: {
                    'username': function() { return $('#username').val(); }
                },
                dataType: 'json'
            }
        },
        email_address: {
            email: true,
            remote: {
                type: 'post',
                url: 'register/is_email_available',
                data: {
                    'email_address': function() { return $("#email_address").val(); }
                },
                dataType: 'json'
            }
        }     

用户型号:

/**
 * Check if username available for registering
 *
 * @param   string
 * @return  bool
 */
function is_username_available($username)
{
    $this->db->select('username', FALSE);
    $this->db->where('LOWER(username)=', strtolower($username));

    $query = $this->db->get($this->users_table);
    echo $this->db->last_query();
    return $query->num_rows() == 0;
}

/**
 * Check if email available for registering
 *
 * @param   string
 * @return  bool
 */
function is_email_available($email)
{
    $this->db->select('email', FALSE);
    $this->db->where('LOWER(email)=', strtolower($email));

    $query = $this->db->get($this->users_table);
    return $query->num_rows() == 0;
}
4

1 回答 1

2

我认为 ajax 在服务器端不接受 TRUE 或 FALSE,你应该发送一个字符串告诉 ajax 你必须这样做。例如:

在模型中:

function is_username_available($username)
{
    $this->db->select('username', FALSE);
    $this->db->where('LOWER(username)=', strtolower($username));

    $query = $this->db->get($this->users_table);

    if($query->num_rows() > 0)
    {
      // no available
      return FALSE;
    }
    else
    {
      // available
      return TRUE;
    }
}

在控制器中:

public function is_username_available()
{
    if (!$this->users_model->is_username_available($this->input->post('username')))
    {
        // no available
        exit('n');
    }
    else
    {
        // available
        exit('y');
    }        
}

在您的库 jquery 中找到一个事件“成功”,并询问如下内容:

success: function(data){ 

      if(data == 'y')
      {
        alert('available');
      }
      else
      {
        alert('no available');
      }
}

我认为验证插件的规则是一一起作用的。然后您可以根据第一次咨询发送多个答案,例如,第一条用户消息:exit ('user_y') exit ('user_n') 和电子邮件:exit ('email_y') exit ('email_n' )

并在插件的“成功”处使用如下开关:

success: function(data){ 

      switch(data)
      {
        case 'user_y':
              alert('user_msg_yes');
        break;
        case 'user_n':
              alert('user_msg_no');
        break;
        case 'email_y':
              alert('email_msg_yes');
        break;
        case 'email_n':
              alert('email_msg_no');
        break;
      }
}
于 2012-06-13T16:31:34.097 回答