12 Stimmen

method="post" enctype="text/plain" nicht kompatibel sind?

Wenn ich die

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

Die Formulardaten können nicht ordnungsgemäß an die Datei proc.php gesendet werden. Woran liegt das? Wo liegt das Problem? Warum kann ich die text/plain-Kodierung nicht mit post verwenden, aber ich kann sie mit der get-Methode verwenden?

26voto

jakub.g Punkte 33857

[Überarbeitet]

Die Antwort ist, weil PHP das nicht kann (und es ist kein Fehler):

https://bugs.php.net/bug.php?id=33741

Valid values for enctype in <form> tag are:

application/x-www-form-urlencoded
multipart/form-data

Die erste ist die Standardeinstellung, die zweite benötigen Sie nur, wenn Sie Dateien hochladen.

@Alohci eine Erklärung, warum PHP die Daten nicht ausfüllt $_POST Array, sondern speichern den Wert in einer Variablen $HTTP_RAW_POST_DATA .

Beispiel dafür, was schiefgehen kann bei 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);
?>

Ergebnis:

input1=abc
input2=def
input2=ghi

Keine Möglichkeit zu unterscheiden, was der Wert von input1 y input2 Variablen. Sie kann sein

  • input1= abc\r\ninput2=def , input2= ghi sowie
  • input1= abc , input2= def\r\ninput2=ghi

Bei der Verwendung der beiden anderen genannten Kodierungen gibt es keine derartigen Probleme.

Der Unterschied zwischen GET und POST:

  • in GET sind die Variablen Teil der URL und sind in der URL als Abfragezeichenfolge vorhanden, daher sind sie muss URL-verschlüsselt sein (und das sind sie, auch wenn Sie enctype="text/plain" - wird vom Browser einfach ignoriert; Sie können dies mit Wireshark testen, um die Anforderungspakete abzufangen),
  • Beim Senden von POST sind die Variablen nicht Teil der URL, sondern werden als letzter Header in der HTTP-Anfrage (POSTDATA) gesendet, und Sie können wählen, ob Sie sie als text/plain o application/x-www-form-urlencoded aber die zweite ist die einzige nicht eindeutige Lösung.

12voto

Alohci Punkte 73204

HTML5 definiert, wie Formulardaten zu formatieren sind, die als text/plain hier: https://w3c.github.io/html/sec-forms.html#plain-text-form-data .

Am Ende dieses Abschnitts heißt es:

Nutzdaten im Format text/plain sind dazu bestimmt lesbar sein. Sie sind nicht zuverlässig von Computern interpretierbar, da das Format mehrdeutig ist (zum Beispiel gibt es keine Möglichkeit, einen Zeilenumbruch in einem Wert von einem Zeilenumbruch am Ende des Wertes zu unterscheiden).

Daher ist es nicht unvernünftig, dass PHP nicht versucht, sie zu interpretieren und sie nur in Rohform zur Verfügung stellt. Das scheint mir der richtige Ansatz zu sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X