Intereting Posts
В чем разница между Switch-Case и If-Else в PHP? Facebook, Attachment Недоступная ошибка при использовании кнопки отправки? Как получить доступ к статическим активам в CodeIgniter? Как мы можем разделить предложение Можно ли это сделать в запросе MySQL, или это нужно сделать в PHP? (серверный) Неверная ошибка символа PHP отсутствует) после списка аргументов в коде формы html JSON для PHP-массива с использованием file_get_contents Как скрыть конкретный URL страницы веб-сайта из поисковых систем? Функции для округления и округления фракций с точностью в PHP, любой лучший способ сделать это? Как использовать паспорт Laravel с пользовательским столбцом имени пользователя Класс вызова PHP в классе возвращает ошибку: 500 Codeigniter, создающий новый сеанс при каждой загрузке страницы Правильно отформатированный оператор даты date MySQL возвращает все 0 Регулярное выражение для проверки того, являются ли два первых слова одинаковыми

Функция обратного вызова в Codeigniter с несколькими параметрами во время проверки формы

В 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; } }