HTML / PHP Контактная форма, отправляющая много писем, и сообщение «Подтвердите повторную отправку формы» продолжает появляться

Итак, я работаю над своим сайтом и прихожу к месту, где я добавил контактную форму. У меня он работает, он отправляет электронные письма на почту моего сервера, но я продолжаю получать одно и то же письмо каждый раз, когда перезагружаю сайт, и здесь возникает вторая проблема. Когда я нажимаю кнопку F5, я получаю окно с предупреждением с надписью «Подтвердить повторную отправку формы» «Страница, которую вы ищете, использовала введенную вами информацию. Возврат на эту страницу может привести к повторению любых ваших действий. Хотите ли вы Продолжать?"

Я старался изо всех сил, но не смог это изменить, может ли кто-нибудь объяснить, что не так в моем коде? Спасибо, что ответили мне!

<?php 

// define variables and set to empty values
$name_error = $email_error = "";
$name = $email = $message = $success = "";

//form is submitted with POST method
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $name_error = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
      $name_error = "Only letters and white space allowed"; 
    }
  }

  if (empty($_POST["email"])) {
    $email_error = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
    // check if e-mail address is well-formed
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $email_error = "Invalid email format"; 
    }
  }

  if (empty($_POST["message"])) {
    $message = "";
  } else {
    $message = test_input($_POST["message"]);
  }

  if ($name_error == '' and $email_error == ''){
      $message_body = '';
      unset($_POST['submit']);
      foreach ($_POST as $key => $value){
          $message_body .=  "$key: $value\n";
      }

      $to = '[email protected]';
      $subject = $email;
      if (mail($to, $subject, $message)){
          $success = "Message sent, thank you for contacting us!";
          $name = $email = $message = '';
      }
  }

}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

И HTML:

<form id = "contact" action = "<?= htmlspecialchars($_SERVER[" PHP_SELF "]) ?>" method = "post">
                            <h3>Contact me</h3>
                            <h4>Just send me an email and I will respond as fast as I can!</h4>
                            <fieldset>
                                <input placeholder = "Your name" type = "text" name = "name" value = "<?= $name ?>" tabindex = "1" autofocus>
                                <span class = "error"><?= $name_error ?></span>
                            </fieldset>
                            <fieldset>
                                <input placeholder = "Your Email Address" type = "text" name = "email" value = "<?= $email ?>" tabindex = "2">
                                <span class = "error"><?= $email_error ?></span>
                            </fieldset>

                            <fieldset>
                                <textarea value = "<?= $message ?>" name = "message" tabindex = "3">
                                </textarea>
                            </fieldset>
                            <fieldset>
                                <button name = "submit" type = "submit" id = "contact-submit" data-submit = "...Sending">Submit</button>
                            </fieldset>
                            <div class = "success">
                                <?= $success ?>
                            </div>
                        </form>

перенаправить на новую страницу в конце скрипта, чтобы избежать повторной отправки формы

Felippe Duarte 28.03.2018 21:19

Кстати, вы пытаетесь проверить ввод после отправки формы? Вероятно, вам следует сделать это с помощью JavaScript, а не PHP.

Paulo Hgo 28.03.2018 21:26

@PauloHgo Никогда просто полагается на JavaScript для проверки. Это удобство, который можно легко обойти. Всегда проверяется на стороне сервера, даже если у вас уже есть проверка на стороне клиента.

John Conde 28.03.2018 21:27

@PauloHgo Никогда не полагайтесь только на проверку на стороне клиента. Его легко обойти. Если вы собираетесь использовать проверку на стороне клиента, она должна сопровождаться проверкой на стороне сервера также.

Patrick Q 28.03.2018 21:28

Понятно, спасибо, ребята.

Paulo Hgo 28.03.2018 21:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
86
0

Другие вопросы по теме