Инструменты

Эхо формы

Эхо показывает, что браузер отправил из формы и как эти данные разбирает сервер. На одном примере можно увидеть повторяющиеся поля, вложенные имена и файлы — и разобраться, почему часть значений объединилась, заменилась или вовсе не пришла. Вопросы и ответы.

Форма

Темы:
Теги:

Сервер получил

Здесь появится то, что получил сервер

Часто задаваемые вопросы

Что форма отправляет на сервер?
Список пар: имя поля и его значение. У нескольких пар может быть одно имя, а значение бывает пустым; это ещё не объект с уникальными ключами. Браузер собирает список по правилам 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 значения остаются в адресе и истории браузера.