Суперглобальные переменные PHP: $_POST
$_POST — суперглобальный массив PHP для получения данных, отправленных методом POST. Узнайте, как безопасно читать и валидировать данные формы.
Суперглобальные переменные PHP — это встроенные переменные, доступные в любой области видимости скрипта: их никогда не нужно объявлять с помощью global или передавать как аргументы. Они предоставляют доступ к ключевой информации, такой как пользовательский ввод, данные сервера и переменные окружения. Одна из наиболее часто используемых — $_POST, массив, который PHP заполняет данными, отправленными в теле HTTP-запроса методом POST.
В этой главе объясняется, что такое $_POST, как безопасно считывать из него значения, чем он отличается от $_GET, и как обработать реальную форму от начала до конца. Для более широкого обзора связанных массивов смотрите суперглобальные переменные PHP.
Что такое $_POST?
$_POST — это ассоциативный массив, который собирает данные формы, отправленные с атрибутом method="post". Браузер помещает каждое поле в тело запроса (не в URL), а PHP разбирает это тело в $_POST до запуска вашего скрипта. Ключами являются атрибуты name элементов управления формы, а значениями — то, что ввёл пользователь.
Поскольку данные передаются в теле запроса, $_POST подходит для конфиденциальных или объёмных данных (паролей, длинного текста, загрузки файлов), для действий, изменяющих состояние сервера, а также в тех случаях, когда значения не должны появляться в URL или истории браузера.
$_POST vs $_GET
Оба массива содержат пользовательский ввод, но соответствуют разным HTTP-методам и имеют разные компромиссы.
$_POST | $_GET | |
|---|---|---|
| Расположение данных | Тело запроса | Строка запроса URL (?key=value) |
| Виден в URL | Нет | Да |
| Можно добавить в закладки / кешировать | Нет | Да |
| Типичное применение | Вход в систему, создание/обновление, загрузки | Поиск, фильтры, пагинация |
| Ограничение размера | Большой (настраивается на сервере) | Ограничен длиной URL |
Используйте POST, когда запрос изменяет данные или содержит секретную информацию; используйте GET для безопасных, повторяемых запросов на чтение. Смотрите $_GET для сравнения, или $_REQUEST, если нужны оба.
Как считать значение
Доступ к значению осуществляется по имени поля, как и к любому ключу массива:
$username = $_POST['username'];$_POST заполняется только после отправки формы методом POST. При первой загрузке страницы это пустой массив, поэтому обращение к несуществующему ключу вызовет предупреждение. Всегда проверяйте существование ключа заранее — используйте isset() или оператор объединения с null из PHP 7+ для задания значения по умолчанию:
<?php
// Safe: never errors, falls back to an empty string
$username = $_POST['username'] ?? '';
if ($username === '') {
echo "Username is required.";
} else {
echo "Hello, " . htmlspecialchars($username);
}
?>Оператор объединения с null ?? возвращает правый операнд, если левая сторона не установлена или равна null, что как раз происходит до отправки формы.
Безопасность: никогда не доверяйте пользовательскому вводу
Всё содержимое $_POST поступает от клиента и может быть подделано. Два правила обеспечивают безопасность:
- Экранирование при выводе. Передавайте любое значение через
htmlspecialchars()перед выводом на страницу, чтобы предотвратить межсайтовый скриптинг (XSS). - Валидация и очистка при вводе. Используйте
filter_var()для проверки форматов (email, целое число, URL), а для запросов к базе данных используйте подготовленные выражения для защиты от SQL-инъекций — никогда не вставляйте значения$_POSTнапрямую в SQL.
<?php
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
if ($email === false) {
echo "Please enter a valid email address.";
}
?>Пример: полная контактная форма
Форма ниже отправляет три поля в contact.php методом POST. Каждый элемент управления имеет уникальный атрибут name, который становится его ключом в $_POST.
<form action="contact.php" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" />
<label for="email">Email:</label>
<input type="email" id="email" name="email" />
<label for="message">Message:</label>
<textarea id="message" name="message"></textarea>
<input type="submit" value="Submit" />
</form>В файле contact.php сначала убедитесь, что запрос действительно использовал метод POST (чтобы тот же файл мог также отображать пустую форму), затем считайте, валидируйте и экранируйте каждое значение:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
$message = trim($_POST['message'] ?? '');
$errors = [];
if ($name === '') { $errors[] = "Name is required."; }
if ($email === false) { $errors[] = "A valid email is required."; }
if ($message === '') { $errors[] = "Message cannot be empty."; }
if (!$errors) {
// Safe to use the data — e.g. send an email or save to the database
echo "Thanks, " . htmlspecialchars($name) . "! Your message was received.";
} else {
foreach ($errors as $error) {
echo htmlspecialchars($error) . "<br>";
}
}
}
?>Проверка $_SERVER['REQUEST_METHOD'] — стандартный способ определить, просматривает ли пользователь форму или отправляет её. Для более подробного руководства смотрите обработку форм в PHP и валидацию форм в PHP.
Чтение нескольких значений
Когда несколько элементов управления имеют имя, оканчивающееся на [] (флажки, мультиселекты), PHP преобразует их во вложенный массив:
<input type="checkbox" name="colors[]" value="red">
<input type="checkbox" name="colors[]" value="green"><?php
$colors = $_POST['colors'] ?? []; // e.g. ['red', 'green']
foreach ($colors as $color) {
echo htmlspecialchars($color) . "\n";
}
?>Обратите внимание, что непроверенный флажок не отправляет ничего — так что ключ colors может вовсе отсутствовать, именно поэтому так важно значение по умолчанию ?? [].
Заключение
$_POST — основной инструмент для получения данных формы, отправленных в теле запроса. Читать из него так же просто, как обращаться к элементу массива, однако в рабочем коде всегда нужно защищаться от отсутствующих ключей с помощью ?? или isset(), валидировать ввод через filter_var() и экранировать вывод с помощью htmlspecialchars(). В сочетании с подготовленными выражениями для работы с базой данных эти привычки позволяют принимать пользовательский ввод, не подвергая приложение риску XSS или SQL-инъекций.