Доки

Формы на PHP

Обычным требованием практически на любом сайте является наличие какой-либо формы, будь то форма обратной связи или, например, форма подписки или калькулятор.

Простая форма обратной связи

В этой статье мы создадим PHP-скрипт, который будет посылать электронное письмо при отправке веб-формы пользователем сайта, разберемся как всё работает технически.

Веб-форма состоит из двух частей:

  1. HTML код формы. Приведенный ниже HTML-код отображает стандартную форму в веб-браузере.
  2. PHP-скрипт для работы с отправкой формы. Скрипт получает отправленную форму и посылает электронное письмо.

HTML код для электронной формы:

<form method="post" name="myemailform" action="form-to-email.php">
    Enter Name: <input type="text" name="name">
    Enter Email Address: <input type="text" name="email">
    Enter Message: <textarea name="message"></textarea>
    <input type="submit" value="Send Form">
</form>

Форма содержит следующие поля:

  • имя,
  • адрес электронной почты,
  • сообщение.

Имя и адрес электронной почты — это однострочные поля ввода текста, тогда как «сообщение» — это поле текстовой области (многострочный ввод текста). В форме могут быть разные типы полей ввода.

При нажатии кнопки отправки форма будет отправлена на «form-to-email.php» методом POST.

Доступ к данным отправленной формы в PHP-скрипте

После того, как посетитель вашего сайта отправил форму, браузер отправляет данные для заполнения формы в скрипт, упомянутый в атрибуте action формы.Для текущей формы был указан файл — form-to-email.php.

Так как у нас есть метод отправки формы, упомянутый как POST в форме — method='post', то мы можем получить доступ к данным для отправки формы через массив $_POST[] в PHP скрипте.

Следующий код получает значения, отправленные для полей: имя, электронная почта и сообщение.

<?php
  $name = $_POST['name'];
  $visitor_email = $_POST['email'];
  $message = $_POST['message'];
?>

Мы присваиваем переменным значения из глобального массива $_POST после отправки данных из формы.

Составление сообщения электронной почты

Теперь мы можем использовать указанные выше переменные PHP для составления сообщения электронной почты.

Используем код:

<?php
    $email_from = 'yourname@yourwebsite.com';
    $email_subject = "New Form submission";
    $email_body = "You have received a new message from the user $name.\n". "Here is the message:\n $message".
?>

Адрес >from, тема и тело электронного сообщения составлены в приведенном выше коде. Обратите внимание на то, как составлено тело сообщения с использованием переменных.

Если посетитель сайта Anthony отправит форму, электронное сообщение будет выглядеть следующим образом:

«You have received a new message from the user Anthony. Here is the message: Hi, Thanks for your great site. I love your site. Thanks and Bye. Anthony.»

Мы использовали двойные кавычки, поэтому переменная $name заменяется своим значением, что называется интерполяцией.

Отправка электронного письма

Функция PHP для отправки электронной почты — mail().

mail(to,subject,message,headers)
Официальная документация: mail()

Из документации:

mail ( string $to , string $subject , string $message , array|string $additional_headers = [] , string $additional_params = "" ) : bool

Параметр заголовков (headers) предоставляет дополнительные параметры почты (например, адрес отправителя, копия, скрытая копия и т.д.).

Код для отправки электронного письма:

<?php
  $to = "yourname@yourwebsite.com";
  $headers = "From: $email_from \r\n";
  $headers .= "Reply-To: $visitor_email \r\n";
  mail($to,$email_subject,$email_body,$headers);
 ?>

Обратите внимание, что мы поместили ваш адрес электронной почты в параметр ‘From‘, а адрес электронной почты посетителя — в параметр ‘Reply-To‘. В параметре ‘From‘ должно быть указано происхождение письма. Если вы поместите адрес электронной почты посетителя в параметр ‘From‘, некоторые почтовые серверы могут отклонить сообщение, думая, что вы выдаете себя за кого-то.

Отправка электронного письма более чем одному получателю

Если вы хотите отправить письмо нескольким получателям, то просто добавьте их в переменную $to.

<?php
  $to = "name1@website-name.com, name2@website-name.com,name3@website-name.com";
  mail($to,$email_subject,$email_body,$headers);
