2010-04-02 12 views
6

Zakładając istnieje 5 wejść w formie internetowejCzy kolejność danych w formularzu pocztowym będzie taka sama w formularzu internetowym?

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

Po stronie serwera odbierać dane pocztowe, używam foreach do odbioru danych, powiedzmy

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

Czy kolejność dane zapisane w stronie serwera być tym samym w formie internetowej? i w przeglądarkach, może to być kryterium dla wszystkich przeglądarek.

Odpowiedz

7

Cóż, W3C recommentation on HTML forms mówi:

Kontrola nazwy/wartości są wymienione w kolejności ich występowania w dokumencie.

Mimo to uważam za nieco ryzykowne, aby Twoja aplikacja była krytycznie zależna od tego szczegółu.

+0

Ponieważ zastosowałem efekt przeciągnij i upuść, aby umożliwić użytkownikowi zmianę kolejności tych danych wejściowych, więc nie mogę używać indeksu. Czy powinienem napisać kolejny scipt, aby ponownie zindeksować te dane wejściowe po wpisie? – Edward

+1

@Relax: um, w tym przypadku podejrzewam, że nawet tekst rekomendacji W3C nie jest nic wart, ponieważ jest teraz otwarty na interpretację, "kolejność, w jakiej pojawiają się w dokumencie" oznacza oryginalny dokument HTML lub bieżący DOM. Dlatego zdecydowanie powinieneś używać indeksu jawnego. Być może możesz uwzględnić aktualizację indeksu w mechanizmie przeciągania i upuszczania? –

0

Najprawdopodobniej tak, ale nie należy tego zakładać. Zależnie od przeglądarki, w jaki sposób wysyłane są dane wejściowe, PHP nie gwarantuje, że pętla foreach będzie iterować w tej samej kolejności, w jakiej zostały dodane elementy.

To jest zła praktyka, aby nadać wejściom taką samą nazwę.

Możesz dodać indeks po każdej wartości nazwy (nawet z javascript, jeśli chcesz), a następnie przeczytać to w PHP, aby upewnić się, że zamówienie jest utrzymywane.

+0

See Dube użytkownika odpowiedź na dobry przykład tego. – Ruud

4

PHP już obsługuje konwertowanie zmiennych POSTed/GETed na tablice po umieszczeniu [] po nazwie. Zrób to, zamiast samemu się pomylić.

+1

Czy to oznacza w powyższym przykładzie, mogę uzyskać tablicę przez $ the_same = $ _REQUEST ['the_same']? A co z kolejnością danych w nim? – Edward

+1

Kolejność w tablicy będzie kolejnością, w której przeglądarka wysłała zmienne. Zasadniczo są one od początku do końca z odpowiedniego węzła "formularz". –

1

lepszy sposób to zrobić w html:

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

Następnie serwer:

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

W ten sposób nie będzie zmienna nadpisywania.

1

jeśli chcesz mieć go w porządku, można użyć zmiennych dynamicznych lub po prostu dostęp do tablicy wyraźnie

the_same1 the_same2 the_same3

ponieważ wiesz, nazwiska i tak, można uzyskać do nich dostęp łatwo

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

Ale zastosowałem efekt "przeciągnij i upuść", aby umożliwić użytkownikowi zmianę kolejności wejść, w ten sposób the_same3 może być $ the_same [0] – Edward

1

Jeśli zmienisz nazwę swojego wejścia do the_same[] - $_REQUEST['the_same'] będzie tablica z tych wartości, pierwszego do ostatniego w kolejności elementu (wszystkie uważam, że obecne przeglądarki).

Możesz także określić konkretną kolejność, jeśli potrzebujesz, lub nawet używać kluczy strunowych. Na przykład, <input name='the_same[apple][2]'/> staną $_REQUEST['the_same']['apple'][2]

Bez pomocą [] o nazwach wejściowych, PHP będzie zobaczyć tylko ostatnią wartość.Pozostałe wartości zostaną "nadpisane" przez późniejszą wartość, gdy zbudowane zostaną macierze $_REQUEST///

Przykład użycia że na swoją korzyść może być z wyboru, gdy pole wyboru Kopiuj podnosi tylko wartość, gdy zaznaczone, może chcesz złożyć „nie zaznaczone” wartość somtime:

<input type='hidden' name='check' value='not checked' /> 
<input type='checkbox' name='check' value='checked' /> 
Powiązane problemy