Как мы узнали в предыдущем руководстве, процесс сбора и отображения отправленных данных формы довольно прост. В этом руководстве вы узнаете, как реализовать на своем веб-сайте простую контактную форму, которая позволяет пользователям отправлять свои комментарии и отзывы по электронной почте. Мы будем использовать ту же 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) своим собственным кодом.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 5 / 5. Количество оценок: 1

Оценок пока нет. Поставьте оценку первым.