Insérer valeurs checkbox dans bdd

Par macinsteph, il y a 8 ans


Bonjour,

Je souhaiterais insérer le résultat de mes checkboxes dans ma base de données.
Voisci le code checkbox :

<div class="btn-group" data-toggle="buttons"> <label class="btn btn-primary active"> <input type="checkbox" name="taille[]" checked value="s">S </label> <label class="btn btn-primary"> <input type="checkbox" name="taille[]" value="m">M </label> <label class="btn btn-primary"> <input type="checkbox" name="taille[]" value="l">L </label> <label class="btn btn-primary"> <input type="checkbox" name="taille[]" value="xl">XL </label> </div>

Ma base table products est construite comme cela :

Champ ID
Champ sex
Champ name
Champ ts
Champ tm
Champ tl
Champ txl
description
image

comment puis je à partir de mon formulaire insérer le choix dans ma table ?

merci

14 réponses

JeremieMeunier, il y a 8 ans

Pour le savoir tu peut déboguer ton code en faisant un var_dump($_POST) tu saura les valeurs que tu récupère, et comment les traités !

macinsteph, il y a 8 ans

ça c'est fait mais je ne vois pas comment traiter les valeurs dans ma requête ? sachant qu'ils auront la même valeur, et comment insérer les différente valeurs ?

Blinkers, il y a 8 ans

Hello,

Tu as vraiment plein de façon de le faire, en voilà une, en imaginant que tes champs soit des booléen :
Code html de ton formulaire

<div class="btn-group" data-toggle="buttons"> <label class="btn btn-primary active"> <input type="checkbox" name="taille[s]" checked value="1">S </label> <label class="btn btn-primary"> <input type="checkbox" name="taille[m]" value="1">M </label> <label class="btn btn-primary"> <input type="checkbox" name="taille[l]" value="1">L </label> <label class="btn btn-primary"> <input type="checkbox" name="taille[xl]" value="1">XL </label> </div>

Code PHP pour traiter les données

<?php // On créer les variables par défaut (pas besoin si tu a déjà mis 0 par defaut dans ta bdd) $tailles = array('s' => 0, 'm' => 0, 'l' => 0, 'xl' => 0); // On attribue la variable correspondante foreach($_POST['taille'] as $taille => $value){ if($value == 1){ $tailles[$taille] = 1; } } // On insert dans la bdd ?>
macinsteph, il y a 8 ans

Ok comme ça ça fonctionne merci, mais juste une petite chose je comprends que ça me mets dans ma bdd 1 quand c'est selectionné et 0 quand ça ne l'ai pas. Mais si je dois récupérer la valeur S ou M ou L ou XL pour les afficher, depuis la base de données ça va me donner des 1 et des 0 ?

macinsteph, il y a 8 ans

bonjour,
Pour la requête INSERT INTO peux tu me mettre sur la voix ?
merci
Je cherche mais je ne trouve rien qui ressemble à ce que je souhaite.

G1.3, il y a 8 ans

Salut

