Сбор и отображение данных формы в PHP скриптах

Раздел: Веб-разработка на PHP -> Обработка форм

Безопасное отображение введенного значения

Как отобразить значение поля ввода после отправки формы без риска XSS?

Наиболее эффективное решение - использование функции htmlspecialchars. При получении данных из суперглобального массива (например, $_POST) значение следует обрабатывать перед выводом в атрибут value. Это предотвращает внедрение вредоносного кода.


    <?
    $name = isset($_POST['name']) ? htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8') : '';
    ?>
    
  

Второй аргумент ENT_QUOTES преобразует как одинарные, так и двойные кавычки. Третий - кодировка UTF-8.

Типичные ошибки: пропуск экранирования приводит к XSS. Например, если пользователь введет <script>alert('xss')</script>, без обработки скрипт выполнится. Решение - всегда применять htmlspecialchars при выводе в HTML.

Вариант 1: Простое получение значения через $_POST

Используется для немедленного отображения введенных данных без сохранения. Применяется, когда форма отправляется на ту же страницу и нужно показать введенное значение.


    $value = $_POST['email'] ?? '';
    echo $value; // без обработки
  

Проблема: отсутствие экранирования делает приложение уязвимым к XSS. Решение - применять обработку перед выводом.

Вариант 2: Проверка существования поля через isset

Позволяет избежать ошибок неопределенного индекса при первом открытии формы. Используется в комбинации с тернарным оператором.


    $name = isset($_POST['name']) ? $_POST['name'] : '';
  

Ошибка: если не проверять, выводится предупреждение Undefined array key. Решение - использовать isset или оператор ??.

Вариант 3: Фильтрация через filter_input

Функция filter_input безопасно получает внешние данные с возможностью фильтрации. Подходит для строгой валидации типов.


    $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT);
    if ($age === false) {
        $age = '';
    }
    echo htmlspecialchars((string)$age);
  

Проблема: если фильтр возвращает false при некорректных данных, нужно явно обрабатывать этот случай. Также требуется приведение к строке для вывода.

Вариант 4: Null coalescing оператор (PHP 7+)

Краткий способ присвоить значение по умолчанию, если ключ не существует. Удобно в современных проектах.


    $email = $_POST['email'] ?? '';
    $safeEmail = htmlspecialchars($email, ENT_QUOTES, 'UTF-8');
  

Ошибка: забывают, что оператор не экранирует данные. Нужно дополнительно применять htmlspecialchars.

Вариант 5: Сохранение в сессии для межстраничной навигации

Если данные формы требуется передать между страницами, они сохраняются в сессионной переменной.


    session_start();
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $_SESSION['form_data'] = $_POST;
    }
    $name = isset($_SESSION['form_data']['name']) ? htmlspecialchars($_SESSION['form_data']['name']) : '';
  

Проблема: необходимость запуска сессии на каждой странице. Очистка сессионных данных после использования.

Расширенные примеры работы с input value

Пример 1: Получение значения из выпадающего списка (select)

Требуется получить выбранную опцию из элемента select и отобразить её.

Пример

    // HTML
    
    // PHP
    $city = isset($_POST['city']) ? $_POST['city'] : '';
    $safeCity = htmlspecialchars($city, ENT_QUOTES, 'UTF-8');
    echo 'Выбран город: ' . $safeCity;
  
    // Если выбрана Москва, вывод: Выбран город: moscow
  

Пример 2: Комплексная фильтрация всех полей формы

Использование filter_var_array для обработки целого массива POST с разными фильтрами.

Пример

    $filters = [
        'username' => FILTER_SANITIZE_STRING,
        'age'      => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 150]],
        'email'    => FILTER_VALIDATE_EMAIL,
        'website'  => FILTER_VALIDATE_URL
    ];
    $validated = filter_var_array($_POST, $filters);
    // В $validated будут либо значения, либо false для невалидных
    $username = htmlspecialchars($validated['username'] ?? '', ENT_QUOTES, 'UTF-8');
    $age = ($validated['age'] !== false) ? $validated['age'] : '';
    $email = htmlspecialchars($validated['email'] ?? '', ENT_QUOTES, 'UTF-8');
    $website = htmlspecialchars($validated['website'] ?? '', ENT_QUOTES, 'UTF-8');
  
    // При вводе username='John', age='25', email='john@test', website='http://example.com'
    // $username='John', $age=25, $email='john@test' (невалидный email вернет false), $website='http://example.com'
  

Пример 3: Сохранение значения в cookie с помощью setcookie

Позволяет запомнить выбор пользователя на длительный срок.

Пример

    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['nickname'])) {
        $nickname = htmlspecialchars($_POST['nickname'], ENT_QUOTES, 'UTF-8');
        setcookie('nickname', $nickname, time() + 3600 * 24 * 30, '/');
        $_COOKIE['nickname'] = $nickname; // для текущего запроса
    }
    $currentNickname = isset($_COOKIE['nickname']) ? $_COOKIE['nickname'] : '';
  
    // После отправки формы с nickname='Alice' cookie установится на 30 дней. При следующем открытии страницы $currentNickname = 'Alice'.
  

Пример 4: Обработка AJAX-запроса и возврат значения в JSON

Когда форма отправляется асинхронно, PHP обрабатывает данные и возвращает JSON с полем value.

Пример

    // client.js: fetch('/process.php', {method:'POST', body: new FormData(form)})
    // server.php
    header('Content-Type: application/json');
    $value = isset($_POST['field']) ? $_POST['field'] : '';
    $safeValue = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
    echo json_encode(['status' => 'ok', 'value' => $safeValue]);
  
    // При отправке field='hello' сервер вернет: {"status":"ok","value":"hello"}
  

значение поля ввода PHP - comments

En
Php input value (php)