В 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 в обратном вызове)?
Ваш код работает должным образом. В основном вы вызываете метод callback 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. }
Вместо отправки параметров с обратным вызовом вы всегда можете получить их с помощью сообщения
Вот ваш обратный звонок
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; } }
// CALLBACKS
public function 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; } }