Reputation: 35
I have a registration form. Here I'm able to check duplicate email by my custom is unique call back function (Don't try to use is_unique). But it doesn't returns anything. Here is my code.
Controller -
public function add_member () {
$this->load->library('form_validation');
$post_email = $this->input->post('email_id');
$this->form_validation->set_rules('email_id', 'Email ID/ Username', 'required|trim|xss_clean|valid_email|callback_check_duplicate_email[' . $post_email . ']');
$this->form_validation->set_rules('password', 'Your password', 'required|min_length[5]|max_length[12]|matches[confirm_password');
$this->form_validation->set_rules('confirm_password', 'Password Confirmation', 'required');
$this->form_validation->set_message('check_duplicate_email', 'This email is already exist. Please write a new email.');
if ($this->form_validation->run() == FALSE) {
// validation failed then do that
$this->load->view('member/reg_form');
} else {
$data['email_id'] = $post_email;
$data['password'] = MD5($this->input->post('password'));
$insert = $this->Model_member->insert_data_to_db($data);
if ($insert) {
$success = "Wao ! You are successfully added to our community.";
$this->session->set_flashdata('message_success', $success);
$this->load->view('member/success_page');
} else {
$error = "Hey this email is already exists in our community.";
$this->session->set_flashdata('message_error', $error);
$this->load->view('member/reg_form');
}
}
}
// My callback function
public function check_duplicate_email($post_email) {
return $this->Model_member->checkDuplicateEmail($post_email);
}
Model -
//for checking email existance
public function checkDuplicateEmail($post_email) {
$this->db->where('email_id', $email_id);
$query = $this->db->get('my_registration_table');
$count_row = $query->num_rows();
if ($count_row > 0) {
return TRUE;
} else {
return FALSE;
}
}
// insert data to DB
public function insert_data_to_db($data) {
return $this->db->insert('my_registration_table', $data);
}
When I try to submit form with email which is already exists. This function doesn't stop me and doesn't show the validation error message. Would anyone here to see what's the problem? Waiting for your help.
Upvotes: 3
Views: 22710
Reputation: 6454
The answer you have marked as correct is correct however you will encounter a logical error eventually.
You're passing in the email id that you saved in $post_email, but codeigniter allows you to pass in the variable that is being trimmed, cleaned, etc.
So since you're saving a copy of the post data as is, if there are spaces or other things that should be trimmed that are not, but the trimmed version is a match, it won't match.
In other words: " [email protected] " might not match "[email protected]" passing your validation and then storing 2 copies of "[email protected]".
$this->form_validation->set_rules('email_id', 'Email ID/ Username', 'required|trim|xss_clean|valid_email|callback_check_duplicate_email[email_id]');
Upvotes: 1
Reputation: 96
Your problem is in the model function. Look at the following model function.
public function checkDuplicateEmail($post_email) {
$this->db->where('email_id', $email_id);
$query = $this->db->get('my_registration_table');
$count_row = $query->num_rows();
if ($count_row > 0) {
//if count row return any row; that means you have already this email address in the database. so you must set false in this sense.
return FALSE; // here I change TRUE to false.
} else {
// doesn't return any row means database doesn't have this email
return TRUE; // And here false to TRUE
}
}
Try this. Hope works.
Upvotes: 8
Reputation: 630
Call the right method in your model, as you defined in your controller.And your variable name should be same as argument passed in your function.I think it works.
Model:
public function insert_data_to_db($post_email) {
$this->db->where('email_id', $post_email);
$query = $this->db->get('my_registration_table');
$count_row = $query->num_rows();
if ($count_row > 0) {
return TRUE;
} else {
return FALSE;
}
}
Upvotes: 1
Reputation: 169
That function should be in controller, not in the model, if I'm not mistaken.
Upvotes: 0