Практические примеры PHP для работы с HTML-формами

Раздел: Веб-разработка -> Обработка запросов

HTML-формы основной способ взаимодействия пользователя с сервером. PHP предоставляет инструменты для получения и обработки данных отправленных через форму. В этой статье рассмотрены различные варианты организации этого процесса с примерами кода и пояснениями.

Основные сценарии работы с HTML-формами в PHP

Как защитить форму от CSRF атак и валидировать данные на сервере?

Наиболее распространенный и безопасный подход использование метода POST с токеном CSRF и проверкой ввода. Рассмотрим пошагово.

  1. Создать HTML форму с атрибутом method="post".
  2. Генерировать уникальный CSRF токен и сохранить его в сессии.
  3. В форме добавить скрытое поле с этим токеном.
  4. При отправке проверять токен на соответствие.
  5. Валидировать все поля экранировать вывод.

<?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":"Имя обязательно"}

Примеры HTML-форм с PHP - comments

En
пример формы php (php)