🧱 Суть

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 APIphp://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

GETPOST
данные в 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 автоматически создаёт суперглобальные массивы для входящих данных

🔗 Связано