HTTP параметры в PHP: как извлечь и обработать

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

Параметры HTTP запроса в PHP

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

Как безопасно получить параметры GET и POST запроса с автоматической фильтрацией?

Основной рекомендуемый метод - использование функции filter_input. Она позволяет извлекать параметры с указанием типа фильтрации, что предотвращает инъекции и типичные ошибки.


// Получение параметра 'name' из GET запроса с санитизацией строки
$name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_STRING);

// Получение параметра 'age' из POST запроса с проверкой целого числа
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT);

// Если параметр не передан или не прошёл валидацию, возвращается false или null
if ($name === false || $name === null) {
    // обработка ошибки
}
  

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

Для получения всех параметров сразу используется filter_input_array:


$args = [
    'name' => FILTER_SANITIZE_STRING,
    'age'  => FILTER_VALIDATE_INT,
];
$inputs = filter_input_array(INPUT_GET, $args);
  

Типичные проблемы и их решение:

  • Неверный тип фильтра - при указании несуществующего фильтра функция возвращает false. Проверяйте список констант FILTER_*.
  • Параметр отсутствует - filter_input возвращает null, если параметра нет. Используйте оператор ?? для значений по умолчанию: $name = $name ?? 'гость';
  • Проблемы с кодировкой - фильтр FILTER_SANITIZE_STRING удаляет теги, но не меняет кодировку. Для UTF-8 используйте FILTER_SANITIZE_SPECIAL_CHARS.

Как получить параметры запроса напрямую из суперглобальных массивов?

Самый простой способ - обратиться к массивам $_GET, $_POST или $_REQUEST. Однако он не обеспечивает автоматическую фильтрацию.


// GET параметры
$id = $_GET['id'] ?? null;

// POST параметры
$email = $_POST['email'] ?? '';

// Любой метод (GET, POST, Cookie)
$action = $_REQUEST['action'] ?? 'default';
  

Ошибки и их предотвращение:

  • Undefined index - если ключ отсутствует, возникает предупреждение. Используйте оператор ?? или функцию isset().
  • XSS и SQL инъекции - данные из суперглобальных массивов не очищены. Перед выводом обязательно применяйте htmlspecialchars() или filter_var().
  • Переопределение переменных - $_REQUEST может содержать данные из GET, POST и Cookie, порядок зависит от request_order в php.ini. Явно используйте $_GET или $_POST.

Как получить параметры из тела запроса при методах PUT, DELETE и других?

Для методов, отличных от GET и POST, параметры обычно передаются в теле запроса в виде URL-кодированной строки или JSON. Чтение выполняется через поток php://input.


// Получение сырых данных тела запроса
$rawBody = file_get_contents('php://input');

// Если данные в формате application/x-www-form-urlencoded
parse_str($rawBody, $params);
// $params теперь содержит массив параметров

// Если данные в JSON формате
$jsonData = json_decode($rawBody, true);
  

Для определения метода запроса используется $_SERVER['REQUEST_METHOD'].

Потенциальные сложности:

  • Большой объём данных - file_get_contents загружает всё тело в память. Для потоковой обработки используйте fopen и stream_get_contents с ограничением.
  • Неверный Content-Type - если клиент не указал тип, разбор может быть некорректен. Проверяйте заголовок $_SERVER['CONTENT_TYPE'].
  • Многократное чтение - поток можно прочитать только один раз. Сохраняйте результат в переменную.
Как извлечь параметры из строки запроса вручную?

Иногда требуется разобрать URL-строку самостоятельно, например, при работе с переадресацией или парсингом внешних ссылок.


$url = 'http://example.com/page?foo=1&bar=2';
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $result);
// $result = ['foo' => '1', 'bar' => '2']
  

Распространённые ошибки:

  • Дублирование параметров - если ключ встречается несколько раз, parse_str перезаписывает предыдущее значение. Для сохранения массива используйте нотацию с квадратными скобками (param[]).
  • Неверная кодировка - URL может содержать процентные последовательности. parse_str автоматически их декодирует, но если строка уже декодирована, возникает двойное декодирование.
Как обработать файлы, загруженные через HTTP?

Файлы передаются в массиве $_FILES. Для доступа к их параметрам (имя, тип, размер) используется следующий код:


if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['avatar'])) {
    $file = $_FILES['avatar'];
    $name = $file['name'];         // исходное имя файла
    $type = $file['type'];         // MIME-тип
    $tmpName = $file['tmp_name'];  // временный путь
    $error = $file['error'];       // код ошибки
    $size = $file['size'];         // размер в байтах
}
  

