Plusieurs entrées avec le même nom via POST en php

119

Est-il possible d'obtenir plusieurs entrées du même nom à publier et d'y accéder depuis PHP? L'idée est la suivante: j'ai un formulaire qui permet la saisie d'un nombre indéfini d'adresses physiques avec d'autres informations. Si je donnais simplement à chacun de ces champs le même nom dans plusieurs entrées et soumettais ces données par courrier, PHP pourrait-il y accéder?

Disons, par exemple, que j'ai cinq entrées sur une page nommée "xyz" et que je veux y accéder en utilisant PHP. Puis-je faire quelque chose comme:

    $_POST['xyz'][0]

Si tel est le cas, cela me faciliterait la vie dix fois, car je pourrais envoyer une quantité indéfinie d'informations via un formulaire et les faire traiter par le serveur simplement en parcourant le tableau d'éléments avec le nom "xyz".

Adam
la source

Réponses:

216

Modifiez les noms de vos entrées:

<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" />

Ensuite:

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

Si tel est le cas, cela me faciliterait la vie dix fois, car je pourrais envoyer une quantité indéfinie d'informations via un formulaire et les faire traiter par le serveur simplement en parcourant le tableau d'éléments avec le nom "xyz".

Notez que ce n'est probablement pas la bonne solution. Évidemment, cela dépend des données que vous envoyez.

Eric
la source
Merci pour l'aide. Comme c'est la réponse la plus complète à ma question, je la choisis comme LA réponse. Cependant, la réponse d'Interstellar_coder est également bonne, mais vous avez expliqué que cela peut potentiellement être un piège s'il est utilisé de manière incorrecte. Je limiterai le nombre maximum d'éléments et je ferai beaucoup de validation sur ce formulaire, donc je ne devrais pas rencontrer de problèmes de sécurité à moins qu'il y ait des problèmes inhérents à cette approche qui n'ont pas été expliqués ici.
Adam
10
@Adam: Après avoir relu votre question, c'est une approche parfaitement accessible. Vous voudrez peut-être aller plus loin et avoir address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... Vous pouvez les lire avec $_POST['address'][0]['city'], par exemple
Eric
Comment cela serait-il alors nommé à l'intérieur du HTML? Cela allégerait peut-être beaucoup la difficulté. L'approche que j'allais adopter est d'avoir plusieurs champs nommés comme suit: l1 [], l2 [], city [], state [], zip [], zip4 []. Ensuite, pour la première adresse, j'utilise simplement $ i == 0 dans chaque champ. Donc, si je comprends bien votre approche, je nommerais probablement mes éléments comme ceci: name = "adresse [] [ville]" pour un champ de ville. Est-ce exact?
Adam
@Adam: Peut-être. Je pense que vous devrez peut-être placer l'index dans le premier [], par exemple [0]. Cela rend le HTML plus difficile à générer, mais les données ne sont pas plus difficiles à lire côté PHP
Eric
La question qui me vient à l'esprit est la suivante: si le champ ira-t-il dans un ordre aléatoire à l'intérieur du tableau? ou seront-ils dans l'ordre dans lequel ils sont présentés dans le formulaire (même si certains champs sont laissés vides)?
rajeev
38

Dans votre html, vous pouvez passer dans un tableau pour le nom ie

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

De cette façon, php recevra un tableau d'adresses.

aziz punjani
la source
3
Bonne et bonne réponse, c'est pourquoi je l'ai votée. Cependant, vous n'en avez pas beaucoup expliqué, c'est pourquoi je ne l'ai pas sélectionné comme réponse à ma question. Cela m'aide énormément, car j'essaie de comprendre celui-ci depuis un moment (comme vous le remarquerez peut-être dans l'une de mes questions précédentes). Mon approche précédente consistait simplement à ajouter toutes les entrées aux champs cachés avec des valeurs séparées * et à réinitialiser les champs d'entrée, mais cette approche est dix fois meilleure car je serai en mesure d'autoriser la suppression des adresses précédemment ajoutées s'il est découvert qu'elles sont Incorrect.
Adam
Faites juste attention à vous rappeler qu'un tableau vide aura un compte de 1 après avoir été POST avec rien à l'index «0». Vous devrez vérifier en utilisant le mot-clé 'vide' if (! Empty ($ arrayName)) {// faire quelque chose}
Fi Horan
10

La réponse d'Eric est correcte, mais le problème est que les champs ne sont pas regroupés. Imaginez que vous ayez plusieurs rues et villes qui vont ensemble:

<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" />

Le résultat serait

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

Pour les regrouper par adresse, je recommanderais plutôt d'utiliser ce qu'Eric a également mentionné dans la section commentaires:

<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" />

Le résultat serait

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

Pour quiconque trouve cela, il convient de noter que vous pouvez définir la valeur de clé dans le nom d'entrée. Grâce à la réponse dans les champs de formulaire POST avec le même attribut de nom, vous pouvez également interagir des chaînes ou des entiers sans guillemets.

Les réponses supposent que cela ne vous dérange pas que la valeur de clé revienne pour PHP, mais vous pouvez définir name=[yourval](string ou int) qui vous permet ensuite de faire référence à un enregistrement existant.

Antony
la source
C'est absurde de l'analyser vous-même. Il n'y a aucun scénario selon lequel cela serait nécessaire.
Javid
0

Ça peut être:

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