Работа с POST-запросами: приём параметров в PHP
Приём параметров POST-запроса в PHP
Основной способ приёма данных POST
PHP предоставляет суперглобальный массив $_POST, содержащий все параметры, переданные методом POST. Ключи массива соответствуют именам полей формы. Пример простейшей обработки:
// форма.html
<form method="post" action="handler.php">
<input type="text" name="username">
<input type="submit">
</form>
// handler.php
$username = $_POST['username'] ?? null;
echo "Привет, " . htmlspecialchars($username);
Php post array (массив $_post в php)
Использование оператора ?? (null coalescing) позволяет избежать ошибки при отсутствии параметра.
Как принять JSON данные через POST?
Если данные приходят в формате JSON (например, от JavaScript fetch), их нельзя прочитать через $_POST. Требуется читать сырое тело запроса:
$json = file_get_contents('php://input');
$data = json_decode($json, true);
// $data теперь ассоциативный массив
Php параметры post (параметры post-запроса в php)
Типичная ошибка:
Забыть указать заголовок Content-Type: application/json в запросе. Тогда $_POST может быть пустым, а php://input содержит строку запроса в формате form-data.
Как обработать множественные поля с одинаковым именем (например, чекбоксы)?
Добавьте к имени поля квадратные скобки: name="items[]". В $_POST придет массив:
// HTML
<input type="checkbox" name="items[]" value="1">
<input type="checkbox" name="items[]" value="2">
// PHP
$items = $_POST['items'] ?? []; // массив значений
Php post link (работа со ссылками в post-запросе php)
Как проверить, был ли отправлен параметр?
Используйте isset():
if (isset($_POST['email'])) {
// параметр присутствует
}
Как безопасно получить значение параметра с фильтрацией?
Функция filter_input позволяет валидировать и очищать данные сразу при получении:
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
// невалидный email
}
Если параметр не существует, filter_input вернет null, а не false. Следует проверять на null отдельно.
Дополнительные замечания
- Всегда экранируйте вывод с помощью htmlspecialchars или используйте подготовленные запросы для SQL.
- При работе с multipart/form-data (загрузка файлов) параметры доступны в $_POST, а файлы – в $_FILES.
Расширенные примеры приёма параметров POST
Пример 1: Комплексная обработка формы регистрации
// HTML форма
<form method="post" action="register.php">
<input type="text" name="username" required>
<input type="email" name="email" required>
<input type="password" name="password" required>
<input type="submit">
</form>
// register.php
$username = trim($_POST['username'] ?? '');
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$password = $_POST['password'] ?? '';
$errors = [];
if (empty($username)) $errors[] = 'Имя пользователя обязательно';
if ($email === false || $email === null) $errors[] = 'Некорректный email';
if (strlen($password) < 6) $errors[] = 'Пароль должен быть не менее 6 символов';
if (empty($errors)) {
// сохранение в БД с хэшированием пароля
$hash = password_hash($password, PASSWORD_DEFAULT);
echo "Регистрация успешна";
} else {
echo implode('<br>', $errors);
}
Результат при неверном email:
Некорректный email Пароль должен быть не менее 6 символов
Пример 2: Приём данных JSON с несколькими объектами
// JavaScript отправка
fetch('api.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify([
{id: 1, name: 'Иван'},
{id: 2, name: 'Мария'}
])
});
// api.php
$json = file_get_contents('php://input');
$users = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo 'Ошибка разбора JSON';
exit;
}
foreach ($users as $user) {
echo "ID: " . htmlspecialchars($user['id']) . ", Name: " . htmlspecialchars($user['name']) . "\n";
}
Результат:
ID: 1, Name: Иван ID: 2, Name: Мария
Пример 3: Использование filter_var_array для фильтрации всех POST параметров
// Определяем правила фильтрации
$filters = [
'username' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 120]]
];
$result = filter_input_array(INPUT_POST, $filters);
// $result['username'] - очищенная строка
// $result['email'] - email или false
// $result['age'] - int или false
if ($result === null) {
echo 'Нет данных POST';
} else {
var_dump($result);
}
Результат для POST (username=John&email=test&age=25):
array(3) {
["username"]=> string(4) "John"
["email"]=> bool(false)
["age"]=> int(25)
}
Пример 4: Обработка данных с загрузкой файла
// HTML форма с enctype="multipart/form-data"
<form method="post" action="upload.php" enctype="multipart/form-data">
<input type="text" name="description">
<input type="file" name="image">
<input type="submit">
</form>
// upload.php
$description = $_POST['description'] ?? '';
$file = $_FILES['image'] ?? null;
if ($file && $file['error'] === UPLOAD_ERR_OK) {
$uploadDir = 'uploads/';
$filename = uniqid() . '-' . basename($file['name']);
if (move_uploaded_file($file['tmp_name'], $uploadDir . $filename)) {
echo "Файл загружен. Описание: " . htmlspecialchars($description);
}
} else {
echo "Ошибка загрузки файла";
}
Пример 5: Получение параметров при использовании application/x-www-form-urlencoded вручную
// Если нужно обработать строку запроса в теле POST (например, при кастомной отправке)
$rawBody = file_get_contents('php://input');
parse_str($rawBody, $params);
// $params теперь содержит ассоциативный массив
echo "Параметр name: " . htmlspecialchars($params['name'] ?? '');