Enviar campos de formulario con el mismo atributo de nombre

3 minutos de lectura

Enviar campos de formulario con el mismo atributo de nombre
danwellman

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?

  • 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

Enviar campos de formulario con el mismo atributo de nombre
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 usar foo[0], foo[bar] e incluso foo[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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad