2010-12-28 13 views
18

He visto una gran cantidad de código PHP que maneja la entrada de formulario en la que los nombres de campo de entrada contienen corchetes. Entiendo que esto de alguna manera da como resultado matrices PHP cuando un script PHP examina la variable $ _POST.Nombres de campo de entrada de formulario que contienen corchetes como campo [índice]

Ejemplo HTML:

<form action='http://zzz.com' method='post'> 
    <input name='fruit[1]' value='apple' /> 
    <input name='fruit[2]' value='banana' /> 
</form> 

Ejemplo URL:

http://zzz.com?fruit[1]=apple&fruit[2]=banana 

Ejemplo de PHP:

assert($_POST['fruit'] === array(1=>'apple', 2=>'banana')); 

Mis preguntas acerca de este:

  • ¿Cuál es el mecanismo detrás de esto? ¿En qué punto se convierten estos nombres que contienen corchetes en matrices? ¿Es esta una característica del protocolo HTTP? De los servidores web? Del lenguaje PHP?

  • Continuando con la pregunta anterior, ¿se trata de un truco de uso común o una herramienta de programación normal?

  • ¿Cuáles son (todas) las reglas para usar corchetes en los nombres de los campos de entrada?

  • ¿Se pueden crear matrices multidimensionales de esta manera?

+0

Gracias por tomarse ese tipo de error, @flup! Puse "PHP" en el título (con una mejor redacción) porque la pregunta solo se aplica al manejo de PHP. Esperando que estés de acuerdo. –

Respuesta

12

¿Cuál es el mecanismo detrás? ¿En cuál apuntan que estos nombres que simplemente contienen , los paréntesis se convierten en matrices? ¿Es esta característica del protocolo HTPP? De servidores web? Del lenguaje PHP?>

Esta es una característica del lenguaje PHP. De hecho, el protocolo HTTP no prohíbe el uso de múltiples parámetros GET/POST idénticos. De acuerdo con la especificación HTTP, lo siguiente:

foo=bar&foo=baz 

no debe dar lugar foo == baz. Estos son dos parámetros con dos valores diferentes. Sin embargo, PHP sobrescribirá el anterior foo con el último, lo que resulta en $_POST['foo'] == 'baz', incluso si pudieran analizarse por separado.

Continuando con la pregunta anterior, es esto un truco de uso común o una herramienta normal de programación?

Depende del punto de vista. En el mundo PHP, es completamente normal, ya que el lenguaje no admite la especificación de múltiples parámetros del mismo nombre sin utilizar los corchetes []. Sin embargo, en el mundo HTTP, foo != foo[].

¿Cuáles son (todas) las reglas de la utilización de corchetes en los nombres de los campos de entrada?

Lo mismo que las matrices de PHP, excepto que no tiene que citar claves de cadena.

¿Se pueden crear matrices multidimensionales de esta manera?

Sí, puedes.

+0

¿Cómo se pueden crear matrices multidimensionales con este método? – Shawn

+1

@Shawn: ¿Te refieres a 'foo [bar] [baz]'? – netcoder

+0

Esa sería la forma de leer la matriz. ¿Qué uso en los elementos de mi formulario para crear dicha matriz? – Shawn

3
  • Esta es característica del lenguaje PHP por completo. HTTP no sabe nada acerca de las matrices. En http sea foo o bar[baz] es sólo un nombre de variable de

  • Es una práctica normal

  • usarlos cuando es útil para usted. Por ejemplo: para agrupar varios campos, que pertenecen a una sola entidad, como news[title] + news[body]

  • Sí. TIAS

5

A mi entender, este es un mecanismo de PHP internamente ver (y análisis) elementos pasaron a través del formulario (GET/POST) con el [] de sufijo e interpretarlos como una matriz de elementos. Al protocolo HTTP no le importa, simplemente pasa el nombre del elemento con su valor asociado en la cadena de consulta.

Ha sido una herramienta de programación normal desde que puedo recordar (creo que incluso recuerdo que se usa más comúnmente para cargas de archivos múltiples cuando tenía enlaces de "agregar archivo" que añaden otro elemento al formulario, usando el mismo nombre (con []) como el anterior.)

Las mismas reglas que se aplican en PHP se aplican en el formulario. Puede usar [] para indexar automáticamente los elementos (para listas genéricas) o listarlos explícitamente usando identificadores de elementos (por ejemplo, archivo [1], archivo [2], etc. (siguiendo mi ejemplo anterior))

Sí, múltiple arreglos tridimensionales pueden ser utilizados.

Para obtener más información, echa un vistazo a propios _POST documentation (especialmente los comentarios) de PHP

+1

@Brad Christie: Nunca aconsejaría leer comentarios en php.net debido a que fueron escritos principalmente por novatos y no están moderados. – zerkms

+3

@zerkms: me permito diferir. Al igual que MSDN, los comentarios son un buen lugar para encontrar problemas comunes y soluciones alternativas. De acuerdo, tienes razón, hay un código malo/malas prácticas allí, a menudo encuentro más buena información que mala en los comentarios. Cualquier cosa que no sea particularmente útil o equivocada a menudo es corregida por los entusiastas más mayores de todos modos. Además, no creo que puedas meterte en problemas tratando los ejemplos que se encuentran allí. Del mismo modo, cualquier persona que pueda sufrir defectos de rendimiento o de seguridad publicados allí está en un nivel en el que, de todos modos, sabría mejor, en mi humilde opinión, por supuesto. –

+0

@Brad Christie: creo que "mejor" no se puede aplicar a la seguridad ;-) Cualquiera de las aplicaciones está bien asegurada o asegurada un poco mejor que nada ;-) En este caso, es mejor ni siquiera ver la solución "poco mejor", pero encuentre una solución que describa las mejores prácticas. – zerkms

Cuestiones relacionadas