Обработка форм и суперглобальные массивы
До этого наши скрипты работали сами по себе. Пора научить их общаться с пользователем: принимать данные из HTML-форм. Для этого в PHP есть суперглобальные массивы — в первую очередь $_GET и $_POST.
Что такое суперглобальные массивы
Суперглобальные массивы — это встроенные ассоциативные массивы, которые PHP заполняет автоматически при каждом запросе. Они доступны в любом месте скрипта, даже внутри функций. Основные из них:
| Массив | Что содержит |
|---|---|
$_GET | параметры из адресной строки |
$_POST | данные формы, отправленной методом POST |
$_REQUEST | объединение GET, POST и cookie (лучше не использовать) |
$_SERVER | информация о сервере и запросе |
$_COOKIE | cookie браузера |
$_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);
}
Что здесь происходит:
trim()убирает случайные пробелы по краям;filter_var()с фильтромFILTER_VALIDATE_EMAILпроверяет формат адреса;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()).
Закрепите практикой
Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.