Avatar ·

Как в PHP проверить, какой метод HTTP используется: GET или POST?

Всем привет! Я только начал изучать PHP и пишу простую форму обратной связи. У меня есть одна HTML-страница, на которой расположена форма, и она же обрабатывает данные (action=""). Проблема в том, что когда я просто захожу на страницу (без отправки формы), PHP пытается обработать данные из $_POST, которых нет, и выдает ошибки "Undefined array key". Как правильно определить, был ли запрос GET (просто открытие страницы) или POST (отправка формы)? Вот мой текущий код: ```php
Имя:
Email:
Сообщение:
``` Я знаю, что можно проверять через isset(), но мне кажется это костылем. Есть ли в PHP встроенный способ узнать, какой именно HTTP-метод пришел от браузера? И как правильно разделить логику отображения формы и обработки данных? Буду благодарен за примеры. Заранее спасибо! <<>>

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

Отличный вопрос! Действительно, проверять метод запроса — базовая, но важная задача. В PHP для этого есть два основных способа, и мы разберем оба.

Способ 1: Использование суперглобального массива $_SERVER

Самый надежный и прямой способ — обратиться к ключу REQUEST_METHOD в массиве $_SERVER. Этот ключ всегда содержит строку с именем HTTP-метода: 'GET', 'POST', 'PUT', 'DELETE' и т.д.

Вот как исправить ваш код:

<?php
// Проверяем, был ли запрос методом POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Теперь можно безопасно работать с $_POST
    $name = $_POST['name'] ?? '';
    $email = $_POST['email'] ?? '';
    $message = $_POST['message'] ?? '';

    if ($name && $email && $message) {
        mail('admin@example.com', 'Новое сообщение', $message);
        echo '<p>Спасибо! Ваше сообщение отправлено.</p>';
    } else {
        echo '<p style="color:red;">Пожалуйста, заполните все поля.</p>';
    }
}
?>

<form method="post">
    Имя: <input type="text" name="name"><br>
    Email: <input type="email" name="email"><br>
    Сообщение: <textarea name="message"></textarea><br>
    <input type="submit" value="Отправить">
</form>

Обратите внимание на несколько важных моментов:

  • Оператор ?? (null coalescing operator) — современная альтернатива isset(). Он присваивает значение по умолчанию (''), если переменная не определена. Это гораздо чище, чем оборачивать всё в if(isset(...)).
  • Строгое сравнение === — используйте именно тройное равно, чтобы избежать неявного приведения типов. 'POST' == true вернет true, что может привести к ошибкам.
  • Разделение логики — весь код обработки находится внутри блока if, а форма всегда отображается. Это классический паттерн "Post/Redirect/Get" (PRG) в упрощенном виде.

Способ 2: Использование функции filter_input()

Для еще более безопасного доступа к внешним данным PHP предлагает функцию filter_input(). Она позволяет получить значение переменной с фильтрацией:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    $message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING);

    if ($name && $email && $message) {
        mail('admin@example.com', 'Новое сообщение', $message);
        echo '<p>Спасибо!</p>';
    } else {
        echo '<p style="color:red;">Некорректные данные.</p>';
    }
}
?>

Почему это хорошая практика? Потому что вы сразу фильтруете или валидируете данные на этапе получения. FILTER_VALIDATE_EMAIL вернет false, если email некорректен, что избавляет от дополнительных проверок.

Дополнительный совет: Редирект после POST

Если вы обрабатываете форму и показываете результат на той же странице, при обновлении браузер повторно отправит POST-запрос (и письмо уйдет еще раз). Чтобы этого избежать, используйте паттерн PRG:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ... обработка данных ...
    // После успешной обработки делаем редирект
    header('Location: success.php');
    exit; // обязательно завершаем скрипт
}
?>

Это стандартная практика в профессиональной разработке.

<<>>

Альтернативный подход: Функция-обертка для определения метода

Вместо того чтобы каждый раз писать $_SERVER['REQUEST_METHOD'], можно создать простую вспомогательную функцию. Это особенно удобно, если в проекте много форм и AJAX-запросов.

<?php
function getRequestMethod(): string {
    return strtoupper($_SERVER['REQUEST_METHOD']);
}

// Использование
if (getRequestMethod() === 'POST') {
    // обработка формы
} elseif (getRequestMethod() === 'GET') {
    // просто показываем страницу
}
?>

Почему это может быть полезно?

  • Читаемость кода — название функции сразу говорит о её назначении.
  • Централизованная логика — если в будущем понадобится обрабатывать методы иначе (например, для поддержки HEAD или PATCH), изменения будут в одном месте.
  • Безопасность — функция strtoupper() нормализует строку, чтобы сравнение было регистронезависимым (хотя веб-серверы обычно отдают методы в верхнем регистре, это дополнительная страховка).

Если вы работаете с фреймворками (Laravel, Symfony), там уже есть встроенные методы, например $request->isMethod('post'). Но для чистого PHP или самописных проектов этот подход очень удобен.

Также рекомендую для полноты проверять не только метод, но и наличие самого ключа REQUEST_METHOD в $_SERVER — на некоторых конфигурациях сервера он может отсутствовать:

function getRequestMethod(): string {
    return strtoupper($_SERVER['REQUEST_METHOD'] ?? 'GET');
}