- Что форма отправляет на сервер?
- Список пар: имя поля и его значение. У нескольких пар может быть одно имя, а значение бывает пустым; это ещё не объект с уникальными ключами. Браузер собирает список по правилам HTML, а сервер решает, как его представить программе. Поэтому здесь рядом показаны исходные пары и их разбор по правилам PHP. Так можно отличить то, что не отправилось, от того, что изменилось уже при разборе.
- Почему поле не пришло?
- В отправке участвуют поля с
name; одного id недостаточно. Поле с disabled пропускается, с readonly — отправляется. Неотмеченные чекбоксы и радиокнопки тоже пропускаются: сервер не получает от них ни false, ни пустую строку. Кнопка добавляет своё имя и значение, только если форму отправили ею. Пустое текстовое поле, напротив, приходит с пустым значением. Эти различия важны, когда сервер должен понять, что человек очистил поле, а что вообще не участвовало в отправке.
- Чем отличаются GET и POST?
- При
GET данные формы попадают в адрес после ?. Это удобно для поиска и фильтров: результат можно открыть снова по ссылке. POST передаёт данные в теле запроса; его используют, например, для отправки сообщения или загрузки файла. Сам по себе POST не шифрует данные — за защиту при передаче отвечает HTTPS. И у адреса, и у тела запроса есть ограничения по размеру, которые задаёт принимающий сервер.
- Зачем форме enctype?
-
Он определяет, как браузер упакует тело запроса POST. По умолчанию используется application/x-www-form-urlencoded: имена и значения кодируются как параметры ссылки. Если выбран файл, в такой записи от него останется только имя.
Для содержимого файлов нужен multipart/form-data. В нём каждое поле передаётся отдельной частью, а у файла есть имя, тип и содержимое. При отправке FormData через fetch() заголовок Content-Type обычно оставляют браузеру: он сам добавляет разделитель частей, boundary. Вариант text/plain делает запрос читаемым, но не даёт надёжно отличить границы полей от переносов строк внутри значений; для обычной обработки формы он не подходит.
- Как передать несколько значений с одним именем?
-
Браузер умеет отправлять повторяющиеся имена: так приходят, например, несколько выбранных тем. Дальше важно, как сервер их читает. PHP для обычного имени оставляет последнее значение, а tags[] собирает в массив. Записи author[city] и author[site] образуют вложенный массив с ключами. Это правила разбора PHP, а не свойство HTML.
В других обработчиках соглашения могут отличаться. Например, FormData.getAll() в JavaScript возвращает все значения точного имени; скобки для него остаются частью этого имени. Поэтому названия полей нужно согласовать с обработчиком. Скрытое поле перед чекбоксом с тем же именем даст два значения при установленной галочке — и только одно, когда она снята.
- Сохраняются ли типы значений?
- Обычные поля приходят строками. Если передать через форму число просмотров статьи, обработчик получит текстовую запись числа. Значение
false для признака публикации тоже не станет логическим значением автоматически. Даже input type="number" не задаёт тип данных на сервере: он помогает вводить число в браузере. Преобразование и проверка нужны в обработчике. То же относится к файлам: переданное имя и заявленный тип не доказывают, что содержимое им соответствует.
- Как проверить свою форму?
- Укажите
action="https://simonenko.xyz/temp/academy" и method="post"; для файлов добавьте enctype="multipart/form-data". В ответ придёт простой текст с именами и значениями полей, а для изображений — с именами файлов. Чтобы получить разбор на этой странице, добавьте <input type="hidden" name="_view" value="page">. Этот же параметр нужен для проверки формы с GET. Можно отправить и FormData через fetch(): эхо разрешает прочитать ответ со страницы другого сайта.
- Почему результат может оказаться неполным?
- Причины бывают разными: сервер отклонил слишком большой запрос, принял только часть данных или сократил их при показе. Эхо отмечает эти случаи отдельно. Здесь запрос ограничен 12 МБ, а каждый файл — 5 МБ; есть также пределы числа полей, файлов и длины значений. Уже принятые значения на странице сокращаются до тысячи знаков, и это не означает, что данные потерялись при отправке. У вашего обработчика будут свои ограничения: в PHP на приём влияют, например,
post_max_size и upload_max_filesize.
- Что остаётся на сервере после проверки?
- Данные разбираются в памяти, без сохранения значений и файлов на диск или в журналы. У файлов учитываются имя, тип и размер; содержимое не сохраняется и обратно не возвращается. Страница результата отдаётся с запретом кеширования, исключена из индексации и не подключает счётчики посещений. При GET значения остаются в адресе и истории браузера.