Page 1 sur 1

Enregistrement de checkbox dans bdd

Posté : 01 déc. 2006, 16:56
par inow
Slt, j'ai cherché sur le forum mais pas trouvé de réponses...
Voilà ce que j'aimerai arriver à faire :
récupérer par un formulaire les produits que des clients distribuent.

Pour cela j'ai :
- une table produits qui contient 27 produits (id_produit, nom_produit).
- un formulaire qui affiche les 27 cases à cocher dynamiquement avec 3 produits par ligne :
<?
		   $nb=3;
		   $i = 1;
		   $sql=mysql_query("select * from tbl_products");
		   ?>
		   
		   <table width="100%" border="0" cellspacing="0" cellpadding="0">
		   <? while($resultat = mysql_fetch_array($sql)) {
		   if($i == 1) { echo'<tr>'; } ?>
			<td><input type="checkbox" name="product[]" value="1" /> <? echo $resultat['name']; ?></td>
			<? $i++;
			if($i > $nb) { echo'</tr>'; $i = 1; }
			}
			?>
  			</table>
- une table protuits_to_distri (id_distri, id_produit1, id_produit2, ..., id_produit27)

Je ne sais pas comment récupérer les valeurs des checkbox et faire en sorte que la commande INSERT INTO insère tout çà dans la table produit_to_distri

Si quelqu'un a une petite idée...

Posté : 01 déc. 2006, 17:01
par DocType
tu fais des tests style isset() sur tes variables checkbox retournées...
normalement si une checkbox cochée, isset() rendra true; sinon, false :wink:

Posté : 01 déc. 2006, 17:05
par inow
Comment écrire INSERT INTO nom_table VALUES('', valeur_checkbox1, valeur_checkbox2, ..., valeur_checkbox27); ?

Posté : 01 déc. 2006, 17:09
par DocType
As-tu pris le temps de lire posémment ma réponse précédente ? :roll:

Posté : 01 déc. 2006, 17:28
par Ryle
Au delà du isSet, tu va avoir un léger soucis au niveau de ton formulaire : toutes tes cases à cocher se nomment "product[]" (ce qui est bien, cela veut dire que tu vas récupérer un tableau contenant les valeurs des cases qui ont été cochées) et ont toutes la valeur "1" ... ce qui fait que si ton tableau contient trois 1, tu sauras que 3 cases ont été cochées, mais sans savoir lesquelles...

Si chacune des cases est indépendantes des autres, il faut leur donner un nom propre à chacune. A ce moment, tu pourras tester avec isSet() afin de savoir si une case (à partir de son nom) a été cochée ou pas et mettre la valeur adéquate dans ta requête sql

re

Posté : 01 déc. 2006, 21:26
par Frantz
Comme le précise Ryle, il faut nommer tes champs
de cette façon :
<form action="test.php" method="post">
<input type="hidden" name="id" value="$id">
C1 <input type="checkbox" name="check[]"><br>
C2 <input type="checkbox" name="check[]"><br>
C3 <input type="checkbox" name="check[]"><br>
<input type="submit" value="envoyer">

Ensuite, tu récupères tes champs qui sont stockées dans un tableau
"[]" en utilisant une fonction qui parcoure les tableaux.

If(isset($_POST['check'])) //si un check est posté
{
  // alors j'update ou j'insère les données.
  // tu dois avoir un champ mysql par check soit 3 dans notre exemple
  
$sql="";
   foreach($_POST['check'] as $key => $val) // pour chaque valeur posté nous récupérons sa clé(id) et sa valeur pour s'en servir

     {
         echo "$key  $val";
        $sql .= ",'$val'"; // le . sert à ajouter les valeurs à ta variable
      }
}
mysql_query("insert into TABLEAU () VALUES (''$sql)");
}

Posté : 02 déc. 2006, 00:18
par Truc
Trouvé dans la FAQ :wink:
qu'on doit toujours lire (consulter) :evil:

Posté : 02 déc. 2006, 08:34
par inow
Merci pour toutes ces précisions.
LHDN92 : j'avais vu ta réponse mais je savais pas trop quoi faire avec...

Si j'ai bien compris, il faut générer un enregistrement dans la base à chaque fois qu'une checkbox est cochée.

Je pensais pouvoir insérer dans une table qui contiendrait toutes les checkbox possibles les valeurs de chacunes : celles qui ont été cochées prennent une valeur 1 et toutes les autres prennent une valeur 0.

re

Posté : 02 déc. 2006, 11:37
par Frantz
Dans mon exemple, tu as une colonne mysql par checkbox.

Posté : 02 déc. 2006, 18:20
par inow
Ca m'apprendra à parler avant d'avoir testé !

Je viens de tester, ça récupère bien les cases cochées.
Mais ma table dans la bdd contient 27 champs pour les 27 cases à cocher possibles. Là par cette méthode je récupère que celles cochées mais du coup je rempli pas les autres champs.

Est-ce posible d'avoir dans la table un enregistrement du genre 1,0,0,0,0,1,0,0,0,1,1,1,0... où les 1 seraient les cases qui ont été cochées et les 0 les cases non cochées ?

Posté : 02 déc. 2006, 18:49
par Cyrano
Je crois que la logique te fait défaut sur ce coup là :-k

Comment mettre la bonne valeur dans la base ? Sachant qu'une case à cocher n'envoie de valeur que si elle est cochée, tu peux exploiter ça pour définir la valeur à enregistrer. Donc :
// Si une valeur est envoyée, l'index de $_POST existe, donc la variable vaudra 1, sinon 0.
$val_01 = isset($_POST['ma_case_01']) ? "1" : "0";
//...
$val_27 = isset($_POST['ma_case_27']) ? "1" : "0";
// construction de la requête :
$sql = "INSERT .... VALUES(". $val_01 .", ..., ". $val_27 .")";
Et tu auras bien soit 0 soit 1 dans ta table.

Posté : 02 déc. 2006, 22:40
par DocType
Comme quoi il faut quelques fois me lire. Je suis certain qu'Hubert a activé le mode
LHDN92 -> posts_hide();
tu fais des tests style isset() sur tes variables checkbox retournées...
normalement si une checkbox cochée, isset() rendra true; sinon, false :wink:
Sinon, comment va mon Cyrano ? Remis de cette petite douceur qu'on appelle "vin" ? :langue:

Posté : 02 déc. 2006, 23:50
par Cyrano
Sinon, comment va mon Cyrano ? Remis de cette petite douceur qu'on appelle "vin" ? :langue:
Faudrait pas oublier que je suis né au milieu des vignes :langue: