W3docs

Суперглобальные переменные 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-инъекций.

Практика

Практика
Для чего используется метод 'POST' в PHP?
Для чего используется метод 'POST' в PHP?
Was this page helpful?