web-dev-qa-db-fra.com

Comment obtenir de la valeur pour une case à cocher non cochée dans les éléments de la case à cocher lorsque le formulaire est publié?

J'ai un formulaire comme ci-dessous:

<form action="" method="post">
    <input type="checkbox" id="status_1" name="status_1" value="1" />
    <input type="checkbox" id="status_2" name="status_2" value="1" />
    <input type="checkbox" id="status_3" name="status_3" value="1" />
</form>

Lorsque je coche toutes les cases et que je poste le formulaire, le résultat est le suivant:

Array ([status_3] => 1 [status_2] => 1 [status_1] => 1 ) 

Ensuite, je décoche la deuxième case à cocher et je poste le formulaire, le résultat est le suivant:

Array ( [status_3] => 1 [status_1] => 1 ) 

Est-il possible de faire un résultat comme celui-ci ci-dessous lorsque je décoche la deuxième case à cocher:

Array ( [status_3] => 1 [status_2] => 0 [status_1] => 1 ) 

Il y a des idées pour le faire?

26
Fredy

Première façon - champs cachés (inconvénient: l'utilisateur peut manipuler la valeur du champ (mais on peut aussi manipuler la valeur de la case à cocher, donc ce n'est pas vraiment un problème, si vous vous attendez à seulement 1 ou 0))

<form action="" method="post">
<input type="hidden" name="status_1" value="0" />
<input type="checkbox" id="status_1" name="status_1" value="1" />
<input type="hidden" name="status_2" value="0" />
<input type="checkbox" id="status_2" name="status_2" value="1" />
<input type="hidden" name="status_3" value="0" />
<input type="checkbox" id="status_3" name="status_3" value="1" />
<input type="submit" />
</form>
<?php
var_dump($_POST);
/*
 * checking only the second box outputs:
 * 
 * array (size=3)
  'status_1' => string '0' (length=1)
  'status_2' => string '1' (length=1)
  'status_3' => string '0' (length=1)
 */

Deuxième méthode - pour attribuer une valeur par défaut aux index non définis:

<form action="" method="post">
<input type="checkbox" id="status_1" name="status_1" value="1" />
<input type="checkbox" id="status_2" name="status_2" value="1" />
<input type="checkbox" id="status_3" name="status_3" value="1" />
<input type="submit" />
</form>
<?php
for($i = 1; $i<=count($_POST); $i++) {
    $_POST["status_$i"] = isset($_POST["status_$i"]) ? $_POST["status_$i"] : 0;
}
var_dump($_POST);

/**
 * Here we will be checking only the third checkbox:
 * 
 * array (size=3)
  'status_3' => string '1' (length=1)
  'status_1' => int 0
  'status_2' => int 0
 */
47
Royal Bg

Je pense que l'ajout de champs cachés comme celui-ci fonctionnera

<input type="hidden" id="status_1_" name="status_1"  value="0">
<input type="checkbox" id="status_1" name="status_1" value="1" />

<input type="hidden" id="status_2_" name="status_2" value="0">
<input type="checkbox" id="status_2" name="status_2" value="1" />

<input type="hidden" id="status_3_" name="status_3" value="0">
<input type="checkbox" id="status_3" name="status_3" value="1" />
8
nithin

Je pense qu'il est impossible d'obtenir un tableau comme ce que vous voulez à partir de formulaires html. Mais cela, quelques astuces peuvent être utilisées:

$defaultForm = array(
'status_1' => 0,
'status_2' => 0,
'status_3' => 0, 
);

// example array from $_POST
$form = array(
'status_1' => 1,
'status_3' => 1, 
);

$form = array_merge($defaultForm, $form);

Résultat:

tableau (3) {

'status_1' => int (1)
'status_2' => int (0)
'status_3' => int (1)

}

2
Somy A

Essaye ça. Si la case n'est pas cochée, le champ caché du même nom sera transmis à la place.

