2010-03-26 1 views
14

Ho un modulo HTML:Come mai lo stato della casella di controllo non viene sempre passato allo script PHP?

<form action='process.php' method='post'> 
    <input type='checkbox' name='check_box_1' /> Check me!<br> 
</form> 

Ecco una sezione dallo script PHP process.php:

echo (isset($_POST['check_box_1']))?'Set':'Not set'; 

L'output dello script quando la casella di controllo è impostata è

Set

Ma quando la casella di controllo non è impostato, l'output è:

Non impostare

Perché è questo? Questo sembra un design molto scarso perché il mio script PHP controlla un numero di variabili $_POST per assicurarsi che siano state passate allo script. Se il valore $_POST['check_box_1'] non è impostato, come faccio a sapere se lo script non è riuscito a passare lungo il valore o che la casella di controllo non è stata appena impostata?

risposta

43

Se si vuole superare questa caratteristica del progetto, provate questo:

<input type="hidden" name="check_box_1" value="0" /> 
<input type="checkbox" name="check_box_1" value="1" /> 

In questo modo, avrete sempre $_POST['check_box_1'] set nella pagina richiamata, e quindi si può solo controllare il suo valore per vedere se controllato o no. I due input devono essere in questo ordine, poiché quello successivo avrà la precedenza.

+0

Idea pulita! Non ci ho mai pensato. –

+0

Come ho usato HTML così a lungo e non ho mai saputo nulla di questo! Penso che questo sia il codice più bello che abbia mai visto. – Gerry

+1

Non funziona se hai selezioni multiple come Vodaldrien

3

Sfortunatamente, è così che funziona la specifica per le caselle di controllo nei moduli inviati: se la casella di controllo non è selezionata, il browser non invia necessariamente quel campo.

+0

Questa è un'idea di design molto scarsa! Grazie comunque. –

+2

no, non è così. è efficiente. – Jayrox

5

Solo il valore delle caselle di controllo selezionate viene inviato al server. Questo è un elemento di design HTML/browser e non ha nulla a che fare con PHP. In quale altro modo si distingue in modo affidabile una casella di controllo selezionata da una non selezionata?

... quindi come faccio a sapere se lo script non ha superato il valore o la casella di controllo non è stata impostata?

Ci si può fidare del browser e di PHP per farlo bene. Se non è impostato, la casella non è stata selezionata. Se stai eseguendo alcuni Javascript che inviano il modulo e potresti sbagliare, è tua responsabilità eseguire il debug del tuo script.


Per quanto riguarda "è cattivo design":

E 'efficiente design. Ci sono solo due altre possibilità, data la limitazione che i valori vengono inviati come solo testo:

  1. Invia sia il valore e lo stato a parte, come checkbox:state=checked&checkbox:value=myvalue. Supponiamo per un secondo che ciò non provocherebbe grossi grattacapi e ambiguità in ciò che è permesso per i nomi degli elementi di input e cosa no.
  2. Utilizzare un valore magico per indicare "deselezionato": checkbox=false. Ciò significa che non posso creare un checkbox come questo: <input type="checkbox" name="checkbox" value="false" />

Facciamo finta che entrambe le soluzioni di cui sopra vengano utilizzate e che i problemi ad esse associati vengano risolti. Ciò significherebbe che per ogni checkbox sulla pagina verrà inviato un valore POST. Di solito non è un grosso problema, ma immaginiamo una pagina con 50 checkbox. Non troppo irrealistico direi. Che ne dici di uno con 200?Questo è 200 * ~10+ caratteri aggiuntivi nelle intestazioni HTTP per ogni POST, probabilmente la maggior parte di loro solo che ti dice che cosa l'utente ha fatto non fare.

Poiché questa tecnica è stata inventata quando la larghezza di banda era molto preziosa, è la più efficiente semplicemente per non inviare valori di caselle di controllo non selezionate.

+1

Semplice: 'check_box_1 = true' e' check_box_1 = false' –

+0

Il problema è che alcuni robot malvagi che girano sul web possono richiedere la pagina - e poiché richiederebbe la pagina senza il campo di controllo impostato, dovrei trattarlo solo come un utente legittimo che ha inviato il modulo con la casella di controllo non impostata. –

+0

@George Il protocollo HTTP che viene inviato sopra invia solo testo che non ha alcun tipo. Come si distingue una casella di controllo con valore '" falso "' da una casella di controllo non impostata? – deceze

4

nickf ha fornito la risposta migliore, ma non funzionerà nel caso particolare quando si hanno più caselle con lo stesso nome. Invece (se si sta utilizzando jQuery), è possibile utilizzare una casella di controllo falso per commutare il valore di un vero e proprio, di input nascosto in questo modo:

<input type="checkbox" onclick="$(this).next().val(this.checked?1:0)"/> 
<input type="hidden" name="verified[]"/> 

<input type="checkbox" onclick="$(this).next().val(this.checked?1:0)"/> 
<input type="hidden" name="verified[]"/> 

Nota che solo le caselle di controllo nascoste sono chiamati.