Сегодня рассмотрим как обрабатывать формы на сайте на примере формы отправки письма.
В итоге у нас получится автоматический скрипт генерации формы и обработки формы с отправкой письма администратору.
С помощью 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 для обратной связи.
Чтобы мы могли получить оставленный пользователем 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>';
На странице форма будет выглядеть вот так. Оформление формы с помощью таблицы (так нагляднее), все практически ровненько и красиво.
при отправке данной формы мы получим следующий $_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 нужные элементы )