Varias entradas con el mismo nombre a través de POST en php


119

¿Es posible publicar varias entradas con el mismo nombre y luego acceder a ellas desde PHP? La idea es esta: tengo un formulario que permite la entrada de un número indefinido de direcciones físicas junto con otra información. Si simplemente le di a cada uno de esos campos el mismo nombre en varias entradas y enviara esos datos por correo, ¿PHP podría acceder a ellos?

Digamos, por ejemplo, que tengo cinco entradas en una página llamada "xyz" y quiero acceder a ellas usando PHP. ¿Podría hacer algo como:

    $_POST['xyz'][0]

Si es así, eso haría mi vida diez veces más fácil, ya que podría enviar una cantidad indefinida de información a través de un formulario y hacer que el servidor la procese simplemente recorriendo el conjunto de elementos con el nombre "xyz".

Respuestas:


216

Cambie los nombres de sus entradas:

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

Luego:

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

Si es así, eso haría mi vida diez veces más fácil, ya que podría enviar una cantidad indefinida de información a través de un formulario y hacer que el servidor la procese simplemente recorriendo el conjunto de elementos con el nombre "xyz".

Tenga en cuenta que probablemente esta sea la solución incorrecta. Evidentemente, depende de los datos que envíes.


Gracias por la ayuda. Dado que esta es la respuesta más completa a mi pregunta, la elijo como LA respuesta. Sin embargo, la respuesta de Interstellar_coder también es buena, pero ha explicado que esto puede ser un peligro si se usa incorrectamente. Limitaré la cantidad máxima de elementos y realizaré muchas validaciones en este formulario, por lo que no debería tener problemas de seguridad a menos que haya problemas inherentes a este enfoque que no se hayan explicado aquí.
Adam

10
@Adam: Habiendo releído tu pregunta, este es un enfoque perfectamente aceptable. Es posible que desee ir un paso más allá y tener address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... Puede leer estos con $_POST['address'][0]['city'], por ejemplo
Eric

¿Cómo se nombraría entonces esto dentro de HTML? Eso potencialmente aliviaría bastante la dificultad. El enfoque que iba a tomar es tener varios campos denominados así: l1 [], l2 [], ciudad [], estado [], zip [], zip4 []. Luego, para la primera dirección, simplemente uso $ i == 0 en cada campo. Entonces, si entiendo su enfoque correctamente, probablemente nombraría mis elementos así: nombre = "dirección [] [ciudad]" para un campo de ciudad. ¿Es eso correcto?
Adam

@Adam: Posiblemente. Creo que es posible que deba colocar el índice dentro del primero [], como [0]. Eso hace que el HTML sea más difícil de generar, pero los datos no son más difíciles de leer en PHP
Eric

La pregunta que viene a mi mente aquí es: ¿si el campo irá en orden aleatorio dentro de la matriz? ¿O estarán en el orden en que se presentan en forma (incluso si algunos campos se dejan vacíos)?
rajeev

38

En su html puede pasar una matriz para el nombre, es decir

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

De esta forma php recibirá una serie de direcciones.


3
Respuesta buena y correcta, por eso la voté a favor. Sin embargo, no me explicó mucho al respecto, por lo que no lo seleccioné como respuesta a mi pregunta. Esto me ayuda muchísimo, ya que he estado tratando de resolver esto por un tiempo (como puede notar en una de mis preguntas anteriores). Mi enfoque anterior era simplemente agregar todas las entradas a los campos ocultos con * valores separados y restablecer los campos de entrada, pero este enfoque es diez veces mejor ya que podré permitir la eliminación de direcciones agregadas previamente si se descubre que son incorrecto.
Adam

Solo tenga cuidado de recordar que una matriz vacía tendrá un recuento de 1 después de haber sido POST 'sin nada en el índice' 0 '. Deberá verificar usando la palabra clave 'vacío' si (! Vacío ($ arrayName)) {// hacer algo}
Fi Horan

10

La respuesta de Eric es correcta, pero el problema es que los campos no están agrupados. Imagina que tienes varias calles y ciudades que van juntas:

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

El resultado sera

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

Para agruparlos por dirección, prefiero recomendar usar lo que Eric también mencionó en la sección de comentarios:

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

El resultado sera

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

0

Para cualquier otra persona que encuentre esto, vale la pena señalar que puede establecer el valor clave en el nombre de entrada. Gracias a la respuesta en POSTING Form Fields with same Name Attribute , también puede interactuar cadenas o números enteros sin citar.

Las respuestas asumen que no le importa que el valor de la clave regrese para PHP, sin embargo, puede establecer name=[yourval](cadena o int) que luego le permite hacer referencia a un registro existente.


Es una tontería analizarlo usted mismo. No hay escenario de que esto sea necesario.
Javid

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.