Как PHP принимает данные из форм: руководство с примерами

Раздел: Веб-разработка -> Формы и передача данных

Прием данных из форм в PHP: основные методы и варианты

Наиболее распространённый и эффективный способ получить данные из HTML-формы в PHP - использование суперглобальных массивов $_POST и $_GET. Эти массивы автоматически заполняются в зависимости от метода отправки формы (method="post" или method="get").

Пример простой формы и обработчика:


<!-- form.html -->
<form action="handler.php" method="post">
  <input type="text" name="username">
  <input type="email" name="email">
  <button type="submit">Отправить</button>
</form>
  

Php принимать данные (приём данных из форм (post/get) в php)


<?php
// handler.php
$username = $_POST['username'] ?? '';
$email = $_POST['email'] ?? '';

// далее обработка (сохранение, валидация и т.д.)
?>
  

Оператор ?? (null coalescing) присваивает пустую строку, если ключ отсутствует. Это предотвращает ошибки уровня Notice.

Важно: данные из форм никогда не следует доверять напрямую. Необходима фильтрация и валидация.

Типичная ошибка: обращение к несуществующему индексу массива вызывает предупреждение. Решение - проверять через isset() или использовать оператор ??.

Пример ошибки: echo $_POST['nonexistent']; → Notice: Undefined index.

Исправление: echo $_POST['nonexistent'] ?? '';

Как защититься от XSS и SQL-инъекций при приёме данных?

Для защиты от XSS используйте htmlspecialchars() при выводе данных. Для SQL-инъекций - подготовленные запросы (PDO или mysqli). Фильтрация входных данных выполняется с помощью filter_input() или filter_var().


<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
    // ошибка валидации
}

$safe_username = htmlspecialchars($_POST['username'] ?? '', ENT_QUOTES, 'UTF-8');
?>
  

Проблема: filter_input() может вернуть false или null, что требует строгой проверки. Типичная ошибка - путать эти значения.

Решение: использовать одинаковые правила сравнения (===) и учитывать, что пустая строка может быть валидным значением.

Цель: предотвратить внедрение вредоносного кода в базу данных или на страницу.

Как обработать данные, переданные через AJAX в формате JSON?

При AJAX-запросах с Content-Type: application/json данные не попадают в $_POST. Их нужно читать из потока php://input.


<?php
$json = file_get_contents('php://input');
$data = json_decode($json, true);

$username = $data['username'] ?? '';
$email = $data['email'] ?? '';
?>
  

Ошибка: если JSON некорректен, json_decode() вернёт null. Нужно проверять json_last_error().

// Пример проверки
if (json_last_error() !== JSON_ERROR_NONE) {
    // обработка ошибки
}
    

Цель: приём данных от одностраничных приложений, REST API.

Как работать с загружаемыми файлами?

Для файлов используется массив $_FILES. Форма должна иметь атрибут enctype="multipart/form-data".


<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];
    // $file['name'], $file['tmp_name'], $file['error'], $file['size']
    if ($file['error'] === UPLOAD_ERR_OK) {
        move_uploaded_file($file['tmp_name'], 'uploads/' . basename($file['name']));
    }
}
?>
  

Распространённые проблемы: превышение лимита размера (upload_max_filesize в php.ini), атаки с подменой имени (нужно проверять basename()).

Также следует проверять MIME-тип через finfo_file().

Цель: приём изображений, документов и других файлов через форму.

Как принимать данные от нескольких полей с одинаковыми именами?

Используйте имена с квадратными скобками, например name="items[]". PHP создаст массив.


<!-- несколько чекбоксов -->
<input type="checkbox" name="interests[]" value="php"> PHP
<input type="checkbox" name="interests[]" value="js"> JS
  

<?php
$interests = $_POST['interests'] ?? [];
foreach ($interests as $value) {
    echo htmlspecialchars($value);
}
?>
  

Ошибка: если ни один чекбокс не выбран, $_POST['interests'] не существует. Решение - проверять через isset() или ?? [].

Цель: обработка групп полей, списков.

Как обработать PUT и DELETE запросы?

HTML-формы поддерживают только GET и POST. Для PUT и DELETE данные читаются из php://input аналогично JSON.


<?php
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
    parse_str(file_get_contents('php://input'), $data);
    $id = $data['id'] ?? null;
}
?>
  

Или используйте библиотеку Symfony HttpFoundation, которая абстрагирует этот процесс.

