2010-03-26 17 views
14

Tengo un formulario HTML:¿Cómo es que el estado de la casilla de verificación no siempre se transmite al script PHP?

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

Aquí es una sección del script PHP process.php:

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

La salida del script cuando se establece la casilla de verificación es

Conjunto

Pero cuando la casilla de verificación no está activada, la salida es:

No Configurado

¿Por qué es esto? Esto parece un diseño muy pobre porque mi script PHP verifica una serie de variables $_POST para asegurarme de que se pasaron al script. Cuando el valor $_POST['check_box_1'] no está establecido, ¿cómo sé si el script no pasó el valor o simplemente no se configuró la casilla de verificación?

Respuesta

43

Si desea superar esta característica de diseño, prueba esto:

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

De esta manera, usted siempre tendrá $_POST['check_box_1'] conjunto en la página de devolución de llamada, y a continuación, puedes comprobar su valor para ver si comprobado o no. Sin embargo, las dos entradas deben estar en ese orden, ya que la última tendrá prioridad.

+0

¡Buena idea! Nunca pensé en eso. –

+0

¿Cómo he estado usando HTML por tanto tiempo y nunca he sabido de esto? Creo que este es el código más hermoso que he visto en mi vida. – Gerry

+1

No funciona si tiene varias selecciones como Vodaldrien

3

Lamentablemente, así es como funciona la especificación de las casillas de verificación en los formularios enviados: si la casilla de verificación no está marcada, el navegador no envía necesariamente ese campo.

+0

¡Esa es una idea de diseño muy pobre! Gracias de cualquier manera. –

+2

no, no es así. es eficiente – Jayrox

5

Solo se envía al servidor el valor de las casillas de verificación marcadas. Esto es algo de diseño de HTML/navegador y no tiene nada que ver con PHP. ¿De qué otra manera distingue de manera confiable una casilla de verificación marcada de una casilla no marcada?

... entonces, ¿cómo sé si el script no pasó el valor o simplemente no se configuró la casilla de verificación?

Puede confiar en el navegador y PHP para hacerlo bien. Si no está configurado, la casilla no fue marcada. Si está ejecutando un código JavaScript que envía el formulario y puede equivocarse, es su responsabilidad depurar su secuencia de comandos.


En cuanto a "es un mal diseño":

Es eficiente diseño. Sólo hay dos otras posibilidades, dada la limitación de que los valores se envían como único texto:

  1. Enviar el valor y el estado separado, como checkbox:state=checked&checkbox:value=myvalue. Imaginemos por un segundo que esto no causaría grandes dolores de cabeza y ambigüedades en lo que se permite para los nombres de elementos de entrada y lo que no.
  2. Utilice un valor mágico para indicar "desmarcado": checkbox=false. Eso significa que no puedo marcar una casilla como esta: <input type="checkbox" name="checkbox" value="false" />

Imaginemos que cualquiera de las soluciones anteriores se usaría y se solucionarían los problemas asociados con ellas. Eso significaría que por cada casilla de verificación en la página se enviaría un valor POST. Por lo general, eso no es gran cosa, pero imaginemos una página con 50 casillas de verificación. No es demasiado poco realista, diría yo. ¿Qué tal uno con 200?Eso es 200 * ~10+ caracteres adicionales en encabezados HTTP para cada POST, probablemente la mayoría de ellos solo le dicen lo que el usuario hizo no do.

Dado que esta técnica se inventó cuando el ancho de banda era muy valioso, es el más eficiente para simplemente no enviar valores de casillas de verificación no marcadas.

+1

Fácil: 'check_box_1 = true' y' check_box_1 = false' –

+0

El problema es que algunos robots malintencionados que deambulan por la web pueden solicitar la página, y como solicitaría la página sin el campo de casillas de verificación, tendría que tratarlo solo como un usuario legítimo que envió el formulario sin la casilla de verificación. –

+0

@George El protocolo HTTP que se envía solo envía texto que no tiene ningún tipo. ¿Cómo se distingue una casilla de verificación con el valor '" falso "' de una casilla de verificación no establecida? – deceze

4

nickf proporcionó la mejor respuesta, pero no funcionará en el caso especial cuando tenga varias casillas de verificación con el mismo nombre. En su lugar (si está usando jQuery), puede utilizar una casilla de verificación falsa para cambiar el valor de una entrada real oculto de esta manera:

<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[]"/> 

Tenga en cuenta que sólo las casillas ocultas se nombran.

Cuestiones relacionadas