flexbe banner 468x60flexbe banner 728x90flexbe banner 930x180kwork banner 468x60kwork banner 728x90kwork banner 930x180smsc banner 468x60smsc banner 728x90smsc banner 930x180

Руководство по валидации форм в PHP

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

beget banner 480x320beget banner 728x90beget banner 120x600flexbe banner 480x320flexbe banner 728x90flexbe banner 120x600smsc banner 480x320smsc banner 728x90smsc banner 120x600

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

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

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

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

Похожие посты

Руководство по загрузке файлов на сервер в PHP

В этом руководстве мы узнаем, как загружать файлы на удаленный сервер с помощью простой HTML-формы и PHP. Вы можете загружать файлы любого типа, например изображения, видео, ZIP-файлы, документы Microsoft Office, PDF-файлы, а также исполняемые файлы и множество других типов файлов. Шаг 1. Создание HTML-формы для загрузки файла В следующем примере будет создана простая HTML-форма, которую…
Подробнее

Руководство по GET и POST запросам в PHP

Веб-браузер связывается с сервером, как правило, с помощью одного из двух HTTP-методов (протокола передачи гипертекста) — GET и POST. Оба метода передают информацию по-разному и имеют разные преимущества и недостатки, как описано ниже. PHP-метод GET В методе GET данные отправляются в виде параметров URL, которые обычно представляют собой строки пар имени и значения, разделенные амперсандами…
Подробнее

Список сообщений об ошибках в PHP

Обычно, когда движок PHP сталкивается с проблемой, препятствующей правильной работе скрипта, он генерирует сообщение об ошибке. Существует шестнадцать различных уровней ошибок, и каждый уровень представлен целым числом и связанной с ним константой. Вот список уровней ошибок: Название Значение Описание E_ERROR 1 Неустранимая ошибка времени выполнения от которой невозможно избавиться. Выполнение скрипта немедленно прекращается E_WARNING 2…
Подробнее