Формы и обработка данных
25 минЗачем нужны формы?
Пока наш сайт только показывает информацию. Но блог должен быть интерактивным:
- Форма входа / регистрации
- Форма добавления поста
- Форма комментариев
- Форма обратной связи
Формы позволяют пользователю отправить данные на сервер.
Как работают формы?
- Пользователь заполняет форму
- Нажимает кнопку "Отправить"
- Браузер отправляет данные на сервер
- PHP получает данные и обрабатывает их
- Сервер отвечает (показывает результат)
Методы отправки: GET и POST
GET
Данные передаются в URL:
http://localhost:8080/search.php?query=php&page=1
Характеристики:
- Данные видны в адресной строке
- Можно добавить страницу в закладки
- Ограничение по длине (~2000 символов)
- Подходит для: поиска, фильтров, навигации
POST
Данные передаются в теле запроса (не видны в URL):
Характеристики:
- Данные скрыты от пользователя
- Нет ограничения по размеру
- Нельзя сохранить в закладки
- Подходит для: логина, регистрации, отправки форм
Практика: форма обратной связи
Создайте файл 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() преобразует специальные символы в безопасные:
<→<>→>"→"
Добавьте ссылку в меню
Откройте includes/header.php и добавьте ссылку:
<a href="feedback.php">Обратная связь</a>
Проверьте форму
- Откройте
http://localhost:8080/feedback.php - Попробуйте отправить пустую форму — увидите ошибки
- Заполните форму правильно — увидите успех
✅ Создавать HTML-формы
✅ Обрабатывать POST-запросы
✅ Валидировать данные
✅ Защищаться от XSS через htmlspecialchars