2013-05-14 17 views
10

Według w3c "Kilka pól wyboru w formularzu może mieć tę samą nazwę kontrolną, dlatego na przykład pola wyboru pozwalają użytkownikom wybrać kilka wartości dla tej samej właściwości." Jeśli jednak to zrobisz, PHP przyjmie tylko ostatnią wartość. Na przykład:Kilka pól wyboru o tej samej nazwie

<?php 
if ($_POST) { 
echo "<pre>"; 
print_R($_POST); 
echo "</pre>"; 
} 
?> 
<form action="" method = "post"> 
<input type="checkbox" name="pet" value="dog" />Dog<br /> 
<input type="checkbox" name="pet" value="Cat" />Cat<br /> 
<input type="checkbox" name="pet" value="bird" />bird<br /> 
<input type="checkbox" name="pet" value="iguana" />iguana<br /> 
<input type="submit" /> 
</form> 

Jeśli prześlesz ten formularz, zobaczysz, że zostanie ustawione tylko pole wyboru, które pojawi się jako ostatnie. Przeglądarka wysyła je wszystkie, ale zastępują się nawzajem. Tak więc ustawienie tej samej nazwy dla kilku pól wyboru może powodować problemy. Czy to zawsze tak było? Wydaje mi się, że pamiętam, że faktycznie można wysyłać wszystkie wartości jako tablicę.

wiem, że można po prostu dodaj [] na końcu nazwy, aby utworzyć tablicę wartości:

<?php 
if ($_POST) { 
echo "<pre>"; 
print_R($_POST); 
echo "</pre>"; 
} 
?> 
<form action="" method = "post"> 
<input type="checkbox" name="pet[]" value="dog" />Dog<br /> 
<input type="checkbox" name="pet[]" value="Cat" />Cat<br /> 
<input type="checkbox" name="pet[]" value="bird" />bird<br /> 
<input type="checkbox" name="pet[]" value="iguana" />iguana<br /> 
<input type="submit" /> 
</form> 

Ale W3C nie określa tego. Szczerze mówiąc, nie pamiętam, czy zawsze używałem [] na końcu nazwy, ale z jakiegoś powodu myślę, że w pewnym momencie tego nie zrobiłem. Czy był jakiś czas w przeszłości, kiedy mógłbyś sprawić, by działał bez []?

http://www.w3.org/TR/html401/interact/forms.html#checkbox

+1

Musisz użyć '[]', a następnie możesz użyć 'in_array' do określenia, które pola wyboru zostały zaznaczone. Irytujące, ale czy nie wszystkie formy? – thatidiotguy

+1

W3c nie określa tego, ponieważ jest specyficzne dla 'php' (i prawdopodobnie innych języków) i nie jest związane z w3c. Inne języki nie mają tego wymogu. Jak stwierdzono, przeglądarka wysyła wszystkie wartości. –

+0

Widzę obie twoje uwagi. Dzięki. I tak, wszystkie formy są denerwujące. – Buzu

Odpowiedz

5

Że nigdy nie pracował bez [], nie w PHP.

W3C nie precyzuje, w jaki sposób ciągi zapytań są obsługiwane po stronie serwera. (Ignorowanie nieistotnego, obsolete corner of the CGI spec, odnoszącego się tylko do PHP, ponieważ było to do niedawna luka w zabezpieczeniach).

Wygląda na to, że ten wzorzec jest prawidłowym znacznikiem, ale nie jest powszechnie używany z tego powodu, który opisujesz.

Podobny wzór to używany do przycisków radiowych, z których tylko jeden może być wybrany na raz. (W rzeczywistości, podanie wejść radiowych o tej samej nazwie określa sposób, w jaki przeglądarka traktuje je jako grupę). Być może właśnie o tym myślałeś.

+0

Być może. Wiem, że przyciski radiowe są używane w ten sposób, i domyślam się, że masz rację. Byłem obu zdezorientowany. – Buzu

+0

Działa to również w klasycznej ASP. Zwraca także tylko sprawdzone wartości pól wyboru. –

2

Jeśli naprawdę chcesz go w PHP, spróbuj tego:

<?php 

if (count($_POST)) { 
    header("Content-type: text/plain"); 
    $fp = fopen("php://input", "r"); 
    fpassthru($fp); 
    fclose($fp); 
    exit; 
} 

?> 
<form action="" method = "post"> 
<input type="checkbox" name="pet" value="dog" />Dog<br /> 
<input type="checkbox" name="pet" value="Cat" />Cat<br /> 
<input type="checkbox" name="pet" value="bird" />bird<br /> 
<input type="checkbox" name="pet" value="iguana" />iguana<br /> 
<input type="submit" /> 

</form> 

Więcej na php://input strumień można znaleźć w PHP documentation.

+0

Jestem w porządku z wykorzystaniem [], byłem po prostu ciekawy tego. Ale przeczytam ten link, który podałeś tylko dlatego, że zawsze dobrze jest być informowanym. – Buzu