Формы на PHP
Обычным требованием практически на любом сайте является наличие какой-либо формы, будь то форма обратной связи или, например, форма подписки или калькулятор.
Простая форма обратной связи
В этой статье мы создадим PHP-скрипт, который будет посылать электронное письмо при отправке веб-формы пользователем сайта, разберемся как всё работает технически.
Веб-форма состоит из двух частей:
- HTML код формы. Приведенный ниже HTML-код отображает стандартную форму в веб-браузере.
- 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 ( 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 — формы подписки, обратной связи, калькуляторы и многое другое. Подписывайтесь на новости.