Перейти к содержимому

Обработка HTML форм на сайте

PHP обработка формы mailСегодня рассмотрим как обрабатывать формы на сайте на примере формы отправки письма.

В итоге у нас получится автоматический скрипт генерации формы и обработки формы с отправкой письма администратору.

С помощью HTML текста формируем необходимую нам форму.

<h2>Запрос на обратную связь</h2>
<form method="POST">
	<input type="text" name="email" value="mail@mail.ru">
	<input type="SUBMIT" name="send" value="Отправить">
	<input type="HIDDEN" name="alform" value="form">
</form>

Этот HTML  текст отобразит нам в браузере форму с помощью которой мы можем предоставить пользователю возможность оставлять данные, в данном случае email для обратной связи.

POST данные формыЧтобы мы могли получить оставленный пользователем email, нам необходимо обратиться к переменной $_POST это переменная которая создается при начале выполнения скрипта PHP и в нее вносятся данные из формы которую мы предоставили пользователю, см. в тэг form там есть атрибут method его значение POST. И в случае нашей формы эта переменная принимает значения (это можно посмотреть с помощью кода echo ‘<pre>’.print_r($_POST,1).'</pre>’;).

Array
(
    [email] => mail@mail.ru
    [send] => Отправить
    [alform] => form
)

Здесь самое важное понять имя элементов массива $_POST это значения атрибутов HTML тэгов <input>, если вы их не укажите тогда в переменной $_POST не будет элементов массива.

При таком не большом количестве элементов формы можно обращаться к значениям полей формы через прямой обращению к элементу массива $_POST

$email = $_POST['email'];

Но если форма большая или мы хотим сделать универсальный обработчик форм, тогда лучше использовать цикл foreach для массива $_POST

$msg = '';
foreach($_POST as $key => $val){
	$msg.=$key.' = '.$val.'<br>';
}

В переменной $msg мы получим данные формы в виде

email = mail@mail.ru<br>
send = Отправить<br>
alform = form<br>

Если мы хотим вместо email, send получать нормальный осмысленный текст в переменной $msg, то нам необходимо создать ассоциативный массив, к примеру

$alform = array('email'=>'Почта клиента','send'=>'','alform'=>'');

и теперь в цикл можно добавить условие

$msg='';
foreach($_POST as $key => $val){
	if($alform[$key]!='') $msg.= $alform[$key].' = '.$val.'<br>';
}

что нам даст в переменной следующий текст

Почта клиента = mail@mail.ru<br>

таким образом лишнее убрали.

Весь код целиком:

<?php
echo '<!DOCTYPE html><html><head><title>Обработка писем</title><meta charset="utf-8"></head><body>';

$alform = array('email'=>'Почта клиента','send'=>'','alform'=>'');
?>
<h2>Запрос на обратную связь</h2>
<form method="POST">
	<input type="text" name="email" value="mail@mail.ru">
	<input type="SUBMIT" name="send" value="Отправить">
	<input type="HIDDEN" name="alform" value="form">
</form>
<?php

//echo '<pre>'.print_r($_POST,1).'</pre>';

if (isset($_POST['alform'])){
	$msg='Получили сообщение с сайта:<br>';
	foreach($_POST as $key => $val){
		if($alform[$key]!='') $msg.= $alform[$key].' = '.$val.'<br>';
	}
}
?>

Дальше переменную $msg можно отправить на почту администратору

	$to      = 'example@example.com';
	$subject = 'Запрос на обратную связь';
	$header = "From: noreply@example.com\r\n"; 
	$header.= "MIME-Version: 1.0\r\n"; 
	$header.= "Content-Type: text/plain; charset=utf-8\r\n"; 
	$header.= "X-Priority: 1\r\n"; 

	mail($to, $subject, $msg, $header);

Также можно сделать автоматическое создание HTML формы. Для этого нам потребуется создать массив и его обработать. Сам массив:

$alform = array(
	'name'=>array('type'=>'text','eml_name'=>'Имя клиента','hlp_name'=>'Введите Ваше имя','sml_name'=>'Ваше имя','obyaz'=>1,'value'=>''),
	'email'=>array('type'=>'text','eml_name'=>'Почтовый адрес клиента','hlp_name'=>'Введите Ваш адрес электронной почты','sml_name'=>'Ваш email','obyaz'=>1,'value'=>''),
	'messa'=>array('type'=>'textarea','eml_name'=>'Сообщение клиента','hlp_name'=>'Введите Ваше сообщение','sml_name'=>'Сообщение','obyaz'=>0,'value'=>''),
	'send'=>array('type'=>'submit','value'=>'Отправить'),
	'alform'=>array('type'=>'hidden','value'=>'form'),
);

здесь учтены многие моменты и placeholderы для полей и обязательные поля.

Цикл который из массива сделает HTML форму следующий

echo '<style>
body{font-size:14px;}
input[type=text]{width:99%;padding:4px;}
textarea{width:99%;padding:4px;height:80px;}
</style>';
echo '<form method="POST">';
echo '<table cellpadding=0 cellspacing=0 width=400 align=center>';
foreach($alform as $key => $val){
	echo '<tr>';
	switch ($val['type']) {
		case 'text':
			echo '<td><b>'.$val['sml_name'].'</b>';
			if($val['obyaz']) echo ' <span style="color:red;">*</span>';
			echo '</td>';
			echo '<td><input type="'.$val['type'].'" name="'.$key.'" value="'.$val['value'].'" placeholder="'.$val['hlp_name'].'"></td>';
		break;
		case 'textarea':
			echo '<td><b>'.$val['sml_name'].'</b>';
			if($val['obyaz']) echo ' <span style="color:red;">*</span>';
			echo '</td>';
			echo '<td><textarea name="'.$key.'" placeholder="'.$val['hlp_name'].'">'.$val['value'].'</textarea></td>';
		break;
		case 'submit':
			echo '<td colspan="2" align="center"><input type="'.$val['type'].'" name="'.$key.'" value="'.$val['value'].'"></td>';
		break;
		case 'hidden':
			echo ' <input type="'.$val['type'].'" name="'.$key.'" value="'.$val['value'].'">';
		break;
	}
	echo '</tr>';
}
echo '</table>';
echo '</form>';

Автоматическая HTML формаНа странице форма будет выглядеть вот так. Оформление формы с помощью таблицы (так нагляднее), все практически ровненько и красиво.

при отправке данной формы мы получим следующий $_POST массив

Array
(
    [name] => Александр
    [email] => mail@mail.ru
    [messa] => Сообщение написанное через форму на сайте
    [send] => Отправить
    [alform] => form
)

Теперь обработаем полученный $_POST массив

if (isset($_POST['alform'])){
	$msg='Получили сообщение с сайта:<br>';
	foreach($_POST as $key => $val){
		if(isset($alform[$key])){										//Проверим есть ли такой элемент у нас в массиве
			if($val!='') 												//проверим заполнил ли клиент поле
				if(isset($alform[$key]['eml_name']))					//проверим есть ли текст для письма, чтобы служебные поля не писались
					$msg.= $alform[$key]['eml_name'].' = '.$val.'<br>';
		}
	}

	$to      = 'example@example.com';
	$subject = 'Запрос на обратную связь';
	$header = "From: noreply@example.com\r\n"; 
	$header.= "MIME-Version: 1.0\r\n"; 
	$header.= "Content-Type: text/plain; charset=utf-8\r\n"; 
	$header.= "X-Priority: 1\r\n"; 

	mail($to, $subject, $msg, $header);
}

Таким образом мы отправили письмо на адрес example@example.com с содержимым

Получили сообщение с сайта:
Имя клиента = Александр
Почтовый адрес клиента = mail@mail.ru
Сообщение клиента = Сообщение написанное через форму на сайте

Вот такой простой скрипт который автоматически формирует форму HTML и обрабатывает ее. Для редактирования формы необходимо добавить в массив $alform нужные элементы )

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.