Серверные переменные PHP: методы извлечения и примеры

Раздел: Веб-программирование PHP -> Обработка HTTP запросов

Основные методы получения серверных переменных

Наиболее эффективный способ: прямое обращение к суперглобальным массивам с проверкой существования.

Суперглобальные массивы $_GET, $_POST, $_SERVER, $_FILES, $_COOKIE, $_REQUEST и $_ENV содержат все данные, переданные в HTTP запросе. Для безопасного получения значения используется isset() или оператор ?? (null coalescing).


    // Получение параметра name из GET
    $name = $_GET['name'] ?? 'не указано';
    echo $name;
  

Php get response (получение серверных переменных в php)

Шаги: проверка существования ключа, присвоение значения по умолчанию, вывод. Такой подход гарантирует отсутствие ошибок уровня notice при отсутствии параметра.

Типичные ошибки и их решения:

  • Ошибка: обращение к несуществующему ключу без проверки вызывает warning. Решение: всегда использовать оператор ?? или isset().
  • Ошибка: доверие входящим данным без санитизации. Решение: применять фильтры (filter_var) или экранирование при выводе.

Как получить и одновременно отфильтровать параметр?

Функция filter_input(INPUT_GET, 'param', FILTER_SANITIZE_STRING) возвращает отфильтрованное значение или null/false в случае ошибки. Цель: безопасное извлечение данных с валидацией.


    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    if ($email === false) {
        echo 'Некорректный email';
    }
  

Php get body (получение тела запроса)

Случаи использования: когда необходимо сразу защититься от XSS или проверить формат данных.

Проблемы:

  • filter_input может вернуть null (если ключ отсутствует) или false (если фильтр не прошёл), что требует отдельной проверки.
  • Не подходит для сложных структур (например, массивы параметров).

Как получить JSON или XML из тела POST запроса?

Для данных в формате JSON, XML или других, передаваемых не через стандартную форму, необходимо читать сырой поток php://input. Цель: обработка REST API запросов.


    // Чтение тела запроса
    $rawData = file_get_contents('php://input');
    $data = json_decode($rawData, true); // получаем ассоциативный массив
  

Случаи использования: приём JSON от JavaScript, вебхуки, микросервисы.

Ошибки:

  • php://input можно прочитать только один раз (после чтения поток закрывается). При необходимости повторного доступа сохранить данные в переменную.
  • При загрузке файлов через multipart/form-data поток php://input не содержит данные форм.

Как получить данные из любого источника (GET, POST, COOKIE) без указания?

Массив $_REQUEST объединяет $_GET, $_POST и $_COOKIE. Цель: универсальный доступ (не рекомендуется для безопасных приложений).


    $action = $_REQUEST['action'] ?? '';
  

Случаи использования: простые скрипты, где источник не важен.

Недостатки:

  • Невозможно определить, откуда пришло значение (GET или POST).
  • Может содержать данные, не прошедшие санитизацию.
  • Медленнее, чем обращение к конкретному массиву.

Как извлечь HTTP заголовки запроса?

Функция getallheaders() возвращает ассоциативный массив заголовков. Альтернатива: $_SERVER['HTTP_*']. Цель: доступ к авторisation, content-type, accept и т.д.


    $headers = getallheaders();
    $auth = $headers['Authorization'] ?? '';
  

Случаи: проверка токена, обработка CORS, согласование контента.

Проблема:

  • getallheaders() доступна только в SAPI (не в CLI).
  • Ключи в $_SERVER пишутся в верхнем регистре с заменой дефисов на подчёркивания (например, HTTP_HOST).

Как принять загруженные файлы?

Массив $_FILES содержит информацию о файлах, отправленных методом POST с enctype="multipart/form-data". Цель: загрузка файлов на сервер.


    if ($_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
        $tmpName = $_FILES['avatar']['tmp_name'];
        move_uploaded_file($tmpName, 'uploads/' . basename($_FILES['avatar']['name']));
    }
  

Случаи: аватарки, документы, медиа.

Типичные ошибки:

  • Не проверяется ошибка загрузки (UPLOAD_ERR_OK).
  • Использование оригинального имени без санитизации (уязвимость path traversal).
  • Превышение лимита размера файла (upload_max_filesize).

Расширенные примеры получения серверных переменных

Пример 1: Извлечение всех GET параметров с фильтрацией

Пример

// Получение всех параметров из GET
$params = filter_input_array(INPUT_GET, [
    'name' => FILTER_SANITIZE_STRING,
    'email' => FILTER_VALIDATE_EMAIL,
    'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 150]]
]);

print_r($params);
Array
(
    [name] => Иван
    [email] => ivan@example.com
    [age] => 30
)

Пояснение: filter_input_array применяет разные фильтры к каждому ключу, возвращая отфильтрованные значения или false/null.

Пример 2: Чтение JSON запроса и извлечение поля

Пример

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

if (json_last_error() === JSON_ERROR_NONE) {
    $username = $data['username'] ?? 'гость';
    echo "Привет, $username";
} else {
    http_response_code(400);
    echo 'Некорректный JSON';
}
Привет, Alex

Пояснение: после декодирования проверяется ошибка, затем извлекается поле с ??.

Пример 3: Получение IP адреса клиента через $_SERVER с учётом прокси

Пример

$ip = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0];
}
// Если запрос идёт напрямую: 192.168.1.1
// Если через прокси: 203.0.113.5 (крайний клиентский IP из X-Forwarded-For)

Пояснение: REMOTE_ADDR всегда содержит IP последнего сетевого узла, а HTTP_X_FORWARDED_FOR может содержать цепочку прокси.

Пример 4: Загрузка файла с валидацией типа и размера

Пример

$maxSize = 2 * 1024 * 1024; // 2 MB
$allowedTypes = ['image/jpeg', 'image/png'];

if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    $type = mime_content_type($_FILES['file']['tmp_name']);
    $size = $_FILES['file']['size'];
    if (in_array($type, $allowedTypes) && $size <= $maxSize) {
        move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . uniqid() . '.jpg');
    } else {
        echo 'Недопустимый тип или размер';
    }
} else {
    echo 'Ошибка загрузки';
}
// Файл сохранён в uploads/63f1a2b3c4d5e.jpg
// или сообщение об ошибке

Пояснение: mime_content_type определяет реальный MIME, а не только расширение; uniqid() предотвращает перезапись.

Пример 5: Обработка массива параметров через фильтры

Пример

// POST запрос с массивом: items[]=1&items[]=2&items[]=abc
$items = filter_input(INPUT_POST, 'items', FILTER_VALIDATE_INT, ['flags' => FILTER_REQUIRE_ARRAY]);
if ($items !== null && $items !== false) {
    $validItems = array_filter($items, fn($v) => $v !== false);
    print_r($validItems);
}
Array
(
    [0] => 1
    [1] => 2
)

Пояснение: FILTER_REQUIRE_ARRAY обрабатывает много знаяения, FILTER_VALIDATE_INT отбрасывает нечисловые элементы.

Получение серверных переменных в PHP - comments

En
Php get response (php)