Enregistrement de checkbox dans bdd

Petit nouveau ! | 7 Messages

01 déc. 2006, 16:56

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...
Modifié en dernier par inow le 01 déc. 2006, 17:01, modifié 2 fois.

Mammouth du PHP | 1776 Messages

01 déc. 2006, 17:01

tu fais des tests style isset() sur tes variables checkbox retournées...
normalement si une checkbox cochée, isset() rendra true; sinon, false :wink:

Petit nouveau ! | 7 Messages

01 déc. 2006, 17:05

Comment écrire INSERT INTO nom_table VALUES('', valeur_checkbox1, valeur_checkbox2, ..., valeur_checkbox27); ?

Mammouth du PHP | 1776 Messages

01 déc. 2006, 17:09

As-tu pris le temps de lire posémment ma réponse précédente ? :roll:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 déc. 2006, 17:28

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
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 152 Messages

01 déc. 2006, 21:26

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)");
}

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

02 déc. 2006, 00:18

Trouvé dans la FAQ :wink:
qu'on doit toujours lire (consulter) :evil:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Petit nouveau ! | 7 Messages

02 déc. 2006, 08:34

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.

Eléphant du PHP | 152 Messages

02 déc. 2006, 11:37

Dans mon exemple, tu as une colonne mysql par checkbox.

Petit nouveau ! | 7 Messages

02 déc. 2006, 18:20

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 ?

Mammouth du PHP | 19672 Messages

02 déc. 2006, 18:49

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1776 Messages

02 déc. 2006, 22:40

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:
Modifié en dernier par DocType le 03 déc. 2006, 00:04, modifié 1 fois.

Mammouth du PHP | 19672 Messages

02 déc. 2006, 23:50

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:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: