Pourquoi l'état checkbox n'est pas toujours transmis au script PHP?
J'ai un formulaire HTML:
<form action='process.php' method='post'>
<input type='checkbox' name='check_box_1' /> Check me!<br>
</form>
Ici est une section du script PHP process.php
:
echo (isset($_POST['check_box_1']))?'Set':'Not set';
La sortie du script lorsque la case est
Ensemble
Mais lorsque la case n'est pas définie, la sortie est:
Pas mis
Pourquoi est-ce? Cela semble être une très mauvaise conception parce que mon script PHP vérifie un certain nombre de $_POST
variables pour s'assurer qu'ils étaient passés au script. Lorsque le $_POST['check_box_1']
valeur n'est pas définie, alors comment puis-je savoir si le script a échoué à passer le long de la valeur ou de la case était tout simplement pas ensemble?
source d'informationauteur Nathan Osman
Vous devez vous connecter pour publier un commentaire.
Si vous voulez surmonter cette caractéristique de conception, essayez ceci:
De cette façon, vous aurez toujours
$_POST['check_box_1']
ensemble dans le rappel de la page, et alors vous pouvez simplement vérifier sa valeur pour voir si ils ont vérifié ou non. Les deux entrées doivent être dans l'ordre, mais, depuis que l'autre l'emporte.Seulement la valeur de coché les cases à cocher sont transmis au serveur. C'est un code HTML/navigateur conception de la chose et n'a rien à voir avec PHP. Comment pensez-vous de distinguer de manière fiable un contrôle de case à cocher à partir d'un décochée?
Vous pouvez faire confiance au navigateur et PHP. Si ce n'est pas définie, la case n'était pas cochée. Si vous êtes en cours d'exécution Javascript qui envoie le formulaire et peut se tromper, il est de votre responsabilité de déboguer votre script.
Concernant "c'est une mauvaise conception":
C'est efficace de conception. Il y a seulement deux autres possibilités, compte tenu de la limitation que les valeurs sont à envoyer uniquement sous forme de texte:
checkbox:state=checked&checkbox:value=myvalue
. Imaginons une seconde que ce ne serait pas causer d'énormes maux de tête et les ambiguïtés de ce qui est autorisé pour la saisie des noms d'élément et ce qui ne l'est pas.checkbox=false
. Cela signifie que je ne peux pas faire une case comme ceci:<input type="checkbox" name="checkbox" value="false" />
Imaginons que ce soit la solution ci-dessus peut être utilisé et les problèmes associés avec eux pourrait être résolu. Cela signifie que pour chaque case à cocher sur la page d'une valeur POST serait envoyer. Habituellement, ce n'est pas une grosse affaire, mais imaginons une page avec 50 cases à cocher. Pas trop irréaliste, je dirais. Que dire d'une avec 200? C'est
200 * ~10+
caractères supplémentaires dans les en-têtes HTTP pour chaque POSTE, probablement pour la plupart d'entre eux juste vous dire que l'utilisateur n'a pas faire.Depuis, cette technique a été inventé lorsque la bande passante est très précieux, c'est le plus efficace pour simplement pas envoyer les valeurs de décoché les cases à cocher.
nickf fourni la meilleure réponse, mais il ne fonctionnera pas dans le cas particulier lorsque vous avez plusieurs cases avec le même nom. Au lieu de cela (si vous utilisez jQuery), vous pouvez utiliser une fausse case à cocher pour activer ou désactiver la valeur d'un réel, caché entrée:
Noter que seul le caché des cases à cocher sont nommés.
Malheureusement, c'est ainsi que les spécifications pour les cases à cocher dans soumis des formulaires de fonctionne - si la case n'est pas cochée, le navigateur ne prend pas nécessairement envoyer ce domaine.