方法=“post"enctype =“文本/ plain"不兼容


method="post" enctype="text/plain" are not compatible?

当我使用

<form method="post" enctype="text/plain" action="proc.php"> 

表单数据不能正确发送到proc.php文件。为什么?有什么问题吗?为什么我不能使用文本/纯编码与后,但我可以使用它与get方法?

[修订]

答案是,因为PHP不处理它(这不是一个bug):

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>

php:

<?php
print($HTTP_RAW_POST_DATA);
?>
结果:

input1=abc
input2=def
input2=ghi

无法区分input1input2变量的值。可以是

  • inputt1 = abc'r'ninput2=def, input2= ghi,以及
  • input1= abc, input2= def'r'ninput2=ghi

当使用前面提到的另外两种编码时,没有这样的问题。

GET和POST的区别:

  • 在GET中,变量是URL的一部分,并且作为查询字符串存在于URL中,因此它们必须是URL编码的(它们是,即使你写enctype="text/plain" -它只是被浏览器忽略;您可以使用Wireshark来嗅探请求数据包),
  • 发送POST时,变量不是URL的一部分,而是作为HTTP请求(POSTDATA)的最后一个头发送,您可以选择是否要将它们发送为text/plainapplication/x-www-form-urlencoded,但后者是唯一的无歧义解决方案。

HTML5确实定义了如何格式化作为text/plain提交的表单数据:https://w3c.github.io/html/sec-forms.html#plain-text-form-data.

在那部分的底部,它说:

使用文本/纯格式的有效负载旨在人性化可读。它们不能被计算机可靠地解释,因为格式是不明确的(例如,没有办法区分

从值末尾的换行符开始,在值中插入文字换行符。

因此,PHP不试图解释它,只以原始形式提供它并不是不合理的。对我来说,这似乎是正确的方法。

如果您正在使用enctype="text/plain"进行调试,请记住,当使用application/x-www-form-urlencodedmultipart/form-data作为请求中的HTTP Content-Type/enctype时,$_POST仅包含通过HTTP POST方法传递给当前脚本的变量的关联数组。因此,如果你在php脚本中打印$_POST,你将无法在脚本中看到任何内容。

还有一个全局变量叫做$HTTP_RAW_POST_DATA,它在PHP 5.6中被弃用,在PHP 7.0中被移除。你可以用它来查看N'Bayramberdiyev所记录的原始表单数据