2010-04-02 12 views
6

Suponiendo que hay 5 entradas en forma de banda¿El pedido de datos en forma de publicación será el mismo en el formulario web?

<input name='the_same[]' value='different' /> 
<input name='the_same[]' value='different' /> 
<input name='the_same[]' value='different' /> 
<input name='the_same[]' value='different' /> 
<input name='the_same[]' value='different' /> 

Cuando el servidor recibe los datos de envío, uso un foreach para aceptar datos, digo

$the_same = new array(); 
foreach($_POST['the_same'] as $data) 
    $the_same[] = $data; 

¿El orden de los datos guardados en el lado del servidor ser lo mismo en forma de web? y navegadores cruzados, podría ser un criterio que siguen todos los navegadores.

Respuesta

7

Bueno, el W3C recommentation on HTML forms hace decir:

El control de nombres/valores se enumeran en el orden en que aparecen en el documento.

Aún así, considero que es un poco arriesgado que su aplicación dependa de manera crítica de ese detalle.

+0

Porque apliqué un efecto de arrastrar y soltar para permitir al usuario cambiar el orden de estas entradas, por lo que no puedo usar el índice. ¿O debería escribir otro scipt para reindexar estas entradas cuando se publique? – Edward

+1

@Relax: en ese caso, sospecho que incluso el texto de recomendación del W3C no vale nada, ya que ahora está abierto a interpretación si "el orden en que aparecen en el documento" significa el documento HTML original o el DOM actual. Por lo tanto, definitivamente debes intentar usar un índice explícito. ¿Quizás podría incluir la actualización del índice en el mecanismo de arrastrar y soltar? –

0

Es muy probable que sí, pero no debe suponer esto. Depende de su navegador cómo se envían las entradas, y adicionalmente PHP no garantiza que un bucle foreach itere en el mismo orden en que se agregaron los elementos.

Es una mala práctica darles a tus entradas el mismo nombre.

Puede agregar un índice después de cada valor de nombre (incluso con javascript si lo desea), y luego leer esto en PHP para asegurarse de que se mantenga el orden.

+0

Ver Dube de responde por un buen ejemplo de esto. – Ruud

4

PHP ya maneja la conversión de variables POSTed/GET en matrices cuando pone [] después del nombre. Haz eso en lugar de equivocarte tú mismo.

+1

¿Significa que en el ejemplo anterior, puedo obtener la matriz por $ the_same = $ _REQUEST ['the_same']? ¿Qué tal el orden de datos en él? – Edward

+1

El orden en la matriz será el orden en el que el navegador web envió las variables. En general, son las penúltimas desde el nodo 'form' relevante. –

1

mejor manera de hacerlo en html:

<input name='the_same[]' value='different' /> 

Luego, en el servidor:

$the_same = new array(); 
foreach($_POST['the_same'] as $data) // or $_GET if you prefer 
    $the_same[] = $data; 

De esta manera ninguna variable será de sobreescritura.

1

si desea tenerlo en un orden, es posible utilizar las variables dinámicas o simplemente acceder a la matriz explícitamente

the_same1 the_same2 the_same3

ya se conocen los nombres de todos modos, se puede acceder a ellos fácilmente

$the_same = array(); 
for($i=1; ; $i++){ 
    $tmp =$_REQUEST["the_same".$i] 
    if(empty($tmp)){ 
      // no more stuff 
      break; 
    } 
    $the_same[] = $tmp; 
} 
+0

Pero apliqué un efecto de arrastrar y soltar para permitir al usuario cambiar el orden de las entradas, por lo tanto, the_same3 podría ser $ the_same [0] – Edward

1

Si cambia el nombre de su entrada a the_same[]-$_REQUEST['the_same'] se convertirá en una gran variedad de estos valores, el primero al último en orden de elementos (todo navegadores actuales, creo).

También puede especificar un pedido específico si lo necesita, o incluso utilizar las teclas de cadena. Por ejemplo, un <input name='the_same[apple][2]'/> se convertiría en $_REQUEST['the_same']['apple'][2]

Sin utilizar el [] en los nombres de entrada, PHP sólo verá la último valor.Los demás valores serán 'sobreescritos' por el valor posterior cuando se construyan las matrices $_REQUEST/$_GET/$_POST.

Un ejemplo del uso que a su ventaja podría ser con una casilla de verificación, como la casilla de verificación sólo HTML presenta un valor en caso de control, es posible que desee presentar una "no marcado" valor somtime:

<input type='hidden' name='check' value='not checked' /> 
<input type='checkbox' name='check' value='checked' /> 
Cuestiones relacionadas