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


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

Объясню подробнее. Например у Вас на форме расположено 4 поля: имя, майл, тема и текст сообщения. Так вот каждое из этих полей является обязательным для заполнения. Не заполнили поле "майл" - извольте заполнить, ну а Вы - как разработчик сайта обязаны ненавязчиво ткнуть пальцем пользователю в то место, где он облажался.. сорри, где он недописал свои данные..

Большинство готовых форм, которые я видел не предоставляют такой возможности. Например, я заполняю 1 поле из 4х обязательных, пусть это будет поле "имя", а мне выдают сообщение что я не заполнил поле "сообщение"! А как же остальные два? Идём дальше - я заполняю поле "сообщение", нажимаю на кнопку отправить, а мне показывают ошибку о том, что я не заполнил поле "тема".. и так далее.. В общем, на мой взгляд, лучше пользователю сообщить об его ошибках сразу.. Что мы и будем делать..

Сразу же упомяну о том, что за основу взят скрипт хозяина сайта webmasterschool.ru. Сайт советую!

Ну так вот.. Для начала, нам нужно создать 4 текстовых поля для ввода имени, майла, темы и самого сообщения. Стили, красоту и прочие красивости мы здесь наводить не будем, потому как главное - это "чтоб работало"!

Итак, ниже я выкладываю весь скрипт с комментариями, читаем, копируем, пользуем..

<?php
  session_start(); // открытие сессии - обязатеьлный параметр
  $admin = 'admin@mail.ru'; // майл-адрес, на который будут приходить письма
  if ( isset( $_POST['sendMail'] ) ) {
  $name  = substr( $_POST['name'], 0, 64 );
  $email   = substr( $_POST['email'], 0, 64 );
  $subject = substr( $_POST['subject'], 0, 64 );
  $message = substr( $_POST['message'], 0, 250 );

  // обработка ошибок 
  $error = '';
  if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>';
  if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>';
  if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>';
  if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>';
  if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
  $error = $error.'<li>поле "E-mail" должно соответствовать формату somebody@somewhere.ru</li>';
  if ( !empty( $error ) ) {
  $_SESSION['sendMailForm']['error']   = '<p>При заполнении формы были допущены ошибки:
</p><ul>'.$error.'</ul>'; $_SESSION['sendMailForm']['name'] = $name; $_SESSION['sendMailForm']['email'] = $email; $_SESSION['sendMailForm']['subject'] = $subject; $_SESSION['sendMailForm']['message'] = $message; header( 'Location: '.$_SERVER['PHP_SELF'] );
// перенаправление в корневую страницу если есть ошибки die(); } // формирование письма $body = "АВТОР:\r\n".$name."\r\n\r\n"; $body .= "E-MAIL:\r\n".$email."\r\n\r\n"; $body .= "ТЕМА:\r\n".$subject."\r\n\r\n"; $body .= "СООБЩЕНИЕ:\r\n".$message; $body = quoted_printable_encode( $body ); $theme = '=?windows-1251?B?'.base64_encode('Заполнена форма на сайте').'?='; $headers = "From: ".$_SERVER['SERVER_NAME']." <".$email.">\r\n"; $headers = $headers."Return-path: <".$email.">\r\n"; $headers = $headers."Content-type: text/plain; charset=\"windows-1251\"\r\n"; $headers = $headers."Content-Transfer-Encoding: quoted-printable\r\n\r\n"; if ( mail($admin, $theme, $body, $headers) ) $_SESSION['success'] = true; else $_SESSION['success'] = false; header( 'Location: '.$_SERVER['PHP_SELF'] ); die(); } function quoted_printable_encode ( $string ) { // rule #2, #3 (leaves space and tab characters in tact) $string = preg_replace_callback ( '/[^\x21-\x3C\x3E-\x7E\x09\x20]/', 'quoted_printable_encode_character', $string ); $newline = "=\r\n"; // '=' + CRLF (rule #4) // make sure the splitting of lines does not interfere with escaped characters // (chunk_split fails here) $string = preg_replace ( '/(.{73}[^=]{0,3})/', '$1'.$newline, $string); return $string; } function quoted_printable_encode_character ( $matches ) { $character = $matches[0]; return sprintf ( '=%02x', ord ( $character ) ); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Отправить письмо</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> </head> <body> <?php if ( isset( $_SESSION['success'] ) ) { if ( $_SESSION['success'] ) echo '<p>Письмо успешно отправлено</p>'; else echo '<p>Ошибка при отправке письма</p>'; unset( $_SESSION['success'] ); } // если есть ошибки - выводим их if ( isset( $_SESSION['sendMailForm'] ) ) { echo $_SESSION['sendMailForm']['error']; $name = htmlspecialchars ( $_SESSION['sendMailForm']['name'] ); $email = htmlspecialchars ( $_SESSION['sendMailForm']['email'] ); $subject = htmlspecialchars ( $_SESSION['sendMailForm']['subject'] ); $message = htmlspecialchars ( $_SESSION['sendMailForm']['message'] ); unset( $_SESSION['sendMailForm'] ); } else { $name = ''; $email = ''; $subject = ''; $message = ''; } ?> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST"> <table> <tr><td>Имя:</td>
<td><input type="text" name="name" maxlength="64" value="<?php echo $name ?>" /></td></tr> <tr><td>E-mail:</td>
<td><input type="text" name="email" maxlength="64" value="<?php echo $email ?>" /></td></tr> <tr><td>Тема:</td>
<td><input type="text" name="subject" maxlength="64" value="<?php echo $subject ?>" /></td></tr> <tr><td>Сообщение:</td>
<td><textarea name="message" rows="5" cols="30"><?php echo $message ?></textarea></td></tr> <tr><td>&nbsp;</td>
<td><input type="submit" name="sendMail" value="Отправить" /></td></tr> </table> </form> </body> </html>

Как бы это всё. Что интерсного здесь есть? Данный механизм проверки заполненности полей можно с лёгкостью применить и в других целях. Например, в форме комментирования или ещё где. Живые примеры, реализованные мной лично:
- форма комментирования ниже на этой странице
- форма обратной связи на этом же сайте
Думаю, что примеров хватает. Использовать данный механизм у себя или нет - дело Ваше.

Напоследок архив Вам на закачку. Посмотреть в действии тоже можно!=)

Удачного использования!=)

