case a cocher choix multiples

CARO91002
Invité n'ayant pas de compte PHPfrance

30 août 2013, 19:42

Bonjour,

Suis débutante :oops: et j'ai beau chercher je trouve pas la solution.

Si quelqu'un pouvait m'aider, merci beaucoup.

J'ai crée un formulaire et j 'arrive pas a récupérer les valeurs de cases a cocher multiples dans ma bdd ? J'ai juste la dernière case cochée uniquement qui s'affiche dans ma bdd

Voici mon code html:

Code : Tout sélectionner

<input type="checkbox" name="appartstyle" value="studio" /> <label for="studio">Studio</label><br /> <input type="checkbox" name="appartstyle" value="pieces" /> <label for="pieces">2 pièces</label><br /> <input type="checkbox" name="appartstyle" value="maison" /> <label for="maison">maison</label><br />
Voici mon cpde traitement php:

Code : Tout sélectionner

$req = $bdd -> prepare('INSERT INTO news2(nom,prenom,naissance,nationalite,paysresidence,email,appartstyle,usagel) VALUES(?, ?, ?,?,?,?,?,?)'); $req -> execute (array ($_POST ['nom'], $_POST['prenom'], $_POST['naissance'], $_POST['nationalite'], $_POST['paysresidence'], $_POST['email'],$_POST['appartstyle'], $_POST['usagel'])) or die (print_r($req->errorInfo())); Merci beaucoup

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

30 août 2013, 20:14

salut,

deux choses :
- si un nom d'élément de formulaire (input) n'est pas unique seul le dernier esr prit en compte.
- utilise la notation tableau pour nommer tes checkbox => name="appartstyle[]", dans cas $_POST['appartstyle'] est un tableau, tu peux utiliser implode pour tout mettre dans une seule colonne de sgbd si tu as quelque chose de dénormalisé.


@+
Il en faut peu pour être heureux ......

CARO91002
Invité n'ayant pas de compte PHPfrance

30 août 2013, 20:46

merci beaucoup vais tester demain matin.

Bonne soiree

Petit nouveau ! | 6 Messages

31 août 2013, 10:29

Bonjour,

Dans le code html j 'ai bien rajouter les crochets

Code : Tout sélectionner

<input type="checkbox" name="appartstyle[]" value="studio" /> <label for="studio">Studio</label><br /> <input type="checkbox" name="appartstyle[]" value="pieces" /> <label for="pieces">2 pièces</label><br /> <input type="checkbox" name="appartstyle[]" value="maison" /> <label for="maison">maison</label><br />
Par contre je comprends pas ce qu'il faut inserer et je ne sais pas ou insérer IMPLODE dans mon traitement php ? J'ai pas vu d'exemples concrets du coup suis perdue :-(

petite question, le type de valeur pour cela dans la BDD c 'est bien VARCHAR ou ENUM ?

Merci de ton aide

Petit nouveau ! | 6 Messages

31 août 2013, 11:08

On ne peut pas utiliser FOREACH ?

Merci.

Mammouth du PHP | 571 Messages

31 août 2013, 12:22

c'est possible d'utiliser la boucle en raison du choix multiple effectué par l'internaute ayant selectionné apparstyle(qui au demeurant est un tableau).
<?php
$req = $bdd -> prepare('INSERT INTO news2(nom,prenom,naissance,nationalite,paysresidence,email,appartstyle,usagel) VALUES(?, ?, ?,?,?,?,?,?)');
     foreach($_POST['appartstyle'] as $value){
   $insert=  $req -> execute (array ($_POST ['nom'], $_POST['prenom'], $_POST['naissance'], $_POST['nationalite'],
    $_POST['paysresidence'], $_POST['email'],$value, $_POST['usagel'])) ;
   if($insert ===false)
     echo "Erreur SQL: problème survenu lors de l'insertion";
   }
   

?>
Le code ci-dessus fonctionne bien, en revanche y a bien un problème de modélisation au niveau de ta bd car si une personne choisi 10 appartsyle il y aura aussi 1O insertions des données(nom,prenom,naissance...) de la même personne. Or la duplication des données doit être évité. Dans ton cas la modélisation de ton système d'information doit ressortir au minimum 4 entités voire 5 ou 6 entités:
-personne
-pays
-appartstyle
-personne-appartstyle

Petit nouveau ! | 6 Messages

31 août 2013, 16:00

Merci beaucoup Yann pour ton aide mais quand je mets ton code ça me notifie "array" dans ma bdd ?

