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>
ZachB
źródło
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.

Quentin
źródło
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.

Jeff Lowery
źródło
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.

Kerry Jones
źródło
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
3

Aby sprawdzić, czy jest prawidłowy, czy nie, utwórz swoją stronę i przetestuj w W3C tutaj:

http://validator.w3.org/

Wassim AZIRAR
źródło
I mam nadzieję, że walidator jest bezbłędny :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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];
Aksahy N Shelke
źródło