Czy prawidłowe jest posiadanie dwóch elementów wejściowych o tej samej nazwie?


Odpowiedzi:


61

Tak, to jest ważne

To jest dobre

<form name="form1">
  <input type="hidden" name="url" value="1">
</form>

<form name="form2">
  <input type="hidden" name="url" value="2">
</form>

Jest to również w porządku i będzie generalnie interpretowane jako tablica wartości, np. W {url: [1, 2]}zależności od tego, co robi twój serwer. W kodowaniu adresu URL będzie to wyglądać url=1&url=2.

<form name="form1">
  <input type="hidden" name="url" value="1">
  <input type="hidden" name="url" value="2">
</form>

28
To jest ważne. Nie spowoduje to zamieszania w języku po stronie serwera (nawet PHP, z jego konwencjami nazewnictwa pól, które mają wspólną nazwę, będzie konsekwentnie i przewidywalnie obsługiwać wiele danych wejściowych, które nie używają tej konwencji). Nie spowoduje to zamieszania w JavaScript (który przedstawi elementy jako kolekcję i nie będzie ignorował żadnego z nich). Może / może / spowodować zamieszanie u autorów, którzy piszą kod nie wiedząc, co robią, ale specyfikacja jest w porządku.
Quentin

@David Dorward: Dzięki za wyjaśnienie, usunąłem tę część.

14
Ten post jest mylący. wejścia o tej samej nazwie to ta sama forma są częścią standardu HTML - służą np. do checkboxów.
beldaz

1
W jednym formularzu można umieścić wiele danych wejściowych (ukrytych lub innych) o tej samej nazwie. Co więcej, jest to bardzo przydatne przy przesyłaniu strukturalnych list lub map asocjacyjnych i często jest znacznie czystsze (i mniej kruche) niż hacky serializacja DIY.
candu

1
Wiem, że to stary post, ale należy go wyjaśnić. PHP wymaga, abyś powiedział, że elementy tworzą tablicę w ten sposób: <code> <input type = "hidden" name = "url []" value = ....... </code> Jeśli nie zrób to, php weźmie ostatnią wartość z ostatniego pola i podłączy ją do tablicy formularza dla klucza "url".
Mark C.

12

Tak.

Co więcej, jest to niezbędne, jeśli masz do czynienia z grupami przycisków opcji.


Dokładnie. Lub za pomocą pól wyboru, w którym to przypadku możesz umieścić [] na końcu „url []” i utworzy to tablicę do pobrania.
Kerry Jones

2
@Kerry - To jest PHPizm. Większość bibliotek obsługujących formularze jest zadowolona, ​​że ​​nie ma specjalnych nazw dla grup kontrolek.
Quentin

8

Komunikat „To nie jest dobre” jest poprawnie analizowany w każdej przeglądarce, którą znam; jeśli dwa adresy URL pojawią się w ciągu zakodowanym jako adres URL, zostanie on potraktowany jako tablica. Spróbuj tego w JQuery:

$('<form name="form1">\
     <input type="hidden" name="url" value="1">\
     <input type="hidden" name="url" value="2">\
</form>').serialize()

a otrzymasz: "url=1&url=2"

dobrze napisany parser ciągu zapytania zwróci strukturę JSON w następujący sposób:

 {"url":["1", "2"]}

Czy to ściśle specyfikacja? Nie, ale też nie tworzy wielowierszowego ciągu poprzez ucieczkę EOL z ukośnikiem odwrotnym, jak to zrobiłem powyżej.


6

Tak - każdy prześle tylko wraz z odpowiednimi formularzami.

Jeśli masz je w tej samej formie, jeden zastąpi drugi i nie jest ważny.

EDYCJA: Jak wskazał Mahmoodvcs, nadpisywanie występuje tylko w niektórych językach (takich jak PHP) i nie jest nieodłączne w samym HTML.


12
Mylisz się. Jeśli masz wiele wejść o tej samej nazwie, jedno nie zastąpi drugiego. Wszystkie dane wejściowe zostaną dołączone do treści żądania w kolejności, w jakiej pojawiają się w html. I to jest prawidłowe: formularz HTML z wieloma ukrytymi elementami sterującymi o tej samej nazwie
Mahmoodvcs

5
@Mahmoodvcs: To nie jest do końca prawdą. Jeśli formularz zostanie wysłany do usługi PHP, wygrywa ostatnia wartość. Jeśli chcesz przypisać wiele wartości do nazwy, każda nazwa musi kończyć się na „[]”.
Jeff Lowery

6
Mówimy tutaj o HTML, a nie PHP.
Mahmoodvcs

2
@yardpenalty - Nie rozumiem twojego pytania (nie jestem pewien, czy Jeff odpowie), ale jeśli kwestionujesz umiejętności PHP, to na pewno prawda (przynajmniej przed PHP7 - nie sprawdziłem, czy się zmieniły to jeszcze)
Kerry Jones

Przepraszam, że to rozgryzłem. Jeśli zamierzasz przetwarzać za pomocą php, musisz utworzyć tablicę nazw. Myślę, że to bootstrap potrzebuje przycisków radiowych, aby miały taką samą nazwę czy coś. W każdym razie tak, możesz.
yardpenalty.com


2

A) Twój pierwszy przykład jest w porządku, ponieważ czas składania formularzy będzie inny:

<form id="1">
    <input type="hidden" name="url" value="1">  
</form>
<form id="2">
    <input type="hidden" name="url" value="2">  
</form>

B) Twój drugi przykład również jest w porządku, ale nie jest to standardowa praktyka kodowania:

<form>
    <input type="hidden" name="url" value="1">  
    <input type="hidden" name="url" value="2">  
</form>

Kod Java dwa wyodrębnia obie wartości:

Map<String,String[]> parmMap = requestObj.getParameterMap();   
String input1 = parmMap.get("url")[0];   
String input2 = parmMap.get("url")[1];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.