Mammouth du PHP | 571 Messages

31 août 2013, 17:02

dans un premier temps il faut s'assurer que les données transmises par le formulaire sont bien reçues.pour ce faire on peut scruter le contenu de $_POST avec var_dump()
//à placer avant la requête d'insertion
var_dump($_POST);
Que retourne var_dump($_POST)?

penses aussi à activer la gestion d'erreurs pdo.

Petit nouveau ! | 6 Messages

01 sept. 2013, 21:14

merci beaucoup pour ta réponse j'essaye des demain matin et te dis ce que ca me notifie
bonne soiree

Mammouth du PHP | 2278 Messages

02 sept. 2013, 09:01

Parce que ton script php reçoit un tableau et que ce tableau ne peut pas être enregistré tel quel dans la base de données.
C''est pourquoi une façon de procéder est celle-ci:
$tableau = $_POST['nom_html'];
et soit tu te sers de foreach
foreach ($tableau as $element)
{
//utilisation de élément
}
soit tu te sers de while.

Mais il faudrait tenir compte de la remarque de moogli sur la conception de la BDD
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 6 Messages

02 sept. 2013, 09:51

Bonjour,

Merci pour vos réponses et pour votre aide


en mettant le code ci dessous, je récupère uniquement la dernière valeur cochée dans ma bdd ?

Merci

Code : Tout sélectionner

<?php $req = $bdd -> prepare('INSERT INTO news2(nom,prenom,naissance,nationalite,paysresidence,email,appartstyle,usagel) VALUES(?, ?, ?,?,?,?,?,?)'); foreach($_POST['appartstyle'] as $value){ $insert= $req -> execute (array ($_POST ['nom'], $_POST['prenom'], $_POST['naissance'], $_POST['nationalite'], $_POST['paysresidence'], $_POST['email'],$value, $_POST['usagel'])) ; if($insert ===false) echo "Erreur SQL: problème survenu lors de l'insertion"; } ?>

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

02 sept. 2013, 11:23

Non toutes les cases a cocher qui sont cochée si biensur tu as bien employée la notation tableau.

Par contre tu as une ligne insérée par case cochée ce qui va a l'encontre d'une bonne modélisation ;)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

02 sept. 2013, 11:42

Au cas où tu n'aurais pas compris moogli, je pose mon grain de sel:
Si un acheteur potentiel, Dupont, Gérard, a sélectionné trois maisons, tu vas avoir dans ta BDD:
Dupont, Gérard, Maison_1
Dupont, Gérard, Maison_2
Dupont, Gérard, Maison_3
Et si le même revient plus tard ou change d'avis, le résultat ne vas pas être triste:
Il faudrait avoir au moins trois tables:
Trucs_a_vendre
id :entier clef primaire autoincrement
nom de la chose: text
etc...
Acheteurs
id_acheteur: entier clef primaire autoincrement
Nom: text
Prénom: text
etc

Consultations
id_consulteur : integer; valeur prise dans la table Acheteurs
id_consulte: entier, valeur prise dans Trucs à vendre.

La mise à jour est alors une mise à jour de
Acheteurs si l'acheteur est nouveau
Trucs_a_vendre : si nouvau produit
Consultations : pour chaque consultation nouvelle.

Ca suppose é videmment de repenser aussi le formulaire (valeurs prises dans la BDD)...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 6 Messages

02 sept. 2013, 12:10

Merci beaucoup pour vos reponses

Comme suis encore debutante et j'avoue que ca me semble encore un peu compliqué à mon stade, du coup j'ai remplacé "case a cocher" par un type bouton 'radio' et un champs texte a coté, certes je n'aurai qu'une valeur mais bon au moins ca fonctionne :-)

Vais un peu plus plancher sur php :-))

Mammouth du PHP | 2278 Messages

02 sept. 2013, 13:31

Vaudrait mieux repenser:
BDD
table Styles
id_style : entier, autoincrement, clef primaire
style : text
avec un formulaire de création de la table Styles,
et un formulaire de modification de cette table.
Essaie de faire ça en premier

table Clients
id_client : entier, autoincrement, clef primaire
Nom: text
Prenom: text
Naissance: date
Nationalite: char(2)
Pays_residence : char (2)
email :text
avec un formulaire de création d'un enregistrement dans cette table
(les pays sont dans un select, codés sur deux lettres)

quand cette partie fonctionne, on peut avancer...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD