Хорошая ли реализация проверки ввода полей?

Я только учусь и для проверки ввода данных в полях логин, пароль и почта написал вот такой код
if (empty($login)) { $msg_err = "1"; } else { $msg_err = ""; }
if (empty($password)) { $msg_err = $msg_err."2"; } else { $msg_err = $msg_err.""; }	
if (empty($email)) { $msg_err = $msg_err."3"; } else { $msg_err = $msg_err.""; }		
header( 'Refresh: 0; url=/reg.php?msg='.$msg_err);

Всё прекрасно работает, и по коду передаваемого $msg_err вывожу ошибку о том, какие строки были не введены.
У пользователей тостера хотел спросить, как вам этот код в плане выполнения поставленной задачи? Т.к. меня терзают сомнения, что можно сделать и лучше. Жду критики и советов.
  • Вопрос задан
  • 2692 просмотра
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Это очень плохо, привязываться к номерам строк и т.д. У вас есть названия полей, по которым можно потом мэпить ошибки на поля при выводе формы.

В целом же код свою работу выполняет. Единственное что ваша реализация ограничена одним сообением об ошибке. То есть если у вас не заполнено первое и третье поле, будет выведено сообщение только о том что не заполнено третье поле, и пользователю придется еще раз отправлять форму что бы узнать о том, что у него и первое не заполнено.

Советы аля "воспользуйтесь какой нормальной библиотекой для валидации данных, приводите данные к виду объектов" и т.д. думаю вам пока не сильно полезны будут.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Можно было бы исполнить и так:
if (!empty($login)) {
	$msg_err = null; 
	if (!empty($password)) {
		$msg_err = null; 
			if (empty($email)) {$msg_err = "3";} 
			} else {$msg_err = "2"; } 
	} else {$msg_err = "1"; } 
header( 'Refresh: 0; url=/reg.php?msg='.$msg_err);
}
Ответ написан
zenaku
@zenaku
Сделал бы так:
if  (isset($login,$password,$email)  {
   heder('location: /reg.php'); exit;
} else {
   echo 'Вы не заполнили все поля'; // иди же heder('location: /reg.php?msg_err=1'); exit;
}

Или
if ($login && $password && $email) {
   heder('location: /reg.php'); exit;
}
...
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
Я рекомендую пользоваться "формами", как например здесь https://github.com/kryoz/sociochat/blob/master/src... , хотя реализация достаточно примитивная
try {
   $form = (new Form())
      ->import($request)
      ->addRule(PropertiesDAO::NAME, Rules::namePattern(), $lang->getPhrase('InvalidNameFormat'))
      ->addRule(PropertiesDAO::TIM, Rules::timPattern(), $lang->getPhrase('InvalidTIMFormat'))
      ->addRule(PropertiesDAO::SEX, Rules::sexPattern(), $lang->getPhrase('InvalidSexFormat'));
} catch (WrongRuleNameException $e) {
   $this->errorResponse($user, ['property' => $lang->getPhrase('InvalidProperty')]);
   return;
}


Такая форма валидации гораздо легче читается и управляется.
Сами правила ничто иное, как анонимные функции, но можно и типовые случае в фабрику запихнуть
https://github.com/kryoz/sociochat/blob/master/src...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы