Все для создания и продвижения сайтов

Верстка, программирование, SEO

Форма обратной связи php

В данной статье я постараюсь объяснить как создать с 0 форму обратной связи на php с защитой от спам рассылок. И так приступим к написанию кода скрипта.

1. Для начало создадим главный файл index.php и добавим в него простую форму на html:

<!DOCTYPE HTML>
<html lang="ru">
<head>
</head>
<body>
</body> </html>

Давайте разберём, что написано выше, чтобы потом не возникало вопросов.

action="request.php" - файл, на который мы будем пересылать данные из формы

method="POST" - метод передачи "POST" данных в форме





  • input - тег, для ввода данных формы;
  • type="email" - тип поля ввода, нужен для проверки вводимых данных по типу:
    • email - email;
    • text - любой текст;
    • tel - номер телефона\факса;
  • required - атрибут, для обязательного ввода формы, запрещает пустую отправку формы, если данное поле не заполнено;
  • placeholder="message" - атрибут, который вводит текст внутри текстового поля и исчезает при получении фокуса.

2. Теперь создадим файл request.php в одной папке с index.php и добавим в него следующее:

<?php
	$name = $_POST['name']; // получаем имя из формы
	$email = $_POST['email']; // получаем email из формы
	$message = $_POST['message']; // получаем текст из формы
	// оформление текста, который приходит получателю
	$send = "Name: ".$name." Message: ".$message." Phone: ".$phone." email: ".$email;
	
	
	$to= "mymail@mail.com"; // кому отправляем форму
	$from = "no-replay@mail.com"; // от кого отправлена форма
	$subject = "message for your site"; // тема сообщения
	// заголовки, отвечающие за кодировку и тип письма, оставляем без изменений
	$headers = "From: $from\r\nReplay-To: $from\r\nContent-type: text/plain; charset=utf-8\r\n";
	// функция php для отправки email mail(кому отправляем, тема, текст в сообщении, заголовки)
	mail($to, $subject, $send, $headers);

	// В элементе $_SERVER['HTTP_REFERER'] приводится адрес страницы, с которой посетитель пришёл на данную страницу
	$redir = $_SERVER['HTTP_REFERER'];
	
	// условия проверки с пересылкой на страницу с формой с добавление GET параметра,
	// который нужен, чтобы по нему, можно было выводить благодарственный текст
	if (strpos($redir, "mail=1") === false) $redir .= "?mail=1#contact";
	// функция перенаправления, в данном случае на страницу с формой
	header("Location: $redir");
?>

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

Форма обратной связи с защитой от спама

Форма готова, прежде чем идти дальше, проверьте её работоспособность, если все работает, переходим дальше.

Защита формы от спама

Самый простой и оптимальный способ защиты от спама в форме от спам-рассылок - это добавления в форму невидимых полей.

Идея такая: Спам-робот, пытается заполнить все поля(даже если их не видно), естественно пользователь не может их заполнить, так как они для него не существуют и мы этим воспользуемся, добавив простое правило - "если скрытое поле заполнено, то отправка письма отменяется, если не заполнено, то отправляется". И так приступим.

1. Добавим новое поле в нашу форму:


В нём мы убрали все лишние атрибуты, так как они нам не к чему и оставим только тип и имя поля, а так же добавим класс, чтобы через CSS мы его скрыли для пользователя.

2. Добавим правило для CSS в файле стилей:

input.hidden{
   display: none;
}

Или если нет файла стилей, то добавим в index.php между тегом head, следующею запись:

<head>
...

</head>

3. Мы создали поле и скрыли его, теперь нужно добавить условия в файле request.php:

Получим текст из поля спам, для этого добавим строчку, в начале:

$spam = $_POST['spam']; // получим текст из поля спам

И добавим условия, для проверки на спам.

	// условие проверки, если поле spam пустое, то форма обрабатывается, 
	//иначе выходим (для роботов)
	if (empty($spam)){ 
	$to= "mymail@mail.com";
	$from = "no-replay@mail.com";
	$subject = "message for your site";
	$headers = "From: $from\r\nReplay-To: $from\r\nContent-type: text/plain; charset=utf-8\r\n";
	mail($to, $subject, $send, $headers);
	} else exit ;

В результате получим такой request.php:

<?php	
	$spam = $_POST['spam']; // получим текст из поля спам
	$name = $_POST['name']; // получаем имя из формы
	$email = $_POST['email']; // получаем email из формы
	$message = $_POST['message']; // получаем текст из формы
	// оформление текста, который приходит получателю
	$send = "Name: ".$name." Message: ".$message." Phone: ".$phone." email: ".$email;
	
	// условие проверки, если поле spam пустое, то форма обрабатывается, 
	//иначе выходим (для роботов)
	if (empty($spam)){ 
	$to= "mymail@mail.com"; // кому отправляем форму
	$from = "no-replay@mail.com"; // от кого отправлена форма
	$subject = "message for your site"; // тема сообщения
	// заголовки, отвечающие за кодировку и тип письма, оставляем без изменений
	$headers = "From: $from\r\nReplay-To: $from\r\nContent-type: text/plain; charset=utf-8\r\n";
	// функция php для отправки email mail(кому отправляем, тема, текст в сообщении, заголовки)
	mail($to, $subject, $send, $headers);
	} else exit ;

	// В элементе $_SERVER['HTTP_REFERER'] приводится адрес страницы, с которой посетитель пришёл на данную страницу
	$redir = $_SERVER['HTTP_REFERER'];
	
	// условия проверки с пересылкой на страницу с формой с добавление GET параметра,
	// который нужен, чтобы по нему, можно было выводить благодарственный текст
	if (strpos($redir, "mail=1") === false) $redir .= "?mail=1#contact";
	// функция перенаправления, в данном случае на страницу с формой
	header("Location: $redir");
?>

Проверяем и если работает, то у вас через форму теперь не будет проходить спам.

Как бонус, покажу, как выводить благодарственный текст.

Добавление благодарственного текста

1. В файл index.php добавим следующею запись(можно в любом месте):

<?php
	if ($_GET['mail'] == 1) echo "
Thank you for your message
"; ?>

Здесь идёт проверка на Get параметр, который мы выдаём в файле request.php, если форма отправилась и если это произошло, до добавляется данный блок:

Спасибо за сообщение

2. Теперь в стилях сделаем его фиксированным, чтобы не где мешался и его было видно:

#mail-send{
	position: fixed;
	right: 10px;
	top: 10px;
	z-index: 999;
	background-color: #0ACE7F;
	color: #fff;
	border: 0px;
	padding: 10px;
}

3. Отлично, при отправке блок появляется, но остаётся висеть и хочется, чтобы через несколько секунд он пропал, для этого воспользуемся jquery.

Для начала подключим библиотеку между тегами head.


И ниже этой записи добавим следующий скрипт:


Тут довольно все просто, при загрузке страницы блок плавно исчезает с течении 5 секунд.

Если нужно, чтобы форма сохраняла введённые значения в полях формы после отправки, то немного поправим вызов полей:

<input type="text" required="" name="name" placeholder="NAME" value="<?php if(isset($_POST['name'])){echo $_POST['name'];} ?>">
<input type="email" required="" name="email" placeholder="Email adress" value="<?php if(isset($_POST['name'])){echo $_POST['email'];} ?>">
<input type="text" required="" name="message" placeholder="message" value="<?php if(isset($_POST['name'])){echo $_POST['message'];} ?>">

Читайте о создании обратной формы на Ajax и php и обратной связи на modx c защитой от спама.

Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.