FormData.append - überschreiben neuere Werte ältere?
Manuel der Schreckliche
- javascript
- php
0 Der Martin0 Auge
1 Rolf B0 Manuel der Schreckliche
Hallo,
Stochere gerade mit FormData
im Dunkeln...
Kurz gesagt möchte ich FormData
via fetch
an eine PHP-Datei zur [zukünftigen] Weiterverarbeitung schicken.
Clientseitig ist es möglich, einem Namen mehrere Werte zuzuordnen.
const formData = new FormData();
formData.append("login", user.value);
formData.append("login", pass.value);
console.log(formData.getAll('login')); // ['Name', '123']
Wird der PHP Befehl var_dump($_POST);
als response clientseitig aufgefangen, gehen aber alle Werte bis auf den letzten offensichtlich verloren. console.log
meldet dann
array(1) {
["login"]=>
string(3) "123"
}
als response.
Wenn ich das richtig interpretiere, muss ich hier auf ein Array "ausweichen", in Richtung
formData.append("login[]", user.value);
formData.append("login[]", pass.value);
Gehe ich recht in der Annahme, dass sonst pass.value
user.value
einfach überschreibt?
Und wenn dem so ist - was bringt dann formData.getAll
überhaupt?
Danke Manuel
n'Abend,
const formData = new FormData(); formData.append("login", user.value); formData.append("login", pass.value); console.log(formData.getAll('login')); // ['Name', '123']
Wird der PHP Befehl
var_dump($_POST);
als response clientseitig aufgefangen, gehen aber alle Werte bis auf den letzten offensichtlich verloren.console.log
meldet dannarray(1) { ["login"]=> string(3) "123" }
als response.
ja, das liegt daran, wie GET- und POST-Parameter in PHP "angenommen" werden. Da wird der Query-String (für $_GET[]) in einzelne key=value-Pärchen zerlegt und dann eins nach dem anderen in der Art
$_GET[key]=value;
zugewiesen. Treten mehrere gleiche Keys auf, überschreiben sie jeweils die vorangegangenen. Für $_POST[] gilt das analog.
Wenn ich das richtig interpretiere, muss ich hier auf ein Array "ausweichen", in Richtung
formData.append("login[]", user.value); formData.append("login[]", pass.value);
Dann bekommst du in PHP ein Array mit allen Werten.
Und wenn dem so ist - was bringt dann
formData.getAll
überhaupt?
Due Frage ist unfair. Stelle nicht in Frage, was Javascript bietet, nur weil PHP an der Stelle anders reagiert. Andere serverseitige Techniken handhaben das vielleicht anders.
Möge die Übung gelingen
Martin
Hallo
Und wenn dem so ist - was bringt dann
formData.getAll
überhaupt?Due Frage ist unfair. Stelle nicht in Frage, was Javascript bietet, nur weil PHP an der Stelle anders reagiert. Andere serverseitige Techniken handhaben das vielleicht anders.
Ja, zum Beispiel Perl. Dort stehen alle übermittelten Werte zur Verfügung.
Tschö, Auge
Hallo Manuel,
FormData kapselt lediglich die Daten eines <form> Elements.
formData.append("login", user.value);
formData.append("login", pass.value);
entspricht diesem HTML
<form>
<input type="text" name="login">
<input type="text" name="login">
</form>
Im realen Leben natürlich mit Labels und Buttons geschmückt.
Du kannst in beide inputs etwas eintragen, und wenn Du beim POST des Formulars an der Leitung schnupperst, findest Du im Body des Requests sowas ähnliches wie
login=foo&login=bar;
Also, eigentlich gar nicht so, weil FormData nicht urlencoded gesendet wird, sondern als multipart/form-data. Aber du weißt, was ich meine, oder? Und PHP kann das unterscheiden.
Eine Web-Application, die einen POST Content manuell auswertet, kann beide login-Werte herausholen und versuchen, damit etwas sinnvolles anzustellen. PHP tut das nicht, es speichert einfach im $_POST Array die Werte unter dem vorgefundenen Namen, und deswegen überschreibt der zweite den ersten. Das geschieht erst bei der Interpretation innerhalb von PHP.
Es ist eine PHP Konvention, diesen Fall mit dem Feldnamen login[] zu lösen. PHP interpretiert das beim Lesen des POST Content entsprechend und erzeugt ein Array aus Werten. Das ist aber eine reine PHP Sache. Dem Browser ist das komplett wurst, der ist mit einem Form, wo alle Felder den gleichen name haben, total glücklich.
Rolf
Danke Martin und Rolf für die rasche Aufklärung!
-- verhält sich im Endeffekt also tatsächlich so wie ich dachte.
Wollte aber eben nur sicher gehen, dass ich da nicht doch etwas fehlinterpretiere.
Due Frage ist unfair. Stelle nicht in Frage, was Javascript bietet, nur weil PHP an der Stelle anders reagiert. Andere serverseitige Techniken handhaben das vielleicht anders.
Vollkommen richtig, diese meine Aussage war ein wenig bescheuert... ...kam mir dann selbst nachdem ich den Text schon abgeschickt hatte.
Javascript kann nichts für PHP 😄
Trotzdem danke für den Hinweis!