当我使用
<form method="post" enctype="text/plain" action="proc.php">
表单数据不能正确发送到proc.php文件。为什么?有什么问题吗?为什么我不能使用文本/纯编码与后,但我可以使用它与get方法?
[修订]
答案是,因为PHP不处理它(这不是一个bug):
https://bugs.php.net/bug.php?id=33741Valid 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
无法区分input1
和input2
变量的值。可以是
- 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/plain
或application/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-urlencoded
或multipart/form-data
作为请求中的HTTP Content-Type/enctype
时,$_POST
仅包含通过HTTP POST方法传递给当前脚本的变量的关联数组。因此,如果你在php脚本中打印$_POST
,你将无法在脚本中看到任何内容。
还有一个全局变量叫做$HTTP_RAW_POST_DATA
,它在PHP 5.6中被弃用,在PHP 7.0中被移除。你可以用它来查看N'Bayramberdiyev所记录的原始表单数据