Когда я использую
<form method="post" enctype="text/plain" action="proc.php">
данные формы не могут быть отправлены в файл proc.php должным образом. Зачем? В чем проблема? Почему я не могу использовать текстовую / обычную кодировку с сообщением, но я могу использовать ее с методом get?
[ После доработки]
Ответ в том, что PHP не справляется с этим (и это не ошибка):
https://bugs.php.net/bug.php?id=33741
Valid values for enctype in <form> tag are: application/x-www-form-urlencoded multipart/form-data
Первый – по умолчанию, второй – только при загрузке файлов.
@Alohci предоставил объяснение, почему PHP не заполняет массив $_POST
, но сохраняет значение внутри переменной $HTTP_RAW_POST_DATA
.
Пример того, что может пойти не так с text/plain
enctype:
file1.php:
<form method="post" enctype="text/plain" action="file2.php"> <textarea name="input1">abc input2=def</textarea> <input name="input2" value="ghi" /> <input type="submit"> </form>
file2.php:
<?php print($HTTP_RAW_POST_DATA); ?>
Результат:
input1=abc input2=def input2=ghi
Невозможно отличить значение переменных input1
и input2
. Может быть
abc\r\ninput2=def
, input2 = ghi
, а также abc
, input2 = def\r\ninput2=ghi
Нет такой проблемы при использовании двух других кодировок, упомянутых ранее.
Разница между GET и POST:
enctype="text/plain"
– он просто игнорируется браузером; вы можете протестировать его, используя Wireshark, чтобы обнюхать пакеты запросов), text/plain
или application/x-www-form-urlencoded
, но второе – единственное недвусмысленное решение. HTML5 определяет, как форматировать данные формы, представленные как text/plain
здесь: http://dev.w3.org/html5/spec/association-of-controls-and-forms.html#plain-text-form-data .
В нижней части этого раздела говорится:
Полезная нагрузка с использованием текстового / обычного формата предназначена для чтения человеком. Они не надежно интерпретируются компьютером, так как формат неоднозначен (например, нет способа отличить литерал новой строки от значения новой строки в конце значения).
Поэтому неразумно, что PHP не пытается интерпретировать его и только делает его доступным в необработанном виде. Для меня это кажется правильным.