Часть вашей проблемы заключается в том, что при любой неудачной проверке вы используете перенаправление. В качестве альтернативы вы можете отобразить сообщение об ошибке для пользователя: предложить им исправить свои данные, вернувшись назад на страницу (браузер вернется).
Когда формы становятся длиннее, пользователям нужно держать руку с исправлением ошибок. Их ошибки должны быть четко указаны вместе с сообщением о том, как они могут это исправить.
Избегая использования метода «браузера назад» выше, обычно отправка формы по собственному URL. Я включил пример ниже.
Сделав это, вы можете заново заполнить форму отправленными значениями после ошибки и добавить отзыв об ошибке. Вы должны быть осторожны, чтобы избежать пользовательского ввода в этой ситуации.
Я добавил общее уведомление об ошибке c. Что не очень помогает в его нынешнем виде. Вы можете улучшить это, изменив код проверки, чтобы он возвращал массив уведомлений об ошибках, и используйте его в своей форме для более точной обратной связи. Вы также можете добавить - все поля обязательны для заполнения - текст, чтобы помочь пользователю.
При успешной проверке, это когда перенаправить пользователя на страницу подтверждения. Это может предотвратить повторную отправку формы.
Ваш шаблон регулярного выражения имени в его текущей форме не допускает дефисы и апострофы. Я не изменил это ниже. Имейте это в виду. «Майкл О'Лери» столкнется с ошибкой и, вероятно, не поймет, почему. Вы должны быть осторожны при использовании строгих правил для пользовательского ввода. Также это приведет к отклонению какого-либо юникода.
Вам также необходимо соответствующим образом экранировать пользовательский ввод. Обратите внимание, что вы можете быть удовлетворены тем, что имя и адрес электронной почты после проверки соответствуют определенному шаблону, но при этом следует учитывать необработанный ввод данных пользователем. Текст сообщения передается в необработанном виде после проверки.
<?php
$nome = $_POST['nome'] ?? null;
$email_visitante = $_POST['email'] ?? null;
$mensagem = $_POST['mensagem'] ?? null;
$feedback = null;
if(isset($_POST['submit'])) {
if(validate($nome, $email_visitante, $mensagem) !== false) {
process($nome, $email_visitante, $mensagem);
// Redirect to success/thankyou/confirmation page.
header('location:success.html');
exit;
}
// This is a generic message, could this be more helpful?
$feedback = 'Your form has errors. Please correct them.';
}
form($nome, $email_visitante, $mensagem, $feedback);
function process($nome, $email_visitante, $mensagem) {
// do something with your values.
}
function validate($nome, $email_visitante, $mensagem) {
if(empty($nome)) {
return false;
}
if(empty($email_visitante)){
return false;
}
if(empty($mensagem)){
return false;
}
if (!preg_match("/^[a-zA-Z ]*$/",$nome)) {
return false;
}
if (!filter_var($email_visitante, FILTER_VALIDATE_EMAIL)) {
return false;
}
return true;
}
function form($nome = null, $email_visitante = null, $mensagem = null, $feedback = null) {
?>
<?= $feedback ?>
<form action='' method='POST' name='emailform'>
<div class='form-group'>
<label for='name'>Your name:</label>
<input type='text' id='name' name='nome' value='<?= htmlspecialchars($nome) ?>'>
</div>
<div class='form-group'>
<label for='email'>Your email address:</label>
<input type='text' id='email' name='email' value='<?= htmlspecialchars($email_visitante) ?>'>
</div>
<div class='form-group'>
<label for='message'>Your message:</label>
<textarea class='form-control' cols='30' rows='10' maxlength='300' id='message' name='mensagem'><?= htmlspecialchars($mensagem) ?></textarea>
</div>
<div class='form-group'>
<input type='submit' name='submit' value='Send message'>
</div>
</form>
<?php
}