Практические примеры PHP для работы с HTML-формами
HTML-формы основной способ взаимодействия пользователя с сервером. PHP предоставляет инструменты для получения и обработки данных отправленных через форму. В этой статье рассмотрены различные варианты организации этого процесса с примерами кода и пояснениями.
Основные сценарии работы с HTML-формами в PHP
Как защитить форму от CSRF атак и валидировать данные на сервере?
Наиболее распространенный и безопасный подход использование метода POST с токеном CSRF и проверкой ввода. Рассмотрим пошагово.
- Создать HTML форму с атрибутом
method="post". - Генерировать уникальный CSRF токен и сохранить его в сессии.
- В форме добавить скрытое поле с этим токеном.
- При отправке проверять токен на соответствие.
- Валидировать все поля экранировать вывод.
<?php
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['csrf_token'];
?>
<form method="post" action="process.php">
<input type="hidden" name="csrf_token" value="<?= $token ?>">
<label>Имя: <input type="text" name="name" required></label><br>
<label>Email: <input type="email" name="email" required></label><br>
<input type="submit" value="Отправить">
</form>
пример формы php (примеры html-форм с php)
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die('CSRF token validation failed');
}
// Валидация
$name = trim($_POST['name']);
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$name || !$email) {
echo 'Некорректные данные';
} else {
echo 'Данные приняты';
}
}
?>
Request admin php (обработка запроса в админке php)
Типичные проблемы: CSRF токен может быть скомпрометирован при незащищенном соединении. Решение использовать HTTPS. Токены должны быть уникальными и временными. При валидации избегать direct SQL injection через подготовленные запросы.
Как обработать форму методом GET для параметров поиска?
Цель: передача фильтров поисковых запросов где данные не конфиденциальны и могут быть закладками. Случаи: поиск на сайте навигация по страницам.
<form method="get" action="search.php">
<input type="text" name="q" placeholder="Поиск...">
<select name="category">
<option value="all">Все</option>
<option value="books">Книги</option>
</select>
<input type="submit" value="Искать">
</form>
Source query php (источник запроса в php)
<?php
$query = isset($_GET['q']) ? htmlspecialchars($_GET['q']) : '';
$category = $_GET['category'] ?? 'all';
echo "Поиск: $query, категория: $category";
?>
Php post файл (обработка post-запросов с файлами в php)
Проблемы: данные видны в URL ограничение длины около 2048 символов. Нельзя передавать пароли. Решение использовать POST для чувствительных данных.
Как загрузить файл через форму?
Цель: загрузка изображений документов. Используется enctype="multipart/form-data". Обработка через $_FILES.
<form method="post" enctype="multipart/form-data" action="upload.php">
<input type="file" name="avatar" accept="image/*">
<input type="submit" value="Загрузить">
</form>
Php input action (ввод данных в php)
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['avatar'])) {
$file = $_FILES['avatar'];
if ($file['error'] === UPLOAD_ERR_OK) {
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
$newName = uniqid() . '.' . $ext;
move_uploaded_file($file['tmp_name'], 'uploads/' . $newName);
echo 'Файл загружен: ' . $newName;
} else {
echo 'Ошибка загрузки';
}
}
?>
Php request url (url запроса в php)
Ошибки: превышение лимита upload_max_filesize неправильный тип файла. Решение проверять размер ($_FILES['avatar']['size']) и MIME тип через finfo.
Как отправить форму без перезагрузки страницы с Fetch API?
Цель: асинхронная отправка улучшение UX. Используется JavaScript для перехвата события submit и отправки FormData.
<form id="myForm" method="post">
<input type="text" name="message">
<input type="submit" value="Отправить">
</form>
<div id="result"></div>
<script>
document.getElementById('myForm').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
fetch('async_handler.php', {
method: 'POST',
body: formData
})
.then(response => response.text())
.then(data => document.getElementById('result').innerHTML = data);
});
</script>
Request method php (метод http запроса в php)
<?php
// async_handler.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$msg = htmlspecialchars($_POST['message']);
echo 'Получено: ' . $msg;
}
?>
Action php id (действие с параметром id в php)
Проблемы: CORS при запросах на другой домен. Решение настроить заголовки Access-Control-Allow-Origin. Неправильная обработка ошибок статусы 4xx.
Как обработать форму с JSON REST API?
Цель: интеграция с мобильными приложениями или одностраничными приложениями SPA. Сервер принимает JSON и возвращает JSON.
<?php
header('Content-Type: application/json');
$input = json_decode(file_get_contents('php://input'), true);
if (!$input || !isset($input['email'])) {
http_response_code(400);
echo json_encode(['error' => 'Invalid input']);
exit;
}
$email = filter_var($input['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
http_response_code(422);
echo json_encode(['error' => 'Email not valid']);
exit;
}
echo json_encode(['success' => true, 'email' => $email]);
?>
Actions php (действия (actions) в php)
// Клиентская часть (JavaScript)
fetch('api.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({email: 'test@test.com'})
});
Типичные ошибки: отсутствие проверки Content-Type некорректный JSON. Сервер должен отправлять правильные HTTP статусы.
Расширенные примеры обработки форм
Ниже приведены дополнительные менее распространенные сценарии с подробным кодом и ожидаемым результатом.
Пример 1: Валидация с фильтрами PHP и регулярными выражениями
<?php
$errors = [];
$name = trim($_POST['name'] ?? '');
$phone = trim($_POST['phone'] ?? '');
if (strlen($name) < 2) {
$errors[] = 'Имя должно быть не менее 2 символов';
}
if (!preg_match('/^\\+?[0-9\\-\\s]{7,15}$/', $phone)) {
$errors[] = 'Некорректный номер телефона';
}
if (empty($errors)) {
echo 'Данные валидны';
} else {
foreach ($errors as $e) {
echo '<p>Ошибка: ' . htmlspecialchars($e) . '</p>';
}
}
?>
Ошибка: Имя должно быть не менее 2 символов Ошибка: Некорректный номер телефона
Пример 2: Загрузка нескольких файлов (multiple)
<form method="post" enctype="multipart/form-data">
<input type="file" name="photos[]" multiple accept="image/*">
<input type="submit">
</form>
<?php
if (isset($_FILES['photos'])) {
foreach ($_FILES['photos']['tmp_name'] as $key => $tmpName) {
if ($_FILES['photos']['error'][$key] === UPLOAD_ERR_OK) {
$name = basename($_FILES['photos']['name'][$key]);
move_uploaded_file($tmpName, 'uploads/' . $name);
echo 'Файл ' . $name . ' загружен.<br>';
}
}
}
?>
Файл photo1.jpg загружен. Файл photo2.png загружен.
Пример 3: Форма с вложенными массивами (дополнительные поля)
<form method="post">
<input type="text" name="items[0][name]" value="Товар A">
<input type="number" name="items[0][price]" value="100">
<input type="text" name="items[1][name]" value="Товар B">
<input type="number" name="items[1][price]" value="200">
<input type="submit">
</form>
<?php
if ($_POST) {
$items = $_POST['items'];
foreach ($items as $item) {
echo htmlspecialchars($item['name']) . ' - ' . (int)$item['price'] . ' руб.<br>';
}
}
?>
Товар A - 100 руб. Товар B - 200 руб.
Пример 4: CSRF токен с ограничением времени жизни
<?php
session_start();
$token = bin2hex(random_bytes(32));
$_SESSION['csrf_token_time'] = time();
$_SESSION['csrf_token'] = $token;
?>
<input type="hidden" name="csrf_token" value="<?= $token ?>">
<?php
// Проверка
if (time() - $_SESSION['csrf_token_time'] > 3600) {
// токен устарел
die('Token expired');
}
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die('Invalid token');
}
?>
(Если время прошло) Token expired
Пример 5: Интеграция reCAPTCHA v3
<?php
$secret = 'ваш_секретный_ключ';
$response = $_POST['g-recaptcha-response'];
$verify = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$secret&response=$response");
$captchaSuccess = json_decode($verify);
if ($captchaSuccess->success && $captchaSuccess->score >= 0.5) {
echo 'Проверка пройдена';
} else {
echo 'Бот обнаружен';
}
?>
(если score > 0.5) Проверка пройдена
Пример 6: Сохранение данных формы в базу данных с PDO
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
$stmt->execute([
':name' => $_POST['name'],
':email' => $_POST['email']
]);
echo 'Пользователь добавлен, ID: ' . $pdo->lastInsertId();
?>
Пользователь добавлен, ID: 42
Пример 7: Ответ сервера в JSON для AJAX с обработкой ошибок
<?php
header('Content-Type: application/json');
if (empty($_POST['name'])) {
http_response_code(400);
echo json_encode(['status' => 'error', 'message' => 'Имя обязательно']);
exit;
}
echo json_encode(['status' => 'success', 'data' => ['name' => $_POST['name']]]);
?>
{"status":"error","message":"Имя обязательно"}