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?
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
*/
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" />
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)}
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>
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 .. :)
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)
<!--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;
}
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;
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
}
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.
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);