Урок 11

Формы и обработка данных

25 мин

Зачем нужны формы?

Пока наш сайт только показывает информацию. Но блог должен быть интерактивным:

  • Форма входа / регистрации
  • Форма добавления поста
  • Форма комментариев
  • Форма обратной связи

Формы позволяют пользователю отправить данные на сервер.

Как работают формы?

  1. Пользователь заполняет форму
  2. Нажимает кнопку "Отправить"
  3. Браузер отправляет данные на сервер
  4. PHP получает данные и обрабатывает их
  5. Сервер отвечает (показывает результат)

Методы отправки: GET и POST

GET

Данные передаются в URL:

http://localhost:8080/search.php?query=php&page=1

Характеристики:

  • Данные видны в адресной строке
  • Можно добавить страницу в закладки
  • Ограничение по длине (~2000 символов)
  • Подходит для: поиска, фильтров, навигации

POST

Данные передаются в теле запроса (не видны в URL):

Характеристики:

  • Данные скрыты от пользователя
  • Нет ограничения по размеру
  • Нельзя сохранить в закладки
  • Подходит для: логина, регистрации, отправки форм
Важно: POST не делает данные "безопасными"! Их всё равно можно перехватить. POST просто не показывает данные в URL. Для настоящей безопасности нужен HTTPS.

Практика: форма обратной связи

Создайте файл public/feedback.php:

<?php
require_once "includes/config.php";
$page_title = "Обратная связь — $site_name";

// Переменные для формы
$name = "";
$email = "";
$message = "";
$errors = [];
$success = false;

// Проверяем, была ли отправлена форма
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    
    // Получаем данные из формы
    $name = trim($_POST["name"] ?? "");
    $email = trim($_POST["email"] ?? "");
    $message = trim($_POST["message"] ?? "");
    
    // Валидация (проверка данных)
    if (empty($name)) {
        $errors[] = "Введите ваше имя";
    }
    
    if (empty($email)) {
        $errors[] = "Введите email";
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "Некорректный формат email";
    }
    
    if (empty($message)) {
        $errors[] = "Введите сообщение";
    } elseif (strlen($message) < 10) {
        $errors[] = "Сообщение слишком короткое (минимум 10 символов)";
    }
    
    // Если ошибок нет — "отправляем" сообщение
    if (empty($errors)) {
        // Здесь будет сохранение в базу или отправка на email
        // Пока просто покажем успех
        $success = true;
        
        // Очищаем форму
        $name = "";
        $email = "";
        $message = "";
    }
}

include "includes/header.php";
?>

<h2>Обратная связь</h2>

<?php if ($success): ?>
    <div style="background: #d4edda; border: 1px solid #c3e6cb; padding: 15px; border-radius: 8px; margin-bottom: 20px;">
        <strong>Спасибо!</strong> Ваше сообщение отправлено.
    </div>
<?php endif; ?>

<?php if (!empty($errors)): ?>
    <div style="background: #f8d7da; border: 1px solid #f5c6cb; padding: 15px; border-radius: 8px; margin-bottom: 20px;">
        <strong>Ошибки:</strong>
        <ul>
            <?php foreach ($errors as $error): ?>
                <li><?= $error ?></li>
            <?php endforeach; ?>
        </ul>
    </div>
<?php endif; ?>

<form method="POST" action="feedback.php" style="max-width: 500px;">
    <div style="margin-bottom: 15px;">
        <label for="name" style="display: block; margin-bottom: 5px; font-weight: bold;">Ваше имя:</label>
        <input 
            type="text" 
            id="name" 
            name="name" 
            value="<?= htmlspecialchars($name) ?>"
            style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px;"
        >
    </div>
    
    <div style="margin-bottom: 15px;">
        <label for="email" style="display: block; margin-bottom: 5px; font-weight: bold;">Email:</label>
        <input 
            type="email" 
            id="email" 
            name="email" 
            value="<?= htmlspecialchars($email) ?>"
            style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px;"
        >
    </div>
    
    <div style="margin-bottom: 15px;">
        <label for="message" style="display: block; margin-bottom: 5px; font-weight: bold;">Сообщение:</label>
        <textarea 
            id="message" 
            name="message" 
            rows="5"
            style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px;"
        ><?= htmlspecialchars($message) ?></textarea>
    </div>
    
    <button 
        type="submit"
        style="background: #F36049; color: white; padding: 12px 30px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px;"
    >
        Отправить
    </button>
</form>

<?php include "includes/footer.php"; ?>

Разбор кода

Проверка метода запроса

if ($_SERVER["REQUEST_METHOD"] === "POST") {

$_SERVER — суперглобальный массив с информацией о сервере и запросе.
REQUEST_METHOD — метод запроса (GET или POST).

Если пользователь просто открыл страницу — метод GET.
Если отправил форму — метод POST.

Получение данных из формы

$name = trim($_POST["name"] ?? "");

$_POST — суперглобальный массив с данными из POST-формы.
trim() — убирает пробелы по краям.
?? "" — если ключа нет в массиве, использовать пустую строку.

Валидация

Всегда проверяйте данные от пользователя!

if (empty($name)) {
    $errors[] = "Введите ваше имя";
}

htmlspecialchars — защита от XSS

value="<?= htmlspecialchars($name) ?>"

htmlspecialchars() преобразует специальные символы в безопасные:

  • <&lt;
  • >&gt;
  • "&quot;
XSS-атака: Если не использовать htmlspecialchars, злоумышленник может ввести в форму JavaScript-код, который выполнится в браузере других пользователей.

Добавьте ссылку в меню

Откройте includes/header.php и добавьте ссылку:

<a href="feedback.php">Обратная связь</a>

Проверьте форму

  1. Откройте http://localhost:8080/feedback.php
  2. Попробуйте отправить пустую форму — увидите ошибки
  3. Заполните форму правильно — увидите успех
Вы научились:
✅ Создавать HTML-формы
✅ Обрабатывать POST-запросы
✅ Валидировать данные
✅ Защищаться от XSS через htmlspecialchars

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