?>

Вы также можете использовать параметры CC (копия) и BCC (скрытая копия). Электронные письма CC и BCC добавляются в параметр «заголовки» (headers).

Пример кода:

<?php
$to = "name1@website-name.com, name2@website-name.com,name3@website-name.com";
$headers = "From: $email_from \r\n";
$headers .= "Reply-To: $visitor_email \r\n";
$headers .= "Cc: someone@domain.com \r\n";
$headers .= "Bcc: someoneelse@domain.com \r\n";
mail($to,$email_subject,$email_body,$headers);
?>

Защита формы от инъекций

Спамеры ищут удобные в использовании формы для рассылки спама. Они используют скрипт обработчика форм в качестве «реле». Что они делают, так это отправляют форму с манипулируемыми значениями форм.

Чтобы обезопасить нашу форму от таких атак, мы должны проверить данные отправленной формы.

Все значения, которые идут в параметре ‘headers’ должны быть проверены на наличие \r или \n. Хакеры вставляют эти символы и добавляют свой код, чтобы обмануть функцию.

Вот обновленный код:

<?php
function IsInjected($str)
{
    $injections = array('(\n+)',
           '(\r+)',
           '(\t+)',
           '(%0A+)',
           '(%0D+)',
           '(%08+)',
           '(%09+)'
           );
               
    $inject = join('|', $injections);
    $inject = "/$inject/i";
    
    if(preg_match($inject,$str))
    {
      return true;
    }
    else
    {
      return false;
    }
}

if(IsInjected($visitor_email))
{
    echo "Bad email value!";
    exit;
}
?>

Как правило, любое значение, используемое в заголовке, следует проверять с помощью приведенного выше кода.

Лучше, чтобы полная проверка могла быть выполнена с помощью скрипта проверки формы PHP, но об этом мы поговорим в следующих статьях.

Форма E-mail подписки

Часто при создании сайтов и перед выпуском в релиз нужно сделать страницу на которой пользователь может оставить e-mail и подписаться на новости.

Хочется, чтобы людям, которые заинтересованы в подписке, мы могли отправить электронное письмо, когда сайт будет запущен.

Существует куча больших PHP почтовых систем, но они очень сложны и требуют много времени, а нам нужно работать над другими вещами. Есть простой способ сделать форму e-mail подписки с использованием языка PHP.

На нужной странице мы вставляем такой код формы:

<!-- Форма e-mail подписки -->
<form action="form/form.php" method="post">
    <input name="email" class="email" type="text" placeholder="Введите свой e-mail...">
    <button type="submit" class="btn_email">Отправить</button>
</form>
<!-- End Форма e-mail подписки -->

Отдельно создаем файл form.php, который поместим в папку form:

<?php
$to = "office@site.com";
$from = "no-reply@site.com";

$headers = "From: " . $from . "\r\n";

$subject = "New subscription";
$body = "New user subscription: " . $_POST['email'];


if( filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) )
{ 
    if (mail($to, $subject, $body, $headers, "-f " . $from))
    {
        echo 'Your e-mail (' . $_POST['email'] . ') has been added to our mailing list!';
    }
    else
    {
       echo 'There was a problem with your e-mail (' . $_POST['email'] . ')';   
    }
}
else
{
   echo 'There was a problem with your e-mail (' . $_POST['email'] . ')';   
}

Вышеуказанный скрипт будет посылать вам письмо с информацией о новой подписке, но вы можете расширить его, сделав вставку в базу данных, подтверждение подписки и т.д. Эти моменты мы постепенно будем разбирать в этом руководстве далее.

Кроме того, хорошо бы сделать проверку данных в поле, в которое подписчик вводит электронное письмо, но для быстрой проверки каких-либо гипотез отлично подойдет и этот вариант.

В дальнейшем мы будем разбирать различные формы, созданные с помощью языка программирования PHP — формы подписки, обратной связи, калькуляторы и многое другое. Подписывайтесь на новости.

Сергей Ермилов
Сергей Ермилов
Дизайнер, верстальщик, фронтенд-разработчик, PHP и WordPress энтузиаст, главный редактор сайта
Опубликовано 16 января 2023 в 17:15
Теги: HTML, PHP