Обработка форм и суперглобальные массивы

До этого наши скрипты работали сами по себе. Пора научить их общаться с пользователем: принимать данные из HTML-форм. Для этого в PHP есть суперглобальные массивы — в первую очередь $_GET и $_POST.

Что такое суперглобальные массивы

Суперглобальные массивы — это встроенные ассоциативные массивы, которые PHP заполняет автоматически при каждом запросе. Они доступны в любом месте скрипта, даже внутри функций. Основные из них:

МассивЧто содержит
$_GETпараметры из адресной строки
$_POSTданные формы, отправленной методом POST
$_REQUESTобъединение GET, POST и cookie (лучше не использовать)
$_SERVERинформация о сервере и запросе
$_COOKIEcookie браузера
$_SESSIONданные сессии пользователя
$_FILESзагруженные файлы

Передача данных через $_GET

GET-параметры — это часть адреса после знака вопроса. Откройте страницу search.php?query=php&page=2, и PHP разложит параметры в массив:

<?php
// search.php?query=php&page=2

echo $_GET["query"]; // Вывод: php
echo $_GET["page"];  // Вывод: 2

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

Форма и метод POST

Для данных, которые что-то изменяют (регистрация, комментарий, заказ), используют метод POST: данные передаются в теле запроса и не видны в адресной строке. Создадим простую форму:

<!-- form.html -->
<form action="register.php" method="post">
    <input type="text" name="username" placeholder="Имя">
    <input type="email" name="email" placeholder="E-mail">
    <button type="submit">Отправить</button>
</form>

Атрибут action указывает, какой скрипт примет данные, method — способ отправки, а name каждого поля станет ключом в массиве $_POST:

<?php
// register.php
$username = $_POST["username"];
$email = $_POST["email"];

echo "Привет, $username! Письмо отправим на $email";
// Вывод: Привет, Анна! Письмо отправим на [email protected]

GET или POST?

  • GET — чтение данных: поиск, фильтры. Параметры видны в URL, длина ограничена.
  • POST — изменение данных: формы регистрации, заказы. Параметры скрыты, объём практически не ограничен.

Проверяем, что данные пришли

Если открыть register.php напрямую, в $_POST ничего не будет, и обращение к ключу вызовет предупреждение. Поэтому данные всегда проверяют. Помогают isset() и оператор ?? (null coalescing):

<?php
// Способ 1: isset()
if (isset($_POST["username"])) {
    echo "Имя получено";
}

// Способ 2: значение по умолчанию через ??
$page = $_GET["page"] ?? 1;
echo $page; // Вывод: 1, если параметр не передан

А проверить сам метод запроса можно через $_SERVER:

<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    // обрабатываем форму
} else {
    // просто показываем страницу
}

Никогда не доверяйте данным пользователя

Главное правило веб-разработки: всё, что пришло из $_GET и $_POST, может быть подделано. Перед использованием данные очищают и проверяют:

<?php
$username = trim($_POST["username"] ?? "");
$email = trim($_POST["email"] ?? "");

if ($username === "") {
    echo "Введите имя";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Некорректный e-mail";
} else {
    echo "Добро пожаловать, " . htmlspecialchars($username);
}

Что здесь происходит:

  1. trim() убирает случайные пробелы по краям;
  2. filter_var() с фильтром FILTER_VALIDATE_EMAIL проверяет формат адреса;
  3. htmlspecialchars() экранирует HTML-теги перед выводом — без этого злоумышленник может внедрить на страницу свой скрипт (атака XSS).

Запомните связку: htmlspecialchars() — всегда при выводе пользовательских данных в HTML. Это правило без исключений.

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

Форма и обработчик могут жить в одном файле — классический приём:

<?php
// feedback.php
$message = "";

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $name = trim($_POST["name"] ?? "");

    $message = $name !== ""
        ? "Спасибо, " . htmlspecialchars($name) . "! Сообщение принято."
        : "Пожалуйста, представьтесь.";
}
?>
<form method="post">
    <input type="text" name="name" placeholder="Ваше имя">
    <button type="submit">Отправить</button>
</form>
<p><?= $message ?></p>

Конструкция <?= ... ?> — короткая форма <?php echo ... ?>, удобная для вывода в шаблонах.

Что мы узнали

  • Суперглобальные массивы доступны везде; главные — $_GET, $_POST и $_SERVER.
  • GET — для чтения (параметры в URL), POST — для изменения данных (параметры в теле запроса).
  • Ключи в $_POST совпадают с атрибутами name полей формы.
  • Наличие данных проверяем через isset() или оператор ??.
  • Пользовательские данные обязательно валидируем (filter_var()) и экранируем при выводе (htmlspecialchars()).
Проверьте себя
1. Когда следует использовать метод POST вместо GET для HTML-формы?
AКогда нужно отправить данные поиска или фильтры
BКогда данные изменяют состояние (регистрация, заказ, комментарий)
CКогда нужна ссылка на результат в закладках
DКогда объём данных меньше 100 байт
2. Что хранит суперглобальный массив `$_SERVER["REQUEST_METHOD"]`?
AIP-адрес сервера
BHTTP-метод текущего запроса (GET, POST и т.д.)
CПуть к PHP-файлу
DЗаголовки браузера
3. Почему нельзя доверять данным из `$_POST` и `$_GET` без проверки?
AОни могут быть пустыми
BПользователь может передать любые данные, включая вредоносный код
CPHP автоматически удаляет эти данные через 5 минут
DОни доступны только на локальном сервере
4. Что вернёт выражение `$_GET["page"] ?? 1`, если параметр page не передан в URL?
Anull
Bfalse
C1
DОшибка Notice

Закрепите практикой

Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.

Поддержать проект