Page 1 sur 2
Problème de checkbox à insérer dans bdd.
Posté : 22 nov. 2005, 11:24
par pierrecalligaro
Bonjour, j’ai besoin d’utiliser des cases à cocher dans un formulaire pour enregistrer des infos dans ma base de données?
Dans mon script, ci-dessous, si je fais un écho de $prod dans ma boucle foreatch, je récupère bien toutes mes cases cochés par contre dés que j’en sort je ne récupère que la première !!!
Quelqu’un aurait il une solution ?
<?php
$tabprod = (isset($_POST['produits']))?$_POST['produits']:null;
if (!empty($tabprod)) {
foreach($tabprod as $cle => $valeur) {
$prod=$cle."-";
}
}
$r2="insert into demande_info_particulier (Produits) values('$prod')";
$rq2=mysql_query($r2);
?>
Merci d’avance pour votre aide
A+ Pierre
Posté : 22 nov. 2005, 11:31
par mere-teresa
Soit tu mets l'exécution de ta requête dans la boucle, soit tu complètes ta requête (avec point-égal au lieu de égal) à chaque tour de boucle.
Pour le moment, tu fais tourner ta boucle, $prod prend successivement les valeurs, et tu ne fais qu'une requête, hors de la boucle, avec une valeur de $prod donc.
Posté : 22 nov. 2005, 11:41
par pierrecalligaro
J’ai déjà essayé de mettre ma requête dans la boucle mais ça ne marche pas mieux !!
Par contre peux tu m’expliquer le point égale à la place du égale ?
merci
Posté : 22 nov. 2005, 11:52
par mere-teresa
Posté : 22 nov. 2005, 13:22
par pierrecalligaro
Voila comment j'ai utilisé le ".=", je dois être à coté de la plaque mais je n'arrive pas à écrire la syntaxe correct pour pouvoir récupérer chaque case coché.
merci pour ton aide
$tabprod = (isset($_POST['produits']))?$_POST['produits']:null;
if (!empty($tabprod)) {
foreach($tabprod as $cle => $valeur) {
$prod=$cle."-";
}
}
$r2="insert into demande_info_particulier (Produits) values('$prod')";
$r2 .="values('$prod')";
$rq2=mysql_query($r2);
Posté : 22 nov. 2005, 13:26
par iclo
Tu souhaites faire une insertion dans la table pour chaque checkBox cochée.
Le foreach te permet de parcourir l'ensemble des valeurs des checkbox transmisent depuis le formulaire, (donc cochées)
Il dont logique que ton code d'insertion soit placé dans le code de la répétitive.
Si cela ne marche c'est qu'il y a un problême au niveau des valeurs ou de la requêtte.
La meilleure façon de débugger ce genre de problême, c'est de faire un print de ta requêtte (là où elle doit être, donc dans la boucle) Tu devrais obtenir une série d'insert (un par checkBox) Tu pourras ainsi detecter une erreur éventuelle dans les insert et même les tester par copie coller dans phpMyAdmin.
Tu peux aussi prendre l'habitude d'effectuer tes opérations sur la db comme suit
$rq2=mysql_query($r2) or die("Erreur : ".mysql_error());
Ce qui t'affichera un message d'erreur détaillé si un problême survient lors de l'exécution de la requêtte.
Posté : 22 nov. 2005, 13:58
par pierrecalligaro
J'ai mis la requête dans la boucle foreach. quand je coche une seule case ça marche par contre dés que j'en coche plusieur voila le message d'érreur : "Erreur : Duplicata du champ '' pour la clef 2". si je fais un echo de $prod, j'ai bien chaque case coché. Dans ma table le champ "Produits" est de type varchar.
voici mon code :
if (!empty($tabprod)) {
foreach($tabprod as $cle => $valeur) {
$prod=$cle."-";
$r2="insert into demande_info_particulier (Produits) values('$prod')";
$rq2=mysql_query($r2) or die("Erreur : ".mysql_error());
}
}
Posté : 22 nov. 2005, 14:17
par iclo
Visiblement, le problême ne vient pas du code php mais de la structure de la table, le champ "Produits" est visiblement défini comme unique : une valeur pour ce champ ne peut figurer qu'une seule fois dans la table.
Posté : 22 nov. 2005, 15:32
par pierrecalligaro
Pourtant il n'est pas défini en unique ??
Posté : 22 nov. 2005, 15:35
par rami
Tu as un champ identitifant en auto increment dans cette table?
Posté : 22 nov. 2005, 17:18
par pierrecalligaro
oui en effet j'ai un champ en auto_increment.
Posté : 22 nov. 2005, 20:07
par Truc
quel est le type du champ "Produits" ?
avec ce code tu va inserer des valeurs du style:
0-,
1- avec un tiret a la fin
si tu pouvais aussi reéxpliquer comment tu souahite inserer les valeurs (toutes les valeurs sur la meme ligne de données ou une nouvelle ligne par case ?) c'est un peu le flou la dessus

Posté : 22 nov. 2005, 23:25
par pierrecalligaro
Le champ Produit est de type "varchar" taille 50 et je désire en effet tout récupérer dans un même champ. Par contre si il faut faire plusieur champs pour récupérer chacune des valeur pourquoi pas. je met un tiret pour bien séparer les valeurs mais encore une foi si c'est en trop, je le zappe.
voila j'éspere avoir été plus clair.
Merci
Pierre
Posté : 22 nov. 2005, 23:45
par Truc
dans ce cas il faut utiliser la méthode de
mere-teresa:
$prod=""
if (!empty($tabprod))
{
foreach($tabprod as $cle => $valeur)
{
$prod.=$cle."-";
}
}
$prod=substr($prod,0,-1); //pour enlever le dernier - qui ne sert pas ;)
$r2="INSERT INTO demande_info_particulier (Produits) values('".$prod."')";
$rq2=mysql_query($r2) or die("Erreur : ".mysql_error());
regarde la place de ".="
sinon le meme en plus rapide grace a
implode():
$prod=implode("-",$tabprod);
$r2="INSERT INTO demande_info_particulier (Produits) values('".$prod."')";
$rq2=mysql_query($r2) or die("Erreur : ".mysql_error());
Posté : 23 nov. 2005, 00:15
par iclo
Stoker tous les check-box coché dans un seul champ, c'est très normalisé;
Ca pourrait poser problème par après pour l'exploitation de ces données.
Si tu as peu de checkBox, tu peux avoir un champ par checkBox, si tu en as plus, passer par une table supplémentaire serait plus souple et plus leger :
Cela donnerait une structure ressemblant à ça :
idCheckBox| idInfo