web-dev-qa-db-fra.com

POSTAGE de champs de formulaire avec le même attribut de nom

Si vous avez un formulaire contenant des entrées de texte avec des attributs name en double et que le formulaire est publié, pourrez-vous toujours obtenir les valeurs de tous les champs à partir du $_POST tableau en PHP?

36
danwellman

Non. Seul le dernier élément d'entrée sera disponible.

Si vous voulez plusieurs entrées avec le même nom, utilisez name="foo[]" pour l'attribut de nom d'entrée. $_POST contiendra alors un tableau pour foo avec toutes les valeurs des éléments d'entrée.

<form method="post">
    <input name="a[]" value="foo"/>
    <input name="a[]" value="bar"/>
    <input name="a[]" value="baz"/>
    <input type="submit" />
</form>

Voir référence HTML sur Sitepoint .

La raison pour laquelle $_POST ne contiendra la dernière valeur que si vous n'utilisez pas [] est parce que PHP va simplement exploser et aller au-delà de la chaîne de requête brute pour remplir $_POST. Lorsqu'il rencontre une paire nom/valeur qui existe déjà, il écrase la précédente.

Cependant, vous pouvez toujours accéder à la chaîne de requête brute comme ceci:

$rawQueryString = file_get_contents('php://input'))

En supposant que vous ayez un formulaire comme celui-ci:

<form method="post">
    <input type="hidden" name="a" value="foo"/>
    <input type="hidden" name="a" value="bar"/>
    <input type="hidden" name="a" value="baz"/>
    <input type="submit" />
</form>

$ rawQueryString contiendra alors a=foo&a=bar&a=baz.

Vous pouvez ensuite utiliser votre propre logique pour analyser ceci dans un tableau. Une approche naïve serait

$post = array();
foreach (explode('&', file_get_contents('php://input')) as $keyValuePair) {
    list($key, $value) = explode('=', $keyValuePair);
    $post[$key][] = $value;
}

qui vous donnerait alors un tableau de tableaux pour chaque nom dans la chaîne de requête.

71
Gordon

Au lieu de name="nfo[val]" Utilisez simplement name="nfo[val][]" Et dans PHP vous pouvez utiliser une foreach()

Code HTML:

<form method="post">
    <input name="nfo[val][]" value="val1"/>
    <input name="nfo[val][]" value="val2"/>
    <input name="nfo[val][]" value="val3"/>
    <input type="submit" />
</form>

Code PHP:

$output='';
foreach ($nfo['val'] as $key=>$val) {
    $output.= $val.", ";
}

$output Sera: val1, val2, val3

J'espère que cela t'aides!

7
Daniel Mihai

Vous devez en créer un tableau: avec name=inputname[] et obtenez avec la poste, demandez ou obtenez

$inputs = $_POST['inputname'];

print_r($inputs);
6
streetparade

Uniquement si le nom est de type tableau names[] dans ce cas, vous obtiendrez un tableau comme variable dans la variable $ _POST.

2
jpabluz