Организация ввода в PHP: методы и примеры
Ввод данных в PHP
В PHP существует несколько способов получения данных от пользователя или внешних систем. Выбор метода зависит от контекста: веб-форма, REST API, командная строка или чтение из файла. Основное эффективное решение - использование суперглобальных массивов для стандартных HTTP-запросов и потока php://input для сырых данных, таких как JSON.
Основное решение: комбинация POST и php://input
Для большинства веб-приложений ввод данных осуществляется через POST-формы (для HTML-форм) и через чтение тела запроса (для API). Пример получения данных из формы:
// form.html (отправляет POST)
<form method="POST" action="handler.php">
<input type="text" name="username">
<input type="submit">
</form>
// handler.php
$name = $_POST['username'] ?? '';
echo "Привет, " . htmlspecialchars($name);Когда данные приходят в виде JSON (например, из JavaScript fetch), используют php://input:
$json = file_get_contents('php://input');
$data = json_decode($json, true);
$name = $data['name'] ?? 'гость';
echo "Привет, " . htmlspecialchars($name);Этот подход универсален: он обрабатывает как обычные формы, так и AJAX-запросы.
Как получить данные из строки запроса (GET)?
// URL: http://site.com/page?search=php&limit=10
$search = $_GET['search'] ?? '';
$limit = (int)($_GET['limit'] ?? 0);
echo "Поиск: $search, лимит: $limit";Когда нужен объединённый массив из GET и POST?
$username = $_REQUEST['username'] ?? ''; // может прийти из GET или POSTПроблема: $_REQUEST может содержать cookie, что снижает безопасность. Лучше явно указывать источник.
Как прочитать данные из командной строки (CLI)?
// php script.php arg1 arg2
$argv = $argv ?? []; // массив аргументов
$arg1 = $argv[1] ?? 'нет аргумента';
echo "Первый аргумент: $arg1";
// или чтение с stdin:
$input = fgets(STDIN);
echo "Введено: " . trim($input);Ошибка: при запуске через веб-сервер $_SERVER['argv'] может отсутствовать. Проверяйте через php_sapi_name() для CLI.
Как обработать данные от PUT или DELETE?
// PUT-запрос с JSON
parse_str(file_get_contents('php://input'), $putData);
// или для json:
$json = file_get_contents('php://input');
$data = json_decode($json, true);
$id = $data['id'] ?? 0;
echo "ID: $id";Типичная проблема: суперглобальный $_PUT не существует. Всегда используйте php://input для нестандартных методов.
Расширенные примеры ввода данных
1. Чтение многомерного JSON из php://input
// Отправленный JSON:
// {"user":{"name":"Иван","age":30},"items":[1,2,3]}
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
$name = $data['user']['name'] ?? 'неизвестно';
$count = count($data['items'] ?? []);
echo "Имя: $name, количество элементов: $count";Имя: Иван, количество элементов: 3
2. Обработка формы с несколькими полями и файлами
<form method="POST" enctype="multipart/form-data">
<input type="text" name="data[name]">
<input type="file" name="photo">
<input type="submit">
</form>
// PHP:
$name = $_POST['data']['name'] ?? '';
$file = $_FILES['photo'] ?? null;
if ($file && $file['error'] === UPLOAD_ERR_OK) {
move_uploaded_file($file['tmp_name'], 'uploads/' . $file['name']);
}Файл загружен в uploads/photo.jpg
3. Проверка источника данных с помощью фильтров
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if (!$email) {
echo "Некорректный email";
}
$int = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);4. Чтение сырых POST-данных без парсинга (multipart/form-data)
// Для multipart php://input недоступен (см. документацию)
// Используйте $_POST и $_FILES
// Альтернатива: читать через STDIN при CLI-режиме
if (PHP_SAPI === 'cli') {
$data = stream_get_contents(STDIN);
}5. Ввод из STDIN с таймаутом
$fp = fopen('php://stdin', 'r');
stream_set_timeout($fp, 3); // 3 секунды
$line = fgets($fp);
if (stream_get_meta_data($fp)['timed_out']) {
echo "Таймаут ввода";
} else {
echo "Введено: " . trim($line);
}
fclose($fp);