PHP форма обратной связи: урок для новичков

Этот урок посвящен созданию формы обратной связи с использованием ранее изученных функций PHP. Форма будет обрабатывать данные, проверять их корректность, выводить сообщения об ошибках пользователю и отправлять сообщение администратору.

Создание HTML-формы

HTML-код формы:

<!DOCTYPE html>
<html>
<head>
<title>Обратная связь</title>
</head>
<body>

<h2>Форма обратной связи</h2>

<form action="" method="post">
  <label for="from">От кого:</label><br>
  <input type="text" id="from" name="from" value=""><br>

  <label for="to">Кому:</label><br>
  <input type="text" id="to" name="to" value=""><br>

  <label for="subject">Тема:</label><br>
  <input type="text" id="subject" name="subject" value=""><br>

  <label for="message">Сообщение:</label><br>
  <textarea id="message" name="message" rows="10" cols="20"></textarea><br><br>

  <input type="submit" name="send" value="Отправить">
</form>

</body>
</html>

Использованы атрибуты id и name для элементов формы. Атрибут method="post" указывает на использование метода POST для отправки данных. action="" означает, что обработка формы происходит на той же странице.

Обработка данных формы с помощью PHP

PHP-код для обработки формы:

<?php
if(isset($_POST['send'])) {
  // Выводим массив полученных данных для проверки (удалите в продакшене)
  //print_r($_POST);

  $from = $_POST['from'];
  $to = $_POST['to'];
  $subject = $_POST['subject'];
  $message = $_POST['message'];

  $from = htmlspecialchars($from);
  $to = htmlspecialchars($to);
  $subject = htmlspecialchars($subject);
  $message = htmlspecialchars($message);

  session_start();
  $_SESSION['from'] = $from;
  $_SESSION['to'] = $to;
  $_SESSION['subject'] = $subject;
  $_SESSION['message'] = $message;


  $errorFrom = "";
  $errorTo = "";
  $errorSubject = "";
  $errorMessage = "";

  if (empty($from) || !preg_match("/^[^@]+@[^@]+.[^@]+$/", $from)) {
    $errorFrom = "<span style='color:red;'>Введите корректный email</span>";
  }

  if (empty($to)) {
    $errorTo = "<span style='color:red;'>Введите email получателя</span>";
  }

  if (empty($subject)) {
    $errorSubject = "<span style='color:red;'>Введите тему сообщения</span>";
  }

  if (empty($message)) {
    $errorMessage = "<span style='color:red;'>Введите сообщение</span>";
  }

  if (empty($errorFrom) && empty($errorTo) && empty($errorSubject) && empty($errorMessage)) {
    $subjectEncoded = "=?UTF-8?B?".base64_encode($subject)."?=";
    $headers = "From: " . $from . "r\n" .
               "Reply-to: " . $from . "r\n" .
               "Content-Type: text/plain; charset=UTF-8r\n";
    mail($to, $subjectEncoded, $message, $headers);

    // Перенаправление на страницу успеха
    header("Location: success.php?sent=1");
    exit;
  }
}
?>

В HTML-форме значения из сессии используются в атрибуте value для каждого поля ввода:

<input type="text" id="from" name="from" value="<?php echo isset($_SESSION['from']) ? $_SESSION['from'] : ''; ?>"><br>

Аналогично для остальных полей. Сообщения об ошибках выводятся в форме:

<span><?php echo $errorFrom; ?></span><br>

Аналогично для остальных полей.

Страница успеха (success.php)

Файл success.php:

<?php
session_start();
if(isset($_GET['sent']) && $_GET['sent'] == 1) {
  echo "Вы успешно отправили сообщение на email: " . $_SESSION['to'];
}
?>

Этот файл выводит сообщение об успешной отправке письма.

В этом уроке создана функциональная форма обратной связи, обрабатывающая данные, проверяющая их корректность, выводящая сообщения об ошибках и отправляющая электронное письмо. Использование сессий позволяет сохранять данные пользователя при ошибках, а функция htmlspecialchars() обеспечивает защиту от XSS-атак. Урок обобщает ранее изученные темы, такие как условные операторы, сессии, работа с массивами и отправка писем.

Что будем искать? Например,программа