🧱 Суть
HTTP-запрос – это способ, с помощью которого клиент (браузер, приложение, API-клиент) отправляет данные серверу.
Схема работы:
Клиент
|
| HTTP Request
↓
PHP-приложение
|
| Обработка данных
↓
HTTP Response
PHP автоматически помещает данные из запроса в специальные суперглобальные массивы:
$_GET– данные из URL-параметров$_POST– данные из тела POST-запроса$_FILES– загруженные файлы
📦 Проблема
1. Пользовательские данные нельзя считать безопасными
Любые данные из запроса могут быть изменены пользователем:
?id=100Пользователь может отправить:
?id=999Поэтому данные нужно:
- проверять
- фильтровать
- валидировать
2. Клиент и сервер работают с разными форматами данных
Например:
HTML-форма:
<input name="email">PHP получает:
$_POST['email'];JSON API:
{
"email": "user@test.com"
}Получение будет другим:
json_decode(
file_get_contents('php://input'),
true
);✅ Решение
Использовать подходящий источник данных:
| Источник | PHP |
|---|---|
| параметры URL | $_GET |
| HTML-форма | $_POST |
| загрузка файлов | $_FILES |
| JSON API | php://input |
💻 Код
`$_GET
$_GET содержит параметры из URL.
Пример запроса:
https://site.com/products?id=10
PHP:
$id = $_GET['id'];
echo $id;Результат:
10
Несколько параметров
URL:
/search?q=php&page=2
PHP:
$query = $_GET['q'];
$page = $_GET['page'];Проверка существования параметра
Плохо:
$name = $_GET['name'];Если параметра нет:
Undefined array key
Лучше:
$name = $_GET['name'] ?? null;Где используется GET
Обычно:
- поиск
- фильтры
- пагинация
- параметры страниц
Пример:
/products?page=2&category=books
$_POST
$_POST содержит данные из тела POST-запроса.
Чаще всего используется для:
- отправки форм
- создания данных
- авторизации
HTML:
<form method="POST">
<input name="email">
<input name="password">
<button>
Login
</button>
</form>PHP:
$email = $_POST['email'];
$password = $_POST['password'];Проверка POST-данных
Например:
$email = $_POST['email'] ?? '';Но этого недостаточно.
Нужно проверить:
- формат
- длину
- обязательность
Пример:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Некорректный email";
}Разница GET и POST
| GET | POST |
|---|---|
| данные в URL | данные в теле запроса |
| можно сохранить в закладки | нельзя сохранить напрямую |
| подходит для получения данных | подходит для изменения данных |
| ограниченный размер | больше данных |
| не скрывает параметры | данные не видны в URL |
Пример:
GET
/user?id=15
Получить пользователя.
POST
POST /user
Создать пользователя.
$_FILES
Используется для загрузки файлов.
Например:
<form
method="POST"
enctype="multipart/form-data"
>
<input
type="file"
name="avatar"
>
<button>
Upload
</button>
</form>Важно:
enctype="multipart/form-data"Без него файл не отправится.
PHP:
$file = $_FILES['avatar'];Структура:
[
'name',
'type',
'tmp_name',
'error',
'size'
]Перемещение файла
После загрузки файл находится во временной папке:
$file['tmp_name'];Чтобы сохранить его:
move_uploaded_file(
$file['tmp_name'],
'uploads/avatar.jpg'
);Проверка загружаемых файлов
Нельзя делать:
move_uploaded_file(
$_FILES['file']['tmp_name'],
'uploads/' . $_FILES['file']['name']
);Проблемы:
- пользователь может загрузить PHP-файл
- имя может содержать опасные символы
- возможна перезапись существующего файла
Правильнее:
Проверять размер
if ($file['size'] > 5_000_000) {
throw new Exception(
'Файл слишком большой'
);
}Проверять MIME-тип
$type = mime_content_type(
$file['tmp_name']
);Генерировать своё имя
$name = uniqid() . '.jpg';Проверка метода запроса
Иногда нужно определить тип запроса:
$_SERVER['REQUEST_METHOD'];Пример:
if (
$_SERVER['REQUEST_METHOD'] === 'POST'
) {
// обработка формы
}HTTP-заголовки
Получить заголовки:
getallheaders();Пример:
$headers = getallheaders();
$token = $headers['Authorization'];Ответ сервера
PHP формирует HTTP-ответ:
echo "Hello";Можно изменить статус:
http_response_code(404);Пример API-ответа:
http_response_code(200);
header(
'Content-Type: application/json'
);
echo json_encode([
'success' => true
]);JSON-запросы вместо POST-форм
Современные API часто отправляют JSON:
Запрос:
{
"name": "Alex",
"age": 25
}Получение:
$data = json_decode(
file_get_contents('php://input'),
true
);Частые ошибки
Использовать данные без проверки
Плохо:
$id = $_GET['id'];
$sql = "
SELECT * FROM users
WHERE id = $id
";Проблема:
- SQL-инъекции
Лучше:
- валидировать данные
- использовать подготовленные запросы
Доверять расширению файла
Плохо:
avatar.php.jpg
Расширение не гарантирует содержимое.
Не проверять наличие данных
Плохо:
$email = $_POST['email'];Лучше:
$email = $_POST['email'] ?? null;Хранить пароль из POST напрямую
Плохо:
$password = $_POST['password'];Для хранения:
password_hash();🎯 Вывод
- HTTP-запросы передают данные между клиентом и сервером
$_GETиспользуется для параметров URL$_POSTиспользуется для отправки данных формами$_FILESиспользуется для загрузки файлов- любые входящие данные нужно проверять
- файлы требуют дополнительной проверки безопасности
- JSON-запросы обычно читаются через
php://input - PHP автоматически создаёт суперглобальные массивы для входящих данных