Manuel der Schreckliche: FormData.append - überschreiben neuere Werte ältere?

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

  1. 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 dann

    array(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

    --
    Darmstadt? Ist das nicht da, wo immer der Urologen-Kongress tagt?`
    1. 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

      --
      200 ist das neue 35.
  2. 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

    --
    sumpsi - posui - obstruxi
  3. 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!