PS: Оригинал скрипта взят отсюда

Добавлено: 30.09.2009    Просмотров: 6574    Метки: php, обратная связь
Написал(а): Илья, 03.10.2009 в 16:13
Автору на заметку: Серый КОД читать нереально , будет лучше если сделать его как и везде цветным. Спасибо.
Написал(а): Orlenko K.N., 03.10.2009 в 16:52
Здравствуйте, Илья! Спасибо за сообщение. Обязательно прицеплю подсветку синтаксиса, только вот соберусь на поиски оптимального варианта. Тогда уж код будет точно цветным!
Написал(а): Татьяна, 09.11.2009 в 12:08
спасибо. Удобно и просто: скопировала, вставила, поправила e-mail и ВСЕ! - все работает - спасибо!!!!
Написал(а): FofonRed, 21.12.2009 в 22:01
Здравствуйте!Взял за пример вашу форму, спасибо за нее,но вот какая штука при заполнении всех полей и нажатии на кнопку отправить,почему то срабатывает форма авторизации в левой части сайта,которая написана тоже по Вашим урокам!Может используется общая функция ,которая считает что я пытаюсь авторизоваться,а не отправить сообщение!Надеюсь данную мысль изложил доступно!Заранее благодарен за ответ!Может что и посоветуете!
Написал(а): Orlenko K.N., 22.12.2009 в 05:10
FofonRed, здравствуйте!
Я думаю, что стоит перепроверить все переменные, которые отдают обе формы, а именно: name баттонов и полей ввода, имя формы (если его нет - прописать).. Думаю, для начала как-то так..
Написал(а): FofonRed, 28.12.2009 в 10:15
Разобрался!Просто определил имена у форм, т е разные сделал!Теперь все работает!Спасибо!
Написал(а): Orlenko K.N., 28.12.2009 в 10:20
FofonRed, рад, что смог помочь!
Написал(а): musta@mail.ru, 16.01.2010 в 17:51

