2011-10-02 85 views
8

當我使用method =「post」enctype =「text/plain」不兼容?

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

形式的數據不能被髮送到正確proc.php文件。爲什麼?問題是什麼?爲什麼我不能在post中使用文本/純文本編碼,但是我可以在get方法中使用它?

+6

我敢肯定你不需要定義加密類型,除非你正在做一個文件上傳,那麼就應該是: ENCTYPE = 「的multipart/form-data的」 [鏈接](HTTP:/ /www.w3.org/TR/html4/interact/forms.html#adef-enctype) – rwyland

+1

根據w3schools([link](http://www.w3schools.com/tags/att_form_enctype.asp)),'application/x-www-form-urlencoded'是默認值。 –

+0

我的問題是爲什麼method =「post」和enctype =「text/plain」不能一起工作?我的HTML代碼不會改變,我應該使用的並不重要!!!!!!!!!!!!!!!!!!! – Narek

回答

21

[修訂]

答案是,因爲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加密類型示例:

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 

無方式來區分guish什麼是input1input2變量的值。它可以是

  • INPUT1 = abc\r\ninput2=def,輸入2 = ghi,以及
  • INPUT1 = abc,輸入2 = def\r\ninput2=ghi

使用之前提到的其他兩種編碼時,沒有這樣的問題。

GET和POST的區別:

    在GET
  • ,變量是URL的一部分,並且在URL作爲查詢字符串都存在,因此它們必須被URL編碼(和它們是,即使如果你寫enctype="text/plain" - 它只是被瀏覽器忽略,你可以使用Wireshark的嗅探請求報文)進行測試,
  • 發送POST時,該變量不是URL的一部分,但在HTTP作爲最後一個頭被送到請求(POSTDATA),並且您可以選擇是否要將它們發送爲text/plainapplication/x-www-form-urlencoded,bu第二個是唯一不含糊的解決方案。
+3

根據[HTML5](http://dev.w3.org/html5/spec/association-of-controls-and-forms.html#attr-fs-enctype),「text/plain」是第三個有效的內容 - 鍵入enctype。格式在http://dev.w3.org/html5/spec/association-of-controls-and-forms.html#plain-text-form-data中描述。 – Alohci

+0

一個不錯的表是[這裏](http://www.w3schools.com/tags/att_form_enctype.asp)(我已經發布了它) –

+5

坦率地說,我從來不相信w3schools說的一個詞。 – Alohci

10

HTML5確實定義瞭如何格式化表單數據,格式爲text/plainhttp://dev.w3.org/html5/spec/association-of-controls-and-forms.html#plain-text-form-data

在該部分的底部,它說:使用純文本/格式

有效載荷旨在是人類可讀 。由於 格式不明確(例如,無法在值的末尾區分換行符和換行符中的 字面換行符),因此它們不可靠計算機可靠解釋。

因此,PHP不會試圖解釋它,只會使它在原始形式中可用。對我來說,這似乎是正確的做法。