<form action="" method="post">
  <input type="hidden" id="hidden_status_1" name="status_1" value="0" />
  <input type="checkbox" id="status_1" name="status_1" value="1" />
  <input type="hidden" id="hidden_status_2" name="status_2" value="0" />
  <input type="checkbox" id="status_2" name="status_2" value="1" />
  <input type="hidden" id="hidden_status_3" name="status_3" value="0" />
  <input type="checkbox" id="status_3" name="status_3" value="1" />
</form>
2
luttkens

Merci a tous. Merci à @RoyalBg donnez-moi une solution. Comme ça :

<input type="hidden" name="status_1" value="0" />
<input type="checkbox" id="status_1" name="status_1" value="1" /> Check 1 <br />
<input type="hidden" name="status_2" value="0" /> 
<input type="checkbox" id="status_2" name="status_2" value="1" /> Check 2 <br />
<input type="hidden" name="status_3" value="0" />
<input type="checkbox" id="status_3" name="status_3" value="1" /> Check 3 <br />

Cela fonctionne parfaitement .. :)

1
Fredy

la question a peut-être déjà trouvé une réponse, mais je voulais juste essayer ... Solution côté serveur uniquement:

$p = $_POST;
$a = array();
$a['status_3'] = (int) ($p['status_3'] === 1);
$a['status_2'] = (int) ($p['status_2'] === 1);
$a['status_1'] = (int) ($p['status_1'] === 1);

Essai

 // if input is Array("status_1"=>1) output will be
 Array ( [status_1] => 1 [status_3] => 0 [status_2] => 0 )

 // if input is Array("status_1"=>1, "status_2"=>1) output will be
 Array ( [status_1] => 1 [status_3] => 0 [status_2] => 1)
1
Jay Harris
<!--html code-->                                                                  
<input type="checkbox" name="correct" value="1">Option 1
<input type="checkbox" name="correct" value="2">Option 2
<input type="checkbox" name="correct" value="3">Option 3
<input type="checkbox" name="correct" value="4">Option 4                                   

//php code in function called on form submit       
  public function addOptions(Request $request)
   {
    $option = array('1' => 0,'2'=>0,'3'=>0,'4'=>0 );
    $option[$request->correct] = 1;
    return $option;
   }
1
Inderjeet Singh

essayez ci-dessous le code

    $myresult = array();

    if(!isset($_POST['status_1'])){ 
        $myresult['status_1'] = 0;
    }
    if(!isset($_POST['status_2'])){ 
        $myresult['status_2'] = 0;
    }
    if(!isset($_POST['status_3'])){ 
        $myresult['status_3'] = 0;
    }

    echo "<pre>";
    print_r($myresult);
    echo "</pre>";
    exit;
0
Mandip Darji

Pourquoi l'avez-vous pris dans un tableau? Vous pouvez obtenir la case décochée à 0 en utilisant "isset"

    if(!isset($_POST['status_2'])
    {
      //Set status_2 parameter as 0
    }
0
Ankur

En supposant que nous utilisons des cases à cocher avec des zéros ou des uns ...

L'utilisation d'une case à cocher masquée avec une valeur nulle n'est qu'une solution de contournement. Une autre solution consiste à ajouter 0 à la valeur lors de la réception du message ou de l'obtenir.

Exemple:

$ chkbx1 = $ _POST ['chckbx1']; $ chkbx1 + = 0;

Cela prend une valeur NULL et la transforme en zéro, mais si la valeur est un, comme dans son vérifié, alors la valeur reste la même.

Le vrai problème ici n'est pas d'inventer une solution de contournement. Sa compréhension pourquoi cela se produit. Les anciennes versions de mySQL prennent des valeurs nulles et les convertissent en zéro. Dans les versions plus récentes, vous devez désactiver le mode strict et une solution de contournement n'est alors pas nécessaire.

0
tom

Essaye celui-là:

for ($i = 1; $i<=3; $i++) {
    $_POST["status_$i"] = isset($_POST["status_$i"]) ? $_POST["status_$i"] : 0; // 0 if not set
}

var_dump($_POST);
0
M.Athish krishna