Как мы узнали в предыдущем руководстве, процесс сбора и отображения отправленных данных формы довольно прост. В этом руководстве вы узнаете, как реализовать на своем веб-сайте простую контактную форму, которая позволяет пользователям отправлять свои комментарии и отзывы по электронной почте. Мы будем использовать ту же PHP-функцию mail()
для отправки писем.
Мы также собираемся реализовать некоторые базовые функции безопасности, такие как санитизация и валидация полей, чтобы пользователь не мог вставлять потенциально опасные данные, которые ставят под угрозу безопасность веб-сайта или могут нарушить работу приложения.
Ниже приводится наш универсальный PHP-скрипт, который выполняет следующие функции:
- Он попросит пользователя ввести свой комментарий о веб-сайте.
- Тот же скрипт отображает контактную форму и обрабатывает отправленные данные формы.
- Скрипт очищает и проверяет вводимые пользователем данные. Если какое-либо обязательное поле (отмеченное *) отсутствует или проверка не удалась из-за неправильных данных, скрипт повторно отображает форму с сообщением об ошибке для соответствующего поля формы.
- Скрипт запоминает, какие поля пользователь уже заполнил, и предварительно заполняет эти поля, когда форма повторно отображается из-за ошибки проверки.
- Если данные, представленные пользователем, приемлемы, и все идет хорошо, он отправит электронное письмо администратору веб-сайта и отобразит сообщение об успехе пользователю.
Введите следующий код в файл contact.php
и сохраните его в корневом каталоге проекта:
<?php
// Функции для фильтрации введенных пользовательских данных
function filterName($field){
// Санитизация имени пользователя
$field = filter_var(trim($field), FILTER_SANITIZE_STRING);
// Валидация имени пользователя
if(filter_var($field, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
return $field;
} else{
return FALSE;
}
}
function filterEmail($field){
// Санитизация e-mail
$field = filter_var(trim($field), FILTER_SANITIZE_EMAIL);
// Валидация e-mail
if(filter_var($field, FILTER_VALIDATE_EMAIL)){
return $field;
} else{
return FALSE;
}
}
function filterString($field){
// Санитизация строки
$field = filter_var(trim($field), FILTER_SANITIZE_STRING);
if(!empty($field)){
return $field;
} else{
return FALSE;
}
}
// Определяем переменные и инициализирем с пустыми значениями
$nameErr = $emailErr = $messageErr = "";
$name = $email = $subject = $message = "";
// Обрабатываем данные формы при отправке формы
if($_SERVER["REQUEST_METHOD"] == "POST"){
// Валидация имени пользователя
if(empty($_POST["name"])){
$nameErr = "Пожалуйста, введите ваше имя.";
} else{
$name = filterName($_POST["name"]);
if($name == FALSE){
$nameErr = "Пожалуйста, введите верное имя.";
}
}
// Валидация e-mail
if(empty($_POST["email"])){
$emailErr = "Пожалуйста, введите адрес вашей электронной почты.";
} else{
$email = filterEmail($_POST["email"]);
if($email == FALSE){
$emailErr = "Пожалуйста, введите действительный адрес электронной почты.";
}
}
// Валидация темы сообщения
if(empty($_POST["subject"])){
$subject = "";
} else{
$subject = filterString($_POST["subject"]);
}
// Валидация комментария пользователя
if(empty($_POST["message"])){
$messageErr = "Пожалуйста, введите свой комментарий.";
} else{
$message = filterString($_POST["message"]);
if($message == FALSE){
$messageErr = "Пожалуйста, введите правильный комментарий.";
}
}
// Проверяем ошибки ввода перед отправкой электронной почты
if(empty($nameErr) && empty($emailErr) && empty($messageErr)){
// Электронный адрес получателя
$to = 'webmaster@example.com';
// Создаем заголовки письма
$headers = 'From: '. $email . "\r\n" .
'Reply-To: '. $email . "\r\n" .
'X-Mailer: PHP/' . phpversion();
// Отправляем электронную почту
if(mail($to, $subject, $message, $headers)){
echo '<p class="success">Ваше сообщение было отправлено успешно!</p>';
} else{
echo '<p class="error">Невозможно отправить электронное письмо. Пожалуйста, попробуйте еще раз!</p>';
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Contact Form</title>
<style type="text/css">
.error{ color: red; }
.success{ color: green; }
</style>
</head>
<body>
<h2>Связаться с нами</h2>
<p>Заполните эту форму, чтобы связаться с нами.</p>
<form action="contact.php" method="post">
<p>
<label for="inputName">Имя:<sup>*</sup></label>
<input type="text" name="name" id="inputName" value="<?php echo $name; ?>">
<span class="error"><?php echo $nameErr; ?></span>
</p>
<p>
<label for="inputEmail">Email:<sup>*</sup></label>
<input type="text" name="email" id="inputEmail" value="<?php echo $email; ?>">
<span class="error"><?php echo $emailErr; ?></span>
</p>
<p>
<label for="inputSubject">Тема:</label>
<input type="text" name="subject" id="inputSubject" value="<?php echo $subject; ?>">
</p>
<p>
<label for="inputComment">Сообщение:<sup>*</sup></label>
<textarea name="message" id="inputComment" rows="5" cols="30"><?php echo $message; ?></textarea>
<span class="error"><?php echo $messageErr; ?></span>
</p>
<input type="submit" value="Отправить">
<input type="reset" value="Очистить">
</form>
</body>
</html>
Разберем этот код подробнее.
- Функция
filterName()
(строка №-03) проверяет входное значение емени пользователя. Допустимое имя может содержать только буквы алфавита (a-z, A-Z). - Функция
filterEmail()
(строка №-14) проверяет входное значение адреса электронной почты. - Функция
filterString()
(строка № 25) только очищает входное значение, удаляя HTML-теги и специальные символы. Она не проверяет входящее значение. - Атрибут
action="contact.php"
(строка № 111) внутри тега<form>
указывает, что тот же файлcontact.php
отображает форму, а также обрабатывает данные формы. - Код PHP внутри атрибута value
<input>
и<textarea>
, например.<?php echo $name; ?>
отображает предварительно заполненное значение, когда форма повторно отображается при ошибке проверки. - Код PHP внутри класса
.error
, например.<span class="error"><?php echo $nameErr; ?></span>
отображает ошибку для соответствующего поля.
Чтобы узнать больше о санитизации и валидации, ознакомьтесь со справочником по фильтрам PHP.
Вам необходимо настроить почтовый сервер на вашем компьютере, чтобы PHP-функция mail()
работала. Если вы просто хотите реализовать проверку формы, вы можете заменить часть почты (строки с 81
по 94
) своим собственным кодом.