2010-04-02 5 views
6

Angenommen, es 5 Eingänge in Web-Formular sindWird die Datenreihenfolge im Postformular im Webformular gleich sein?

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

Wenn Server-Seite die Post-Daten empfangen, verwende ich eine foreach Daten zu akzeptieren, sagen

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

Wird die Reihenfolge der Daten in Server-Seite gespeichert im Webformular gleich sein? und Cross-Browser, könnte es ein Kriterium sein, alle Browser folgen.

Antwort

7

Nun, die W3C recommentation on HTML forms sagt:

Die Steuer Namen/Werte in aufgeführt sind, die Reihenfolge, wie sie im Dokument erscheinen.

Dennoch würde ich es als etwas riskant betrachten, wenn Ihre App kritisch von diesem Detail abhängt.

+0

Da ich einen Drag-and-Drop-Effekt angewendet habe, damit der Benutzer die Reihenfolge dieser Eingaben ändern kann, kann ich den Index nicht verwenden. Oder sollte ich einen anderen Scipt schreiben, um diese Eingaben beim Post neu zu indizieren? – Edward

+1

@Relax: ähm, in diesem Fall vermute ich, dass sogar der Empfehlungstext der W3C nichts wert ist, da er nun für Interpretationen offen ist, ob "die Reihenfolge im Dokument" das ursprüngliche HTML-Dokument oder das aktuelle DOM bedeutet. Sie sollten also unbedingt versuchen, einen expliziten Index zu verwenden. Vielleicht könnten Sie die Aktualisierung des Indexes in den Drag & Drop-Mechanismus einbeziehen? –

0

Höchstwahrscheinlich ja, aber Sie sollten dies nicht annehmen. Es hängt von Ihrem Browser ab, wie die Eingaben gesendet werden, und zusätzlich garantiert PHP nicht, dass eine foreach-Schleife in derselben Reihenfolge wie die Elemente iteriert.

Es ist eine schlechte Übung, Ihren Eingaben den gleichen Namen zu geben.

Sie können nach jedem Namen einen Index anhängen (sogar mit Javascript, wenn Sie wollen), und dann lesen Sie dies in PHP, um sicherzustellen, dass die Reihenfolge beibehalten wird.

+0

See Dubes Antwort für ein gutes Beispiel dafür. – Ruud

4

PHP verarbeitet bereits die Konvertierung von POSTed/GETed-Variablen in Arrays, wenn Sie [] nach dem Namen eingeben. Tun Sie das, anstatt es selbst falsch zu machen.

+1

Bedeutet es im obigen Beispiel, dass ich das Array durch $ the_same = $ _REQUEST ['the_same'] erhalten kann? Wie sieht es mit der Datenreihenfolge darin aus? – Edward

+1

Die Reihenfolge in dem Array ist die Reihenfolge, in der der Webbrowser die Variablen gesendet hat. Im Allgemeinen sind sie die vorletzten von dem relevanten 'Formular'-Knoten. –

1

bessere Art und Weise in html zu tun:

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

dann in Server:

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

Auf diese Weise keine Variablen überschreiben werden.

1

, wenn Sie es in einer Reihenfolge haben wollen, können Sie die dynamischen Variablen verwenden oder einfach die Array-Zugriff explizit

the_same1 the_same2 the_same3

da Sie die Namen sowieso kennen, können Sie auf sie zugreifen leicht

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

Aber ich habe einen Drag-and-Drop-Effekt angewendet, damit der Benutzer die Reihenfolge der Eingaben ändern konnte, also könnte the_same3 $ the_same [0] sein – Edward

1

Wenn Sie den Namen Ihrer Eingabe in the_same[] ändern - $_REQUEST['the_same'] ein Array aus diesen Werten wird sich zunächst in Element, um zum letzten (alle aktuelle Browser glaube ich).

Sie können auch eine bestimmte Reihenfolge angeben, wenn Sie Zeichenfolgenschlüssel benötigen oder verwenden. Zum Beispiel würde ein <input name='the_same[apple][2]'/>$_REQUEST['the_same']['apple'][2]

werden, ohne die [] auf den Eingangsnamen, wird PHP sieht nur den letzten Wert.Die anderen Werte werden durch den späteren Wert "überschrieben", wenn die /$_POST Arrays konstruiert werden.

Ein Beispiel für die Verwendung, die zu Ihrem Vorteil mit einer Checkbox sein könnte, da die HTML-Checkbox nur einen Wert trägt, wenn überprüft, Sie ein „nicht geprüft“ Wert somtime einreichen möchten:

<input type='hidden' name='check' value='not checked' /> 
<input type='checkbox' name='check' value='checked' /> 
Verwandte Themen