Проблема: parse_str() работает только для URL-кодированных данных (application/x-www-form-urlencoded). Для multipart/form-data потребуется другой парсинг.

Цель: реализация RESTful интерфейсов без использования дополнительного ПО.

Расширенные примеры приёма данных из форм

1. Полный пример валидации и фильтрации POST-формы

Пример

<?php
// form.php (обработчик)
$errors = [];
$username = trim($_POST['username'] ?? '');
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 120]]);

if (empty($username)) {
    $errors[] = 'Имя пользователя обязательно';
}
if ($email === false || $email === null) {
    $errors[] = 'Некорректный email';
}
if ($age === false || $age === null) {
    $errors[] = 'Возраст должен быть числом от 1 до 120';
}

if (empty($errors)) {
    // сохранение в базу через подготовленный запрос PDO
    $stmt = $pdo->prepare('INSERT INTO users (username, email, age) VALUES (:username, :email, :age)');
    $stmt->execute(['username' => $username, 'email' => $email, 'age' => $age]);
    echo 'Данные сохранены успешно';
} else {
    foreach ($errors as $error) {
        echo '<p class="error">' . htmlspecialchars($error) . '</p>';
    }
}
?>
Результат при корректных данных: 
Данные сохранены успешно

Результат при пустом имени: 
<p class="error">Имя пользователя обязательно</p>

2. Приём JSON от AJAX и сохранение в файл

Пример

<?php
header('Content-Type: application/json');
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    http_response_code(400);
    echo json_encode(['error' => 'Invalid JSON']);
    exit;
}

$action = $data['action'] ?? '';
$payload = $data['payload'] ?? [];

file_put_contents('log.txt', date('Y-m-d H:i:s') . ' ' . json_encode($data) . PHP_EOL, FILE_APPEND);
echo json_encode(['status' => 'ok', 'received_action' => $action]);
?>
Пример запроса (POST /ajax_handler):
{"action":"create","payload":{"title":"Новая запись"}}

Ответ:
{"status":"ok","received_action":"create"}

Содержимое log.txt:
2025-03-30 14:22:10 {"action":"create","payload":{"title":"Новая запись"}}

3. Обработка загрузки изображения с проверкой MIME и размера

Пример

<?php
$max_size = 2 * 1024 * 1024; // 2MB
$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['avatar'])) {
    $file = $_FILES['avatar'];
    if ($file['error'] !== UPLOAD_ERR_OK) {
        die('Ошибка загрузки: ' . $file['error']);
    }
    if ($file['size'] > $max_size) {
        die('Файл слишком большой. Максимум 2MB.');
    }
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $file['tmp_name']);
    finfo_close($finfo);
    if (!in_array($mime, $allowed_types)) {
        die('Допустимы только JPEG, PNG, GIF.');
    }
    // Генерация уникального имени
    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
    $new_name = uniqid('avatar_', true) . '.' . $ext;
    move_uploaded_file($file['tmp_name'], 'uploads/' . $new_name);
    echo 'Файл сохранён как ' . htmlspecialchars($new_name);
}
?>
После загрузки файла image.png (размер 500KB):
Файл сохранён как avatar_5f1a2b3c4d5e6.png

При попытке загрузить PHP-файл:
Допустимы только JPEG, PNG, GIF.

4. Работа с вложенными массивами из формы

Пример

<!-- форма с динамическими полями -->
<input type="text" name="user[name]" value="Иван">
<input type="text" name="user[email]" value="ivan@example.com">
<input type="text" name="address[street]" value="Ленина">
<input type="text" name="address[house]" value="10">
Пример

<?php
$user = $_POST['user'] ?? [];   // ['name' => 'Иван', 'email' => 'ivan@example.com']
$address = $_POST['address'] ?? []; // ['street' => 'Ленина', 'house' => '10']

$full = array_merge($user, $address);
print_r($full);
?>
Array
(
    [name] => Иван
    [email] => ivan@example.com
    [street] => Ленина
    [house] => 10
)

5. Приём multipart/form-data без файлов (бинарные данные)

Пример

<?php
// Для multipart/form-data без файлов используем $_POST, всё стандартно.
// Но если данные передаются с Content-Type: multipart/form-data и файлов нет,
// PHP всё равно обрабатывает их корректно.
$text = $_POST['text'] ?? '';
echo 'Получено: ' . htmlspecialchars($text);
?>
При отправке поля text со значением "Привет мир":
Получено: Привет мир

Приём данных из форм (POST/GET) в PHP - comments

En
Php принимать данные (php)