Si tiene un formulario que contiene entradas de texto con duplicado name
atributos, y se publica el formulario, ¿aún podrá obtener los valores de todos los campos del $_POST
matriz en PHP?
Enviar campos de formulario con el mismo atributo de nombre
danwellman
gordon
No. Solo estará disponible el último elemento de entrada.
Si desea múltiples entradas con el mismo nombre, use name="foo[]"
para el atributo de nombre de entrada. $_POST
luego contendrá una matriz para foo con todos los valores de los elementos de entrada.
<form method="post">
<input name="a[]" value="foo"/>
<input name="a[]" value="bar"/>
<input name="a[]" value="baz"/>
<input type="submit" />
</form>
Ver el Referencia HTML en Sitepoint.
La razón por la cual $_POST
solo contendrá el último valor si no usa []
es porque PHP básicamente simplemente explotará y buscará sobre la cadena de consulta sin procesar para completar $_POST
. Cuando encuentra un par de nombre/valor que ya existe, sobrescribe el anterior.
Sin embargo, aún puede acceder a la cadena de consulta sin procesar de esta manera:
$rawQueryString = file_get_contents('php://input'))
Suponiendo que tienes un formulario como este:
<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>
el $rawQueryString
entonces contendrá a=foo&a=bar&a=baz
.
Luego puede usar su propia lógica para analizar esto en una matriz. Un enfoque ingenuo sería
$post = array();
foreach (explode('&', file_get_contents('php://input')) as $keyValuePair) {
list($key, $value) = explode('=', $keyValuePair);
$post[$key][] = $value;
}
que luego le daría una matriz de matrices para cada nombre en la cadena de consulta.
-
ok genial, entonces cada entrada con un nombre duplicado debería ser simplemente name=”foo[]”? No nombre=”foo[0]” ¿o algo?
– danwellman
4 de febrero de 2010 a las 22:30
-
@danwellman Solo
foo[]
lo hará pero también puedes usarfoo[0]
,foo[bar]
e inclusofoo[bar][baz]
. Simplemente pruebe las diversas combinaciones en su servidor web para ver cómo llegan a $_POST.– Gordon
4 de febrero de 2010 a las 22:37
En lugar de name="nfo[val]"
Solo usa name="nfo[val][]"
y en PHP puedes usar un foreach()
Código 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>
código PHP:
$output="";
foreach ($nfo['val'] as $key=>$val) {
$output.= $val.", ";
}
$output
sera: val1, val2, val3
¡Espero que esto ayude!
-
Gran respuesta porque pensé que tendrías que citar val en el formulario html. [val] puede ser una cadena o un entero. ¡Gracias!
– Antonio
12 de septiembre de 2016 a las 8:06
Tienes que crear una matriz de ellos: con name=inputname[]
y obtener con publicación, solicitud u obtener
$inputs = $_POST['inputname'];
print_r($inputs);
Solo si el nombre es de tipo matriz names[]
en ese caso, obtendrá una matriz como variable en la variable $_POST.
Posible duplicado de múltiples entradas con el mismo nombre a través de POST en php
– Ciro Santilli Путлер Капут 六四事
31 mayo 2016 a las 21:45
Esta pregunta es mucho más antigua que el duplicado sugerido y tiene más respuestas. ¿Seguramente ese es un duplicado de este?
– danwellman
31 mayo 2016 a las 21:48
El consenso actual es cerrar con “calidad”: <meta.stackexchange.com/questions/147643/…> Dado que la “calidad” no es medible, solo voy por votos a favor. 😉 Probablemente todo se reduce a qué pregunta encontró las mejores palabras clave nuevas de Google en el título.
– Ciro Santilli Путлер Капут 六四事
31 mayo 2016 a las 21:50