2013-05-14 14 views
10

Secondo w3c "Diverse caselle di controllo in un modulo possono condividere lo stesso nome di controllo, ad esempio, le caselle di controllo consentono agli utenti di selezionare diversi valori per la stessa proprietà." Tuttavia, se lo fai, PHP prenderà solo l'ultimo valore. Per esempio:Diverse caselle di controllo che condividono lo stesso nome

<?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> 

Se si invia quella forma, si vedrà che solo la casella selezionata che appare ultima sarà impostata. Il browser li invia tutti, ma si sovrascrivono a vicenda. Pertanto, l'impostazione dello stesso nome su più checkbox può causare problemi. È sempre stato così? Mi sembra di ricordare che era possibile inviare tutti i valori come array.

So che si può solo aggiungere un [] alla fine del nome per creare una matrice di valori:

<?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> 

Ma il W3C non precisano che. Onestamente non ricordo se ho sempre usato il [] alla fine del nome, ma per qualche ragione penso che a un certo punto non l'ho fatto. C'è stato un tempo in passato in cui si poteva far funzionare senza il []?

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

+1

È necessario utilizzare '[]' e quindi è possibile utilizzare 'in_array' per determinare quali caselle di controllo sono state selezionate. Fastidioso, ma non tutte le forme? – thatidiotguy

+1

w3c non lo specifica perché è specifico per 'php' (e possibilmente altre lingue) e non è relativo al w3c. Altre lingue non hanno questo requisito. Come hai affermato, il browser invia tutti i valori. –

+0

Vedo entrambi i tuoi punti. Grazie. E sì, tutte le forme sono fastidiose. – Buzu

risposta

5

che non avrebbe mai funzionato senza il [], non in PHP.

W3C non specifica nulla su come le stringhe di query sono gestite lato server. (Ignorando un irrilevante, obsolete corner of the CGI spec, rilevante solo per PHP in quanto era un buco di sicurezza fino a poco tempo fa).

Sembra che questo modello sia un markup valido, ma non comunemente usato, per il motivo che descrivi.

Un modello simile è utilizzato per i pulsanti di opzione, di cui è possibile selezionare solo uno alla volta. (In effetti, dare agli ingressi radio lo stesso nome è come il browser sa trattarli come un gruppo). Forse è quello che stavi pensando.

+0

Forse. So che i pulsanti radio sono usati in questo modo, e suppongo che tu abbia ragione. Mi stavo confondendo entrambi. – Buzu

+0

Funziona anche in ASP classico. Inoltre restituisce solo i valori verificati delle caselle di controllo. –

2

Se si vuole veramente che in PHP, provate questo:

<?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> 

Altro su php://input flusso può essere trovato in PHP documentation.

+0

Sto bene con il [], ero solo curioso. Ma leggerò il link che hai fornito solo perché è sempre bene essere informato. – Buzu

Problemi correlati