Форма обратной связи на PHP
Этих форм, на мой взгляд, развелось уже куча целая - на любой вкус так скзть. Всё бы ничего, но меня не устраивает обработка ошибок во многих готовых решениях.
Объясню подробнее. Например у Вас на форме расположено 4 поля: имя, майл, тема и текст сообщения. Так вот каждое из этих полей является обязательным для заполнения. Не заполнили поле "майл" - извольте заполнить, ну а Вы - как разработчик сайта обязаны ненавязчиво ткнуть пальцем пользователю в то место, где он облажался.. сорри, где он недописал свои данные..
Большинство готовых форм, которые я видел не предоставляют такой возможности. Например, я заполняю 1 поле из 4х обязательных, пусть это будет поле "имя", а мне выдают сообщение что я не заполнил поле "сообщение"! А как же остальные два? Идём дальше - я заполняю поле "сообщение", нажимаю на кнопку отправить, а мне показывают ошибку о том, что я не заполнил поле "тема".. и так далее.. В общем, на мой взгляд, лучше пользователю сообщить об его ошибках сразу.. Что мы и будем делать..
Сразу же упомяну о том, что за основу взят скрипт хозяина сайта . Сайт советую!
Ну так вот.. Для начала, нам нужно создать 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> </td>
<td><input type="submit" name="sendMail" value="Отправить" /></td></tr>
</table>
</form>
</body>
</html>
Как бы это всё. Что интерсного здесь есть? Данный механизм проверки заполненности полей можно с лёгкостью применить и в других целях. Например, в форме комментирования или ещё где. Живые примеры, реализованные мной лично:
- форма комментирования ниже на этой странице
- форма обратной связи на этом же сайте
Думаю, что примеров хватает. Использовать данный механизм у себя или нет - дело Ваше.
Напоследок архив Вам на закачку. Посмотреть в действии тоже можно!=)
Удачного использования!=)
PS: Оригинал скрипта взят отсюда
Ещё посты из категории: Программирование


Взял за пример вашу форму, спасибо за нее,но
вот какая штука при заполнении всех полей и нажатии на кнопку
отправить,почему то срабатывает форма авторизации в левой
части сайта,которая написана тоже по Вашим урокам!Может
используется общая функция ,которая считает что я пытаюсь
авторизоваться,а не отправить сообщение!Надеюсь данную
мысль изложил доступно!Заранее благодарен за ответ!Может
что и посоветуете!Я думаю, что стоит перепроверить все переменные, которые отдают обе формы, а именно: name баттонов и полей ввода, имя формы (если его нет - прописать).. Думаю, для начала как-то так..

Разобрался!Просто определил имена у форм, т е разные
сделал!Теперь все работает!Спасибо!
Скрипт хороший, вот вопрос как сделать, что бы после отправки формы,
когда выходит сообщение что письмо отправлено, через 2 секунды
включилась пере адресация на другую страницу.
Веб-сервер: 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
и др

Можно вопрос? Я делаю блок отправки комментариев по твоему подобию ) Возникла проблема со смайлами. После добавления коммента смайлы отображаются в виде символов, а мне нужно графическое, как у тебя. Как быть?

1. у меня форма с выпадающими списками в том числе и, когда ошибки в заполнении в других полях , введенные значения переменных в этих полях со списками не сохраняются .
2.Когда все правильно - при нажатии кнопки обновления в браузере не пропадает надпись перед формой об успешном отправлении данных .Это особенность скрипта, моя ошибка или еще что-нибудь?Спасибо.






914-811