Une petite idée de ce que tu vas de voir faire (ça fonctionne pas, c'est biensûr à adapter pour ton utilisation):

$sth = $dbh->prepare('INSERT INTO products VALUES (?, ?, ?, ?)'); $sth->execute(['Toto', $tailles['s'], $tailles['m']...]);

Préparer une requête pour insérer dans la table products, mettre les valeurs de tes checkboxs dans le tableau des paramètres.

Reviens vers nous si tu as besoin d'aide supplémentaire, mais avec au moins un bout de code de ton traitement PHP, on va quand même pas de fournir la solution toute faite :p

Lramelot, il y a 8 ans

Que recherches-tu à faire en fait ?

Lors d'une commande, un utilisateur peut commander plusieurs tailles de t-shirt en une fois ? Ce comportement me semble assez particulier tout de même, pourrais-tu tenter d'être explicite ?

macinsteph, il y a 8 ans

je sais bien qu'il faut je cherche mais la je bloque sur ces fameuses checkbox.
Mon code est un peu plus complexe car je n'ai pas que les checkboxes.
Je vous mets le code complet vous allez comprendre :

<?php require 'inc/header.php'; ?> <?php require_once 'bdd.php'; ?> <?php $upload_Dir = '../img/produits/' ; // dossier de sauvegarde de la photo principale $upload_Min = '../img/min/' ; // dossier de sauvegarde de la miniature if (isset($_POST['ajouter'])) { $name = $_POST['name']; $description = $_POST['description']; $sex = $_POST['sex']; $priceJ = $_POST['priceJ']; $priceA = $_POST['priceA']; $imgName = $_FILES['image']['name']; $imgTmp = $_FILES['image']['tmp_name']; $imgSize = $_FILES['image']['size']; if (empty($name)) { $error = 'Renseigner le nom du produit'; }elseif (empty($description)) { $error = 'mettre une description du produit'; }elseif (empty($sex)) { $error = 'Indiquer une catégorie'; }elseif (empty($priceJ)) { $error = 'Renseigner un prix enfant'; }elseif (empty($priceA)) { $error = 'Renseigner un prix Adulte'; }elseif (empty($imgName)) { $error = 'Choisir une photo'; }else{ // récupérer l'extension de l'image $imgExt = strtolower(pathinfo($imgName, PATHINFO_EXTENSION)); // Extension autorisé $allowExt = array('jpeg', 'jpg', 'png', 'gif'); // nom de l'image $userPic = $_FILES['image']['name']; // nom de l'image principale require 'imgClass.php'; // appel de la class qui gère la génération des miniatures if ($imgSize > 500000) { $error = 'Votre image est trop lourde !!'; }elseif (in_array($imgExt, $allowExt)) { move_uploaded_file($imgTmp, $upload_Dir.$userPic); Img::creerMin($upload_Dir.$userPic,$upload_Min,$userPic,120,150); // création de la miniature $success = "l'image a bien été téléchargé !!"; }else{ $error = 'Merci de choisir une photo valide'; } } if (!isset($error)) { $req = $bdd->prepare("INSERT INTO products(name,description,sex,priceJ,priceA,image) VALUES ('".$name."','".$description."','".$sex."','".$priceJ."','".$priceA."','".$userPic."')"); $req->execute(array( "name" => $name, "description" => $description, "sex" => $sex, "priceJ" => $priceJ, "priceA" => $priceA, "image" => $userPic )); if ($req) { $success = 'Enregistrement réussi dans la base produits'; }else{ $error = 'Error'.mysqli_error($bdd); } } } var_dump($_POST); ?> <div class="wrapper"> <div class="container"> <div class="row"> <div class="col-lg-3"></div> <div class="col-lg-6"> <h2>Ajouter un nouveau produit</h2> <form action="ajouter.php" method="post" enctype="multipart/form-data"> <div class="form-group"> <input type="hidden" name="MAX_FILE_SIZE" value="1048576" /> <label class="control-label col-lg-12">Téléchargement d'image extensions autorisées (png, jpeg, jpg, gif).</label> <input type="file" name="image" class="btn-upload"> </div> <div class="form-group"> <label>Nom du produit</label> <input type="text" name="name" id="name" class="form-control"> </div> <div class="btn-group" data-toggle="buttons"> <label class="btn btn-primary active"> <input type="checkbox" name="taille[]" checked value="s">S </label> <label class="btn btn-primary"> <input type="checkbox" name="taille[]" value="m">M </label> <label class="btn btn-primary"> <input type="checkbox" name="taille[]" value="l">L </label> <label class="btn btn-primary"> <input type="checkbox" name="taille[]" value="xl">XL </label> </div> <div class="form-group"> <label>Description du produit</label> <textarea name="description" id="description" class="form-control" rows="3"></textarea> </div> <div class="form-group"> <label>Sexe (Homme - Femme - Enfant)</label> <input name="sex" id="sex" class="form-control"> </div> <div class="form-group"> <label>Prix du produit Junior</label> <input type="text" name="priceJ" id="priceJ" class="form-control"><br> </div> <div class="form-group"> <label>Prix du produit Adulte</label> <input type="text" name="priceA" id="priceA" class="form-control"><br> </div> <input type="submit" class="btn btn-primary" id="ajouter" name="ajouter" value="Ajouter"> </form> <?php if (isset($error)) { ?> <div class="alert alert-danger"> <span class="glyphicon glyphicon-info"></span> <strong><?php echo $error; ?></strong> </div> <?php } ?> <?php if (isset($success)) { ?> <div class="alert alert-success"> <span class="glyphicon glyphicon-info"></span> <strong><?php echo $success; ?></strong> </div> <?php } ?> </div> <div class="col-lg-3"></div> </div> </div> </div> <?php require'inc/footer.php'; ?>

merci

macinsteph, il y a 8 ans

ce que je veux faire :
j'ai un backoffice qui gère la mise en ligne des produits.
J'ai une page ajouter qui me premet comme son nom l'indique de mettre un nouveau produit dans ma base products c'est le code que je viens de mettre.
Je souhaite par la suite proposer la selection des tailles à l'utilisateur dans le front office, evidement il ne choisira qu'une seul taille.
j'espère avoir été clair !

G1.3, il y a 8 ans

Juste en dessous de if (!isset($error)) { tu ajotues le code de Blinker puis tu modifies la requête comme je t'ai montré en ajoutant les variables $tailles['XX'] dans ton execute. Et ça devrait le faire.

macinsteph, il y a 8 ans

Chapeau je test et je reviens vers toi si besoin !!!

macinsteph, il y a 8 ans

Je viens de modifier mon code comme cela :

if (!isset($error)) { // On créer les variables par défaut (pas besoin si tu a déjà mis 0 par defaut dans ta bdd) $tailles = array('s' => 0, 'm' => 0, 'l' => 0, 'xl' => 0); // On attribue la variable correspondante foreach($_POST['taille'] as $taille => $value){ if($value == 1){ $tailles[$taille] = 1; } } $req = $bdd->prepare("INSERT INTO products(name,description,sex,priceJ,priceA,image,ts,tm,tl,txl) VALUES ('".$name."','".$description."','".$sex."','".$priceJ."','".$priceA."','".$userPic."','".$tailles."')"); $req->execute(array( "name" => $name, "description" => $description, "sex" => $sex, "priceJ" => $priceJ, "priceA" => $priceA, "image" => $userPic, "ts" => $tailles['s'], "tm" => $tailles['m'], "tl" => $tailles['l'], "txl" => $tailles['xl'] )); if ($req) { $success = 'Enregistrement réussi dans la base produits'; }else{ $error = 'Error'.mysqli_error($bdd); } } } ?>

mais j'ai cette erreur :
PHP Notice: Array to string conversion in /Applications/MAMP/htdocs/panier/admin/ajouter.php on line 64
et la ligne 64 est ma requête.

G1.3, il y a 8 ans

Il faudrait que tu regardes comment gérer les requetes préparées. La tu le fais qu'a moitié (http://php.net/manual/fr/pdo.prepare.php)

Remplace ta requete par ça, ça devrait le faire:

$req = $bdd->prepare("INSERT INTO products(name,description,sex,priceJ,priceA,image,ts,tm,tl,txl) VALUES (:name, :description, :sex, :priceJ, :priceA, :image, :ts, :tm, :tl, :txl)"); $req->execute(array( "name" => $name, "description" => $description, "sex" => $sex, "priceJ" => $priceJ, "priceA" => $priceA, "image" => $userPic, "ts" => $tailles['s'], "tm" => $tailles['m'], "tl" => $tailles['l'], "txl" => $tailles['xl'] ));
G1.3, il y a 8 ans

Salut

Si tu mets XL dans le colonne XL il y aura un petit probleme de logique je pense. Stocker un boolean semble mieux

Le mieux serait de faire lors de l'affichage par exemple:

<b>Taille XL :</b> <?php echo $product['txl'] == 1 ? 'Oui' : 'Non'; ?>