web-dev-qa-db-fra.com

Soumettez un formulaire HTML avec des cases à cocher vides

J'ai un formulaire HTML - avec PHP, j'envoie les données du formulaire dans une base de données MySQL. Certaines des réponses aux questions du formulaire comportent des cases à cocher. De toute évidence, l'utilisateur n'a pas à cocher toutes les cases pour une question. Je veux également rendre les autres questions (y compris les groupes de radio) facultatives.

Cependant, si je soumets le formulaire avec des cases vides, des groupes radio, etc., j'ai reçu une longue liste de messages d'erreur "Index non défini" pour chacun d'eux.

Comment contourner cela? Merci.

39
Tray

Les éléments radio ou cases à cocher non cochés ne sont pas soumis car ils ne sont pas considérés comme réussi . Vous devez donc vérifier s'ils sont envoyés à l'aide de la fonction isset ou empty.

if (isset($_POST['checkbox'])) {
    // checkbox has been checked
}
41
Gumbo

J'ai utilisé cette technique de temps en temps:

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

note: Ceci est interprété différemment dans différentes langues côté serveur, alors testez et ajustez si nécessaire. Merci à SimonSimCity pour l'astuce.

92
ceejayoz

Une case non cochée n'est pas envoyée dans les données POST. Vous devez simplement vérifier si elles sont vides:

if (empty($_POST['myCheckbox']))
     ....
else
     ....

Dans PHP empty() et isset() ne génère pas d'avis.

7
Greg

Voici une solution de contournement simple en utilisant javascript:

avant d'envoyer le formulaire contenant les cases à cocher, définissez les cases "off" sur 0 et vérifiez-les pour vous assurer qu'elles sont soumises. cela fonctionne pour les tableaux de cases à cocher par exemple.

///// exemple //////

donné un formulaire avec id = "formId"

<form id="formId" onSubmit="return formSubmit('formId');" method="POST" action="yourAction.php">

<!--  your checkboxes here . for example: -->

<input type="checkbox" name="cb[]" value="1" >R
<input type="checkbox" name="cb[]" value="1" >G
<input type="checkbox" name="cb[]" value="1" >B

</form>
<?php


if($_POST['cb'][$i] == 0) {
    // empty
} elseif ($_POST['cb'][$i] == 1) {
    // checked
} else {
    // ????
}

?>


<script>

function formSubmit(formId){

var theForm = document.getElementById(formId); // get the form

var cb = theForm.getElementsByTagName('input'); // get the inputs

for(var i=0;i<cb.length;i++){ 
    if(cb[i].type=='checkbox' && !cb[i].checked)  // if this is an unchecked checkbox
    {
       cb[i].value = 0; // set the value to "off"
       cb[i].checked = true; // make sure it submits
    }
}

return true;

}

</script>
5
idf

Pour ajouter au code de fmsf, lorsque j'ajoute des cases à cocher, je les fais un tableau en ayant [] dans le nom

<FORM METHOD=POST ACTION="statistics.jsp?q=1&g=1">
    <input type="radio" name="gerais_radio" value="primeiras">Primeiras Consultas por medico<br/>
    <input type="radio" name="gerais_radio" value="salas">Consultas por Sala <br/>
    <input type="radio" name="gerais_radio" value="assistencia">Pacientes por assistencia<br/>
    <input type="checkbox" name="option[]" value="Option1">Option1<br/>
    <input type="checkbox" name="option[]" value="Option2">Option2<br/>
    <input type="checkbox" name="option[]" value="Option3">Option3<br/>
    <input type="submit" value="Ver">
3
user58670

Utilisez ceci

$myvalue = (isset($_POST['checkbox']) ? $_POST['checkbox'] : 0;

Ou en substituant quelque soit votre valeur nulle au 0

2
Cruachan

Nous avons du mal à détecter lequel a coché ou non.

Si vous remplissez un formulaire dans une boucle for, veuillez utiliser la propriété value en tant que zone de stockage des données:

    <?php for($i=1;$i<6;$i++):?>
    <input type="checkbox" name="active[]" value="<?php echo $i ?>"
    <?endfor;?>

Si vous soumettez le formulaire, vous obtiendrez les numéros de commande des cases à cocher cochées (dans ce cas, j'ai coché les 3e et 4e cases):

   array(1) {       
       ["active"]=>
          array(2) {
            [0]=>       
             string(1) "3"
            [1]=>
             string(1) "4"
          }
   }

Lorsque vous traitez des données de formulaire en boucle, disons dans post.php, utilisez le code suivant pour détecter si la ligne associée est sélectionnée:

    if(in_array($_POST['active'] ,$i)) 
            $answer_result = true;
        else 
            $answer_result = false;

Code final pour les tests:

    <?php if (isset($_POST) && !empty($_POST)):
        echo '<pre>';
        var_dump($_POST);
        echo '</pre>';
    endif;
    ?>
    <form action="test.php" method="post">
    <?php for($i=1;$i<6;$i++):?>
    <input type="checkbox" name="active[]" value="<?php echo $i; ?>" />
    <?php endfor;?>
    <button type="submit">Submit</button>
    </form>
2
tolginho

Bien que de nombreuses réponses aient été soumises, j'ai dû improviser pour ma propre solution car j'ai utilisé les cases à cocher personnalisées. En d'autres termes, aucune des réponses n'a fonctionné pour moi.

Ce que je voulais obtenir, c'est un tableau de cases à cocher, avec des valeurs d'activation et de désactivation. L'astuce consistait à soumettre pour chaque case à cocher la valeur on/off un séparateur. Disons que le séparateur est ";" donc la chaîne que vous obtenez est

;, sur,;,;,;

Ensuite, une fois que vous avez reçu votre message, divisez simplement les données en tableau en utilisant le caractère "," pour le fractionnement, puis si l'élément du tableau contient "on", la case à cocher est activée, sinon, elle est désactivée.

Pour chaque case à cocher, changez l'ID, tout le reste est le même ... et la syntaxe qui se répète est:

    <div>
    <input type="hidden" name="onoffswitch" class="onoffswitch-checkbox" value=";" />
    ...some other custom code here...
    <input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="myonoffswitch1" checked>
    </div>

EDIT: au lieu du ";", vous pouvez utiliser une valeur de chaîne KEY, et ainsi vous saurez que vous n'avez pas gâché la commande, une fois que le POST est obtenu sur le serveur- côté ... de cette façon, vous pouvez facilement créer une carte, un hachage ou autre PS: gardez-les tous les deux dans la même balise div.

1
Damir Olejar