Скрипт хороший, вот вопрос как сделать, что бы после отправки формы,
когда выходит сообщение что письмо отправлено, через 2 секунды
включилась пере адресация на другую страницу.
Написал(а): Владимир, 18.04.2010 в 18:15
А у меня после отправки чёрное окно на 2 секунды появляется (C/Windows/Systhem32/cmd.exe ) и ничего неприходит. Установлен Версия сервера приложений: TopServer 2.1
Веб-сервер: Apache 2.0.59
PHP: PHP 5.1.6
PERL: PERL 5.6.1
MySQL: MySQL 5.0.18-nt-max
phpMyAdmin: phpMyAdmin 2.6.1
SQLite: SQLite 2.8.17
SQLiteManager: SQLiteManager 1.2.0
и др
Написал(а): Orlenko K.N., 19.04.2010 в 06:45
Владимир, вам на форумы лучше отписаться. К сожалению, по настройке лок.сервера я вам не помогу
Написал(а): Женя, 18.05.2010 в 20:38
Спасибо Большое за скрипт! Очень помог!
Можно вопрос? Я делаю блок отправки комментариев по твоему подобию ) Возникла проблема со смайлами. После добавления коммента смайлы отображаются в виде символов, а мне нужно графическое, как у тебя. Как быть?
Написал(а): Tesh, 21.05.2010 в 21:39
В процессе создания своего сайта нашла более интересный, а главное бесплатный, сервис: http://www.mytaskhelper.ru/. С его помощью можно легко создать любую форму (в том числе и динамическую), настроить её внешний вид и встроить на сайт. Огромным преимуществом является то, что совершенно не нужны знания HTML, php и других языков программирования!
Написал(а): Orlenko K.N., 23.05.2010 в 09:29
Tesh, сервис не пробовал, но как вариант, наверное, можно попробовать если времени нету или если не в теме или если не хочется заморачиваться..
Написал(а): Борис, 28.05.2010 в 01:32
Здравствуйте! Каким образом можно этот скрипт приспособить для отправки данных из формы в базу mysql? Спасибо.
Написал(а): Orlenko K.N., 28.05.2010 в 08:45
Борис, всё просто, в обработчике сделайте insert в базу всех полей формы и всё. Таблицу только сначала создайте..
Написал(а): Борис, 29.05.2010 в 23:50
Спасибо за ответ! Вставил insert в базу в код вместо формирования письма - работает, но получаются следующие 2 момента:

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

2.Когда все правильно - при нажатии кнопки обновления в браузере не пропадает надпись перед формой об успешном отправлении данных .Это особенность скрипта, моя ошибка или еще что-нибудь?Спасибо.
Написал(а): Вика, 24.01.2012 в 15:17
Подскажите, я расподожила форму внизу сайта и когда например я ввожу все данные и нажимаю кнопку отправить, страница перегружается и нужно курить вниз страницы чтобы увидеть что сообщение отправлено, ну или если одно из полей не заполнено тоже самое.

 
   
 
 

Последняя работа

Торговый дом «Зелёная линия»

Шаблон

HTML шаблон Emplode

Статистика


Сегодня: 19 мая 2012 г.
  Постов на блоге: 147
  Оставлено комментариев: 935
  Шаблонов в базе: 223
  Выполнено работ: 40
Все комментарии
Загрузка: 0.017

Яндекс.Метрика