Частые проблемы при работе с файлами:

  • Превышение лимита загрузки - проверяйте upload_max_filesize и post_max_size в php.ini. Ошибка UPLOAD_ERR_INI_SIZE.
  • Неверная директория временных файлов - убедитесь, что upload_tmp_dir существует и доступен для записи.
  • Безопасность - не доверяйте $file['type'], он может быть подделан. Используйте finfo для определения реального MIME-типа.

Расширенные примеры работы с параметрами HTTP запроса в PHP

В этом разделе приведены неочевидные и продвинутые сценарии получения и анализа параметров.

1. Обработка множественных параметров с одинаковым именем (массивы)

Если клиент передаёт несколько значений с одним ключом, PHP автоматически преобразует их в массив, если в имени ключа используются квадратные скобки. Пример:

Пример

// URL: /page?colors[]=red&colors[]=green&colors[]=blue
$colors = $_GET['colors'];
// $colors = ['red', 'green', 'blue']

// Или через filter_input_array:
$filtered = filter_input_array(INPUT_GET, [
    'colors' => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_REQUIRE_ARRAY]
]);
print_r($filtered);
Array
(
    [colors] => Array
        (
            [0] => red
            [1] => green
            [2] => blue
        )
)

2. Чтение JSON тела запроса с принудительной валидацией

Современные API часто передают данные в 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;
}

// Валидация обязательных полей
$required = ['username', 'email'];
foreach ($required as $field) {
    if (!isset($data[$field]) || empty(trim($data[$field]))) {
        http_response_code(422);
        echo json_encode(['error' => "Field '$field' is required"]);
        exit;
    }
}

echo json_encode(['status' => 'ok', 'user' => $data['username']]);

3. Извлечение параметров из multipart/form-data при ручном разборе

Когда требуется обработать загрузку файлов и полей в одном запросе без использования суперглобальных массивов (например, при создании прокси-скрипта).

Пример

$boundary = substr($_SERVER['CONTENT_TYPE'], strpos($_SERVER['CONTENT_TYPE'], 'boundary=') + 9);
$raw = file_get_contents('php://input');
$parts = explode('--' . $boundary, $raw);
array_pop($parts); // удаляем последнюю пустую часть

foreach ($parts as $part) {
    if (strpos($part, 'Content-Disposition: form-data; name="file"') !== false) {
        // Извлечение содержимого файла (упрощённо)
        preg_match('/Content-Type: (.+)\r\n\r\n(.*)/s', $part, $matches);
        $fileContent = $matches[2] ?? '';
        // обработка
    }
}

Результат не приводится, так как зависит от переданных данных. Этот метод применяется в библиотеках низкого уровня.

4. Параметры из строки запроса с использованием регулярных выражений

Иногда требуется разобрать параметры, закодированные нестандартным способом. Пример с парсингом вложенных массивов из строки:

Пример

$query = 'user[name]=John&user[age]=30&tags[]=php&tags[]=web';
$result = [];
parse_str($query, $result);
print_r($result);
Array
(
    [user] => Array
        (
            [name] => John
            [age] => 30
        )
    [tags] => Array
        (
            [0] => php
            [1] => web
        )
)

5. Получение параметров через объект Request из PSR-7 (с использованием библиотеки guzzlehttp/psr7)

Для проектов, где применяются современные стандарты, можно использовать PSR-7 RequestInterface. Пример:

Пример

use GuzzleHttp\Psr7\ServerRequest;

$request = ServerRequest::fromGlobals();
$getParams = $request->getQueryParams();
$postParams = $request->getParsedBody();
$uploadedFiles = $request->getUploadedFiles();

// Вывод всех GET параметров
print_r($getParams);
Array
(
    [page] => 1
    [limit] => 10
)

Примечание:

Для работы требуется установить библиотеку через Composer: composer require guzzlehttp/psr7.

6. Динамическое получение параметров через переменные переменные

Когда имя параметра неизвестно заранее, можно использовать суперглобальные массивы с динамическим ключом:

Пример

$paramName = 'sort';
$value = $_GET[$paramName] ?? 'default';
echo "Параметр $paramName = $value";
Параметр sort = asc

Такой подход полезен при построении универсальных обработчиков.

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

En
Php параметры запроса (php)