Mehrere Eingaben mit demselben Namen über POST in PHP

119

Ist es möglich, mehrere gleichnamige Eingaben zu veröffentlichen und dann über PHP darauf zuzugreifen? Die Idee ist folgende: Ich habe ein Formular, mit dem eine unbestimmte Anzahl von physischen Adressen zusammen mit anderen Informationen eingegeben werden kann. Wenn ich einfach jedem dieser Felder über mehrere Einträge hinweg denselben Namen geben und diese Daten per Post übermitteln würde, könnte PHP dann darauf zugreifen?

Angenommen, ich habe fünf Eingaben auf einer Seite mit dem Namen "xyz" und möchte mit PHP darauf zugreifen. Könnte ich so etwas machen wie:

    $_POST['xyz'][0]

Wenn ja, würde dies mein Leben zehnmal einfacher machen, da ich eine unbestimmte Menge an Informationen über ein Formular senden und vom Server verarbeiten lassen könnte, indem ich einfach das Array von Elementen mit dem Namen "xyz" durchlaufe.

Adam
quelle

Antworten:

216

Ändern Sie die Namen Ihrer Eingaben:

<input name="xyz[]" value="Lorem" />
<input name="xyz[]" value="ipsum"  />
<input name="xyz[]" value="dolor" />
<input name="xyz[]" value="sit" />
<input name="xyz[]" value="amet" />

Dann:

$_POST['xyz'][0] == 'Lorem'
$_POST['xyz'][4] == 'amet'

Wenn ja, würde das mein Leben zehnmal einfacher machen, da ich eine unbestimmte Menge an Informationen über ein Formular senden und vom Server verarbeiten lassen könnte, indem ich einfach das Array von Elementen mit dem Namen "xyz" durchlaufe.

Beachten Sie, dass dies wahrscheinlich die falsche Lösung ist. Dies hängt natürlich von den Daten ab, die Sie senden.

Eric
quelle
Danke für die Hilfe. Da dies die vollständigste Antwort auf meine Frage ist, wähle ich sie als DIE Antwort. Die Antwort von Interstellar_coder ist jedoch ebenfalls gut, aber Sie haben erklärt, dass dies bei falscher Verwendung möglicherweise eine Gefahr sein kann. Ich werde die maximale Anzahl von Elementen begrenzen und in diesem Formular viele Überprüfungen durchführen. Daher sollte ich keine Sicherheitsprobleme feststellen, es sei denn, dieser Ansatz enthält Probleme, die hier nicht erläutert wurden.
Adam
10
@Adam: Nachdem Sie Ihre Frage erneut gelesen haben, ist dies ein perfekter Ansatz. Sie könnten weiter eine Stufe gehen wollen, und haben address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... Sie können diese mit lesen $_POST['address'][0]['city'], zum Beispiel
Eric
Wie würde dies dann in HTML benannt werden? Das würde die Schwierigkeit möglicherweise um einiges lindern. Der Ansatz, den ich verfolgen wollte, besteht darin, mehrere Felder wie folgt zu benennen: l1 [], l2 [], Stadt [], Bundesland [], zip [], zip4 []. Dann verwende ich für die erste Adresse einfach $ i == 0 in jedem Feld. Wenn ich Ihren Ansatz richtig verstehe, würde ich meine Elemente wahrscheinlich so benennen: name = "address [] [city]" für ein Stadtfeld. Ist das korrekt?
Adam
@ Adam: Möglicherweise. Ich denke, Sie müssen den Index möglicherweise in den ersten []einfügen, z [0]. Das macht es schwieriger, HTML zu generieren, aber die Daten sind nicht schwerer auf der PHP-Seite zu lesen
Eric
Hier fällt mir die Frage ein, ob das Feld innerhalb des Arrays in zufälliger Reihenfolge angezeigt wird. oder werden sie in der Reihenfolge sein, in der sie in Form angeordnet sind (auch wenn einige Felder leer bleiben)?
Rajeev
38

In Ihrem HTML können Sie ein Array für den Namen übergeben, dh

<input type="text" name="address[]" /> 

Auf diese Weise erhält PHP ein Array von Adressen.

Aziz Punjani
quelle
3
Gute und richtige Antwort, deshalb habe ich dafür gestimmt. Sie haben jedoch nicht viel darüber erklärt, weshalb ich es nicht als Antwort auf meine Frage ausgewählt habe. Dies hilft mir eine Menge, da ich schon seit einiger Zeit versucht habe, dies herauszufinden (wie Sie vielleicht in einer meiner vorherigen Fragen bemerken). Mein früherer Ansatz bestand darin, einfach alle Eingaben zu versteckten Feldern mit * getrennten Werten hinzuzufügen und die Eingabefelder zurückzusetzen. Dieser Ansatz ist jedoch zehnmal besser, da ich das Löschen zuvor hinzugefügter Adressen zulassen kann, wenn festgestellt wird, dass dies der Fall ist falsch.
Adam
Denken Sie nur daran, dass ein leeres Array eine Zählung von 1 hat, wenn POST mit nichts am '0'-Index veröffentlicht wurde. Sie müssen überprüfen, indem Sie das Schlüsselwort 'leer' verwenden, wenn (! Leer ($ arrayName)) {// etwas tun}
Fi Horan
10

Die Antwort von Eric ist richtig, aber das Problem ist, dass die Felder nicht gruppiert sind. Stellen Sie sich vor, Sie haben mehrere Straßen und Städte, die zusammengehören:

<h1>First Address</h1>
<input name="street[]" value="Hauptstr" />
<input name="city[]" value="Berlin"  />

<h2>Second Address</h2>
<input name="street[]" value="Wallstreet" />
<input name="city[]" value="New York" />

Das Ergebnis wäre

$POST = [ 'street' => [ 'Hauptstr', 'Wallstreet'], 
          'city' => [ 'Berlin' , 'New York'] ];

Um sie nach Adresse zu gruppieren, würde ich eher empfehlen, das zu verwenden, was Eric auch im Kommentarbereich erwähnt hat:

<h1>First Address</h1>
<input name="address[1][street]" value="Hauptstr" />
<input name="address[1][city]" value="Berlin"  />

<h2>Second Address</h2>
<input name="address[2][street]" value="Wallstreet" />
<input name="address[2][city]" value="New York" />

Das Ergebnis wäre

$POST = [ 'address' => [ 
                 1 => ['street' => 'Hauptstr', 'city' => 'Berlin'],
                 2 => ['street' => 'Wallstreet', 'city' => 'New York'],
              ]
        ]
Adam
quelle
0

Für alle anderen, die dies finden, ist es erwähnenswert, dass Sie den Schlüsselwert im Eingabenamen festlegen können. Dank der Antwort in POSTing Form Fields mit demselben Namensattribut können Sie auch Zeichenfolgen oder Ganzzahlen ohne Anführungszeichen zusammenspielen.

Bei den Antworten wird davon ausgegangen, dass es Ihnen nichts ausmacht, dass der Schlüsselwert für PHP zurückgegeben wird. Sie können jedoch name=[yourval](string oder int) festlegen, dass Sie auf einen vorhandenen Datensatz verweisen können.

Antonius
quelle
Das ist Unsinn, es selbst zu analysieren. Es gibt kein Szenario, in dem dies erforderlich wäre.
Javid
0

Es kann sein:

echo "Welcome".$_POST['firstname'].$_POST['lastname'];
Azeemunnisa
quelle