Как на PHP правильно сделать валидацию поля email в форме?

Всем здравствуйте!
Помогите, пожалуйста, разобраться с корректной валидацией email.
Есть HTML форма (в примере представлена часть формы для email) :
<label>E-mail:</label>
    <input id="input5" type="text" size="25" name="email" value= "<?php echo $email ?>">
    <span class="error">* <?php if(isset($errors['email'])) { echo $errors['email']; }?></span>
    <br><br>


, которая обрабатывается PHP.
// пример обработки поля email. другие поля обрабатываются таким же образом:
... 
if (empty($_POST["email"])) {
    $errors['email'] = "Не заполнено обязательное поле";
  } else {
    $email = test_input($_POST["email"]);
  }
...

Понимаю, что надо использовать FILTER_VALIDATE_EMAIL , но куда именно нужно вписать "образец", по которому будет происходить дальнейшее сравнение внесенных в форму данных?
Есть мысль оформить общий подход к валидации email так:
1 вариант:
Если в данное поле формы было что-то введено if(isset($_POST["email"])), то начинаем осуществлять проверку на корректность вносимых данных, а именно:
использовать if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)).
Если введенные данные корректны (то есть соответствуют изначально заданному шаблону, например $var = "anyword@domain.ru";), то продолжаем работу по другим полям формы.
А Если введенные данные некорректны, то отправляем значение в массив ошибок ($errors) и выводим предупреждение об этом ( $errors['email'] = "Не валидный email";). А если никакие данные не были введены, то "пустое" значение тоже отправляется в этот же массив ошибок ($errors) , для него установлено уже свое сообщение ($errors['email'] = "Не заполнено обязательное поле";).

2 вариант:
Если было отправлено пустое поле email, то присваеваем полученное значение в массив ошибок и выдаем сообщение "Не заполнено обязательное поле" (как это есть в части представленного кода), иначе если поле email было не пустым (какие-то данные все же были введены), то начинаем проверку: Если внесенные данные некорректны (то есть соответствуют изначально заданному шаблону, например $var = "anyword@domain.ru";), значит полученный результат отправлять в массив ошибок с выдачей сообщения "Не валидный email". Иначе (если полученный результат корректен), то продолжаем двигаться по проверке других форм.

Самый главный вопрос:
в каком месте кода необходимо задать этот шаблон/образец ($var = "anyword@domain.ru),по которому будет происходить сравнение введенной почты на ее корректность; чтобы все работало так как нужно, и чтоб этот образец нигде в браузере не всплывал ?

Заранее благодарю за помощь!
  • Вопрос задан
  • 7458 просмотров
Решения вопроса 1
nlynx
@nlynx Автор вопроса
Кому интересно - вот решение:
if (empty($_POST["email"])) {
    $errors['email'] = "Не заполнено обязательное поле";
  } elseif ( filter_var($_POST["email"], FILTER_VALIDATE_EMAIL) === false) { 
    $errors['email'] = "формат почтового ящика неправильный";
  } else {
    $email = test_input($_POST["email"]);
  }

Надо было убрать отрицание перед filter_var($_POST["email"]... и т.д.
И задавать шаблон/ образец, как было в примере w3school, не надо.
Все работает так, как нужно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Acuna
@Acuna
Заполнил свой профиль
А это у Вас, простите-с, что за образец такой? Откуда он и каким образом Вы планируете по нему что-либо проверить? Проверять нужно регуляркой уже при отправке формы. То есть когда юзер нажал кнопку "Отправить" в форме.

$errors = [];
if (!preg_match ('/[\.a-z0-9_\-]+[@][a-z0-9_\-]+([.][a-z0-9_\-]+)+[a-z]{1,4}/i', $_POST['email']))
$errors[] = 'Не валидный email';

if ($errors) {
  
  $content = 'При отправке формы произошли следующие ошибки:<br/><br/>';
  foreach ($errors as $error) $content .= $error.'<br/>';
  echo $content;
  
}

В идеале нужно сабмитить форму на аяксе и выводить сообщение о неверном введеном адресе прямо под полем ввода красиво оформленным без перезагрузки страницы. Но это Вам навыки уже другие нужно иметь.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы