2011-10-02 12 views
8

Quando usomethod = "post" enctype = "text/plain" non sono compatibili?

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

dati del modulo non possono essere inviati al proc.php file in modo corretto. Perché? Qual è il problema? Perché non posso usare la codifica text/plain con post ma posso usarlo con get metodo?

+6

Sono abbastanza sicuro che non è necessario definire enctype, a meno che non si sta facendo un caricamento di file, allora dovrebbe essere: enctype = "multipart/form-data" [link] (http://www.w3.org/TR/html4/interact/forms.html#adef-enctype) – rwyland

+1

Secondo w3schools ([link] (http://www.w3schools.com/tags/att_form_enctype.asp)), l'applicazione/x-www-form-urlencoded' è l'impostazione predefinita. –

+0

La mia domanda è perché method = "post" e enctype = "text/plain" non funzionano insieme? Il mio codice HTML non funziona e quello che dovrei usare non importa troppo !!!!!!!!!!!!!!!!!!! – Narek

risposta

21

[rivisto]

La risposta è, perché PHP non gestisce esso (e non è un 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 

Il primo è il default , il secondo è necessario solo quando carichi i file.

@Alohci disponibile spiegazione perché PHP non popolato $_POST matrice, ma memorizzare il valore in una variabile $HTTP_RAW_POST_DATA.

esempio di cosa può andare storto con 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); 
?> 

Risultato:

input1=abc 
input2=def 
input2=ghi 

No modo di distinare Indicare qual è il valore delle variabili input1 e input2. Può essere

  • input1 = abc\r\ninput2=def, input2 = ghi, così come
  • input1 = abc, input2 = def\r\ninput2=ghi

nessun problema del genere quando si utilizzano le altre due codifiche menzionati prima.

La differenza tra GET e POST:

  • in GET, le variabili sono parte di URL e sono presenti in URL come stringa di query, quindi devono essere URL-codificati (e sono anche se scrivi enctype="text/plain" - viene semplicemente ignorato dal browser, puoi testarlo usando Wireshark per annusare i pacchetti di richiesta),
  • quando invii POST, le variabili non fanno parte dell'URL, ma vengono inviate come ultima intestazione in HTTP richiesta (POSTDATA) e puoi scegliere se inviarli come text/plain o application/x-www-form-urlencoded, bu la seconda è l'unica soluzione non ambigua.
+3

Secondo [HTML5] (http://dev.w3.org/html5/spec/association-of-controls-and-forms.html#attr-fs-enctype) 'text/plain' è un terzo contenuto valido- digitare per enctype. Il formato è descritto su http://dev.w3.org/html5/spec/association-of-controls-and-forms.html#plain-text-form-data. – Alohci

+0

un bel tavolo è [qui] (http://www.w3schools.com/tags/att_form_enctype.asp) (L'ho già postato) –

+5

Francamente, non credo mai una parola che dice w3schools. – Alohci

10

HTML5 definisce come formattare i dati del modulo inviati come text/plain qui: http://dev.w3.org/html5/spec/association-of-controls-and-forms.html#plain-text-form-data.

Al fondo di quella sezione, si dice:

payload utilizzando il formato text/plain sono destinati ad essere umano leggibile. Non sono interpretabili in modo affidabile dal computer, poiché il formato è ambiguo (ad esempio, non è possibile distinguere una newline letterale in un valore dalla nuova riga alla fine del valore).

Quindi non è irragionevole che PHP non tenti di interpretarlo e lo renda disponibile solo in forma grezza. Per me, sembra l'approccio corretto.

Problemi correlati