Работа с POST-запросами: приём параметров в PHP

Раздел: PHP -> Работа с POST-запросами: приём

Приём параметров POST-запроса в PHP

Основной способ приёма данных POST

PHP предоставляет суперглобальный массив $_POST, содержащий все параметры, переданные методом POST. Ключи массива соответствуют именам полей формы. Пример простейшей обработки:


// форма.html
<form method="post" action="handler.php">
    <input type="text" name="username">
    <input type="submit">
</form>

// handler.php
$username = $_POST['username'] ?? null;
echo "Привет, " . htmlspecialchars($username);
    

Php post array (массив $_post в php)

Использование оператора ?? (null coalescing) позволяет избежать ошибки при отсутствии параметра.

Как принять JSON данные через POST?

Если данные приходят в формате JSON (например, от JavaScript fetch), их нельзя прочитать через $_POST. Требуется читать сырое тело запроса:


$json = file_get_contents('php://input');
$data = json_decode($json, true);
// $data теперь ассоциативный массив
    

Php параметры post (параметры post-запроса в php)

Типичная ошибка:

Забыть указать заголовок Content-Type: application/json в запросе. Тогда $_POST может быть пустым, а php://input содержит строку запроса в формате form-data.

Как обработать множественные поля с одинаковым именем (например, чекбоксы)?

Добавьте к имени поля квадратные скобки: name="items[]". В $_POST придет массив:


// HTML
<input type="checkbox" name="items[]" value="1">
<input type="checkbox" name="items[]" value="2">

// PHP
$items = $_POST['items'] ?? []; // массив значений
    

Php post link (работа со ссылками в post-запросе php)

Как проверить, был ли отправлен параметр?

Используйте isset():


if (isset($_POST['email'])) {
    // параметр присутствует
}
    
Как безопасно получить значение параметра с фильтрацией?

Функция filter_input позволяет валидировать и очищать данные сразу при получении:


$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
    // невалидный email
}
    

Если параметр не существует, filter_input вернет null, а не false. Следует проверять на null отдельно.

Дополнительные замечания

  • Всегда экранируйте вывод с помощью htmlspecialchars или используйте подготовленные запросы для SQL.
  • При работе с multipart/form-data (загрузка файлов) параметры доступны в $_POST, а файлы – в $_FILES.

Расширенные примеры приёма параметров POST

Пример 1: Комплексная обработка формы регистрации

Пример

// HTML форма
<form method="post" action="register.php">
    <input type="text" name="username" required>
    <input type="email" name="email" required>
    <input type="password" name="password" required>
    <input type="submit">
</form>

// register.php
$username = trim($_POST['username'] ?? '');
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$password = $_POST['password'] ?? '';

$errors = [];
if (empty($username)) $errors[] = 'Имя пользователя обязательно';
if ($email === false || $email === null) $errors[] = 'Некорректный email';
if (strlen($password) < 6) $errors[] = 'Пароль должен быть не менее 6 символов';

if (empty($errors)) {
    // сохранение в БД с хэшированием пароля
    $hash = password_hash($password, PASSWORD_DEFAULT);
    echo "Регистрация успешна";
} else {
    echo implode('<br>', $errors);
}

Результат при неверном email:

Некорректный email
Пароль должен быть не менее 6 символов

Пример 2: Приём данных JSON с несколькими объектами

Пример

// JavaScript отправка
fetch('api.php', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify([
        {id: 1, name: 'Иван'},
        {id: 2, name: 'Мария'}
    ])
});

// api.php
$json = file_get_contents('php://input');
$users = json_decode($json, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    http_response_code(400);
    echo 'Ошибка разбора JSON';
    exit;
}

foreach ($users as $user) {
    echo "ID: " . htmlspecialchars($user['id']) . ", Name: " . htmlspecialchars($user['name']) . "\n";
}

Результат:

ID: 1, Name: Иван
ID: 2, Name: Мария

Пример 3: Использование filter_var_array для фильтрации всех POST параметров

Пример

// Определяем правила фильтрации
$filters = [
    'username' => FILTER_SANITIZE_STRING,
    'email' => FILTER_VALIDATE_EMAIL,
    'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 120]]
];

$result = filter_input_array(INPUT_POST, $filters);
// $result['username'] - очищенная строка
// $result['email'] - email или false
// $result['age'] - int или false
if ($result === null) {
    echo 'Нет данных POST';
} else {
    var_dump($result);
}

Результат для POST (username=John&email=test&age=25):

array(3) {
  ["username"]=> string(4) "John"
  ["email"]=> bool(false)
  ["age"]=> int(25)
}

Пример 4: Обработка данных с загрузкой файла

Пример

// HTML форма с enctype="multipart/form-data"
<form method="post" action="upload.php" enctype="multipart/form-data">
    <input type="text" name="description">
    <input type="file" name="image">
    <input type="submit">
</form>

// upload.php
$description = $_POST['description'] ?? '';
$file = $_FILES['image'] ?? null;

if ($file && $file['error'] === UPLOAD_ERR_OK) {
    $uploadDir = 'uploads/';
    $filename = uniqid() . '-' . basename($file['name']);
    if (move_uploaded_file($file['tmp_name'], $uploadDir . $filename)) {
        echo "Файл загружен. Описание: " . htmlspecialchars($description);
    }
} else {
    echo "Ошибка загрузки файла";
}

Пример 5: Получение параметров при использовании application/x-www-form-urlencoded вручную

Пример

// Если нужно обработать строку запроса в теле POST (например, при кастомной отправке)
$rawBody = file_get_contents('php://input');
parse_str($rawBody, $params);
// $params теперь содержит ассоциативный массив
echo "Параметр name: " . htmlspecialchars($params['name'] ?? '');

Параметры POST-запроса в PHP - comments

En
Php параметры post (php)