2

データベースに自分のユーザー名または電子メール アドレスが一致する場合に検証エラーが報告されない理由を突き止めようとしています。

これは、正しい投稿パラメーターとして引き続き表示されます。フォーカスを外すと、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;
    }        
}

register.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');
      }
}

検証プラグインのルールは 1 つずつ機能すると思います。次に、最初のコンサルテーションに応じて複数の回答を送信できます。たとえば、最初のユーザー メッセージ: 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 に答える