In Codeigniter:
Here is the callback function that I am using for validation:
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;
}
}
Below are the validation rules:
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required|callback_has_match[username]');
Can any one please tell me what I am doing wrong here in calling the callback function, as I am unable to get the value of the username field and it keeps showing 'username' (inside the variable $username in callback) instead?
// CALLBACKS
public function check_user(){
Instead of sending parameters with call back you can always get them with post
Here is your call back
Your code is working as expected. You're basically always calling the callback method has_match with the string username as a parameter. I think that you expect that this translates into:
Therefore, when you access the has_match() method, you would have access to the value of $username. This is however, not the way callback methods work. The parameter that you set in there is a string, which is hardcoded, exactly like you do when you add a rule for min_length[10] - it's not the value of a PHP variable. An easy fix, which I haven't tested but suspect works is to do:
However the code above is not clean, and seems bad design in my opinion.
Now that we've found the problem with the code, I know it's outside the scope of the question, but I would like to point it out - I find it's more of a design issue here. Why do you want to check for the username/password pair inside of a callback to the password field?
Remember, you're validating a form, you shouldn't mix it up with model work. The form doesn't care if the provided username/password combo is correct, it should just look at whether both the fields have been provided correctly, and if so, it should do something about it.
I would adapt your code above to: