IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

gestion liste déroulante [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut gestion liste déroulante
    Salut

    Bon je sais il y a un tas de sujets qui traitent de la récupération de données de liste déroulante à choix multiple mais je n'arrive pas à trouver un vrai tutorial qui explique le déroulement complet de la procédure : récupération des données, insertion dans une base mysql (dans un champ varchar) puis récupération de ces données pour modification éventuelles
    Bon une solution serait de passer par des checkbox mais celà ne me plait pas car pour la maintenance d'un projet la liste déroulante c'est mieux
    Donc j'ai une liste déroulante multichoix

    J'arrive à voir ce que choisit l'utilisateur en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(isset($_POST['lst_marche']) && !empty($_POST['lst_marche'])){
    	$tab = $_POST['lst_marche'];
    //	print_r($tab);
            foreach($tab as $selectValue){
    		//affichage des valeurs sélectionnées
                    echo $selectValue;
    	}
    }
    donc il m'affiche bien 13

    Donc c'est là que le blaireau cale !!!
    1) Comment faire pour séparer les valeurs : j'ai fait echo $selectValue.","; et donc il m'affiche 1,3, (cela ne vat-il pas poser problème si je fais des explode !!)
    2) Ensuite comment faire pour inserer dans base (champ marche) la valeur 1,3 correspondante au choix de l'utilisateur

    Si déjà j'arrive à faire ceci celà m'avancerait fortement et je passerais ensuite à la partie récupération des données pour modification éventuelle

    En espérant avoir été clair et désolé si je me suis mal exprimé !!

    Cordialement et joyeux Noël

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    liste déroulante à choix multiple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($tab as $selectValue){
    		//affichage des valeurs sélectionnées
                    echo $selectValue;
    	}
    donc il m'affiche bien 13
    1) Comment faire pour séparer les valeurs : j'ai fait echo $selectValue.","; et donc il m'affiche 1,3
    Si je comprends bien votre exemple est sur la sélection par l'utilisateur de deux options dans la liste à choix multiples ayant pour valeurs respectivement 1 et 3 ?

    2) Ensuite comment faire pour inserer dans base (champ marche) la valeur 1,3 correspondante au choix de l'utilisateur
    Vous stockeriez ainsi une valeur multiple dans une colonne de la table, ce qui est une mauvaise chose.

    Vous avez en fait la règle de gestion des données suivante :
    Un utilisateur peut choisir plusieurs options et une option peut être choisie par plusieurs utilisateurs.

    Cette règle de gestion entraîne le MCD suivant :
    utilisateur -0,n----choisir----0,n- option

    Et ce MCD entraîne la création des tables suivantes :
    te_utilisateur_uti (uti_id, ...)
    te_option_opt (opt_id, opt_libelle...)
    tj_uti_choisir_opt_uco (uco_id_utilisateur, uco_id_option, ...)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je plussoie sur la remarque de CinePhil.

    Cela dit, si tu stockes quand même tes données dans un seul champ, tu as les fonctions explode (que tu connais visiblement) et implode (qui est son inverse )
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Salut

    Merci pour vos réponses

    D'accord avec CinePhil mais j'ai envie de dire que ce sera la suite !!!
    Déjà je voudrais récupérer mes valeur (1,3) pour les mettre dans la base !!! : à chaque jour sa peine

    Car une fois que ma problèmatique réglée je chercherais l'amélioration : enfin c'est ainsi que je vois les choses !!!!

    Cordialement

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Pourquoi ne pas faire bien les choses tout de suite ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Salut

    Oui en effet CinePhil
    Donc tu crée une table pour les id de l'utilisateur (elle existe déjà), une table pour les id que l'utilisateur va choisi (elle existe aussi ) et enfin une table qui regroupe les 2 (celle-ci doit être crée !!!) : c'est bien celà ???
    Mais il faut quand même que je récupère les fameuses données (1,3) pour pour pouvoir les mettre dans cette dernière table !! Et c'est là que je coince : je les affiche bien mais comment les récupérer pour les mettre dans une table mysql ??

    Peut-être que je m'explique mal mais c'est là mon problème : récupérer ces fameuses valeurs grrrrrr

    Cordialement

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- Une bonne CONCEPTION commence par une bonne RÉFLEXION.
    en clair : il faut réfléchir avant de coder.

    2- réfléchis : si tu arrives à les afficher, c'est bien que tu arrives à les récupérer !
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $tab = $_POST['lst_marche']; // array des valeurs choisies
    $tab_list = implode( ',', $tab ); // chaine de la forme : 1,3
    Si tu stockes les choix dans un seul champ, il suffit d'y enregistrer $tab_list *.

    *Comme on te l'a dit, ce n'est pas la meilleure méthode pour stocker des choix multiples, mais c'est celle que tu as choisie.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Repartons de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(isset($_POST['lst_marche']) && !empty($_POST['lst_marche']))
    {
    	$tab = $_POST['lst_marche'];
    }
    Vous avez donc les choix de l'utilisateur dans $tab.

    Passons à l'enregistrement en BDD...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    if(isset($_POST['lst_marche']) && !empty($_POST['lst_marche']))
    {
    	$tab = $_POST['lst_marche'];
     
    	// Construction de la requête d'insertion
    	$sql = "
    		INSERT INTO tj_uti_choisir_opt_uco (uco_id_utilisateur, uco_id_option)
    		VALUES (:idUtilisateur, :idOption)
    	";
     
    	// Préparation de la requête (en utilisant la connexion $db supposée définie auparavant et ailleurs
    	$prep = $db->prepare($sql);
     
    	// Exécution de la requête autant de fois qu'il y a de choix de la part de l'utilisateur dont l'identifiant est valorisé par ailleurs
    	foreach($tab as $marche)
    	{
    		$prep->bindValue(':idUtilisateur', $id_utilisateur, PDO::PARAM_INT);
    		$prep->bindValue(':idOption', $marche, PDO::PARAM_INT);
    		$prep->execute();
    	}
    }
    À adapter à votre table (une fois que vous l'aurez créée) et vos colonnes.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Tant qu'à (BIEN) faire....

    1-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( !empty($_POST['lst_marche']) )
    c'est suffisant.


    2- @CinePhil : Pour gérer le cas d'une modification (où des choix ont DEJA été enregistrés), il faut d'abord supprimer les anciennes valeurs de la table, AVANT d'y insérer les nouvelles.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Salut

    Bon je vais tester tout ceci ce week-end (avant la buche de Noêl ) et je vous tiens au courant !!
    Merci pour votre aide !!

    Cordialement

    Et encore une fois joyeux Noël !!!!

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Salut

    Bon j'ai testé ce que m'a donné Jreaux62 et là je récupère bien ma chaine 1,3 que je mets dans table : je peux aussi l'afficher

    Allez Jreaux62 je vais abuser de tes compétences
    1) Comment "reconstruire" ma liste déroulante avec le choix fait par l'utilisateur ??
    2) Comment enfin "ré-associer" l'id de la liste avec le libelle de cette même liste ??

    Pour CinePhil : je pense que ta façon de faire est plus rigoureuse mais voici donc ma démarche :

    Je suis un débutant : alors au début j'essaie de faire un truc qui "tourne" (c'est un projet local pour l'instant)
    Ensuite quand j'aurais bien compris je passerais à l'optimisation avec un vrai MCD !!!!
    En ce moment j'utilise le moteur mysql mais une fois que mon truc va tourner je vais passer à pdo (avec sécurisation des injonction) qui d'aprés ce que j'ai vu est beaucoup plus fiable et facile à maintenir !!!
    Car j'ai peur que si je commence par une façon "trop stricte" de me prendre la tête : ai-je tort ou pas je sais pas mais je pense que commencer par du "simple" m'encouragera à persévérer !!!

    Merci à tous pour vos réponses et bonnes fêtes de fin d'année : attention au chocolat !!!

    Cordialement

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- ta réflexion est mauvaise.
    Tu penses faire "simple", alors que tu fais "obsolète".

    "Simple", c'est :
    • justement utiliser PDO, qui est le nouveau standard
    • Commencer par un formulaire et une table user simple : id nom prenom email
    • Faire les scripts d'INSERT, UPDATE, DELETE (avec requêtes préparés)
    • Afficher tous les users avec SELECT
    • Ajouter une liste déroulante : civilité (M. Mme Dr eurl...), Savoir réafficher le choix dans la liste
    • ...

    Là, normalement, tu auras bien compris le fonctionnement de PDO.

    2- Même si je t'ai donné une solution, ce n'est pas la meilleure.
    Justement à cause de la difficulté de réafficher et/ou cibler en fonction d'un des choix.
    C'est faisable (car j'ai aussi fait cette erreur au début), mais pas "simple".

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Salut

    Bon lorsqu'on demande un conseil le bon sens veut que l'on suive les conseils

    Donc je vais me lancer dans le PDO et abandonner mon vieux mysql mais je pense que je n'ai pas fini de m'arracher les cheveux !!

    Et je reviendrais vers vous pour des conseils !!!

    Merci pour tous vos conseils et suggestions

    Bonnes fêtes de fin d'année et bonne année 2018 par avance

    Cordialement

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Bon

    J'ai suivi vos conseils : finalement c'est pas mal PDO !!!
    Dons pour ma liste déroulante multiple j'ai donc créer une table qui récupère l'id de l'utilisateur et les id de ses choix !!
    Bon maintenant il faut que je reconstruise cette fameuse liste avec les choix effectués par l'utilisateur qui doivent être sélectionnés !!! Bon je suis pas sorti de l'auberge !!!
    Je pense qu'il va falloir que je joue avec les jointures de tables !!
    Bon si je cale je viendrais lancer un SOS

    Cordialement

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Salut

    Et oui me re voilou avec ma fameuse liste : j'avance mais la je bloque sur le foreach

    Bon je vous mets mon code avec mes commentaires et j'ai essayé de faire le plus propre possible !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    // liste Type de marche
    // récupération des id type de marche de la table t_choixmarches par rapport à adherentId
     
    $sql4 = "SELECT choixMarcheAdherentId , choixMarcheTypeMarcheId  
    FROM t_adherents 
    INNER JOIN t_choixmarches 
    ON adherentId = choixMarcheAdherentId
    WHERE choixMarcheAdherentId = $adherentId ";
     
    $resultat4 = $db->query($sql4);
     
    while ($r4 = $resultat4->fetch()){ // while 1
    	$choixMarcheAdherentId = $r4['choixMarcheAdherentId'];
    	$choixMarcheTypeMarcheId = $r4['choixMarcheTypeMarcheId'];
     
    // là je vais chercher ma table t_typemarches pour avoir les libelles des typemarche
     
    	$resultat3 = $db->query("SELECT typeMarcheId, typeMarcheLibelle FROM t_typemarches ORDER BY typeMarcheId ASC");
     
    // je commence ma construction de ma liste
    $ld_marches = "<SELECT NAME='lst_marche'>";
    $ld_marches .= "<OPTION VALUE=0>Choisissez</OPTION>";
     
    // et là j'essaie de faire un boucle pour associer le libelle de la marche à l'id récupéré et ça merde 
     
    foreach($choixMarcheTypeMarcheId as $id){
     
    	while ( $row3 = $resultat3->fetch()) { // while 2
     
    			$typeMarcheId = $row3["typeMarcheId"];
    			$typeMarcheLibelle = $row3["typeMarcheLibelle"];
    			if ( $typeMarcheId == $id) {
    				$s3 = "selected";
    			} else {
    				$s3 = "";
    			}
    			$ld_marches .= "<OPTION VALUE='$typeMarcheId' $s3 >
    						$typeMarcheLibelle</OPTION>";
     
    		}// fin while 2
     
    	}// fin du foreach
     
    $ld_marches .= "</SELECT>";	
     
    }// fin while 1
    C'est mon foreach qui ne doit pas être et là je bloque vraiment

    Vous remerciant par avance

    Cordialement

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Salut

    Bonne année 2018 à tous et toutes

    Bon j'essaie toujours de régler mon problème de liste déroulante
    Je progresse mais c'est pas encore ça !!!!!

    voici mon nouveau code pour afficher dans cette liste les choix faits par mon utilisateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    // liste Type de marche
    // récupération des id type de marche de la table t_choixmarches par rapport à adherentId
     
    $sql2 = "SELECT choixMarcheAdherentId , choixMarcheTypeMarcheId 
    FROM t_adherents
    INNER JOIN t_choixmarches
    ON adherentId = choixMarcheAdherentId
    WHERE choixMarcheAdherentId = $adherentId ";
     
    $req2 = $db->query($sql2);
     
    while ($r2 = $req2->fetch()){ // while 1
        $choixMarcheAdherentId = $r2['choixMarcheAdherentId'];
        $choixMarcheTypeMarcheId = $r2['choixMarcheTypeMarcheId'];
     
    // ici je construit un tableau que je vais utiliser dans mon foreach
     
      $tab_marche = array($choixMarcheTypeMarcheId);
    //  $tab_list = implode( ',', $tab_marche ); // chaine de la forme : 1,3
    //  echo $tab_list;
     
    // là je vais chercher ma table t_typemarches pour avoir les libelles des typemarche
     
        $req3 = $db->query("SELECT typeMarcheId, typeMarcheLibelle,typeMarcheEssai  FROM t_typemarches WHERE typeMarcheEssai = '0' ORDER BY typeMarcheId ASC");
     
    // je commence ma construction de ma liste
    $ld_marches = "<SELECT multiple='4' NAME='lst_marche'>";
    $ld_marches .= "<OPTION VALUE=0>Choisissez</OPTION>";
     
    // et là j'essaie de faire un boucle pour associer le libelle de la marche à l'id récupéré 
    // j'ai bien ma liste qui s'affiche mais avec toujours le dernier choix de l'utilisateur
    // s'il a fait le choix 1,3 c'est le choix 3 qui sera selectionné
    // s'il a fait le choix 1,2 c'est le choix 2 qui sera selectionné
     
    foreach($tab_marche as $id){
    echo "id ".$id."<br>";
        while ( $r3 = $req3->fetch()) { // while 2
     
                $typeMarcheId = $r3["typeMarcheId"];
                $typeMarcheLibelle = $r3["typeMarcheLibelle"];
                if ( $typeMarcheId == $id) {
                    $s3 = "selected";
                } else {
                    $s3 = "";
                }
     
                $ld_marches .= "<OPTION VALUE='$typeMarcheId' $s3 >
                            $typeMarcheLibelle</OPTION>";
     
            }// fin while 2
     
        }// fin du foreach
     
    $ld_marches .= "</SELECT>";  
     
    }// fin while 1
    Et donc j'ai toujours le dernier choix qui est selectionné
    J'ai essayé de faire une boucle for mais sans résultat probant !!
    Allez je continue mes recherches mais si vous avez une piste je suis preneur car là j'ai le cerveau en feu !!!

    Cordialement

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonne Année,

    1- Pour la requête, il faut (de préférence) préciser les noms des tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql2 = "SELECT t_choixmarches.choixMarcheAdherentId , t_choixmarches.choixMarcheTypeMarcheId 
    FROM t_adherents
    INNER JOIN t_choixmarches
    ON t_adherents.adherentId = t_choixmarches.choixMarcheAdherentId
    WHERE t_choixmarches.choixMarcheAdherentId = $adherentId ";
    ou avec des alias :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql2 = "SELECT CHX.choixMarcheAdherentId , CHX.choixMarcheTypeMarcheId 
    FROM t_adherents ADH
    INNER JOIN t_choixmarches CHX
    ON ADH.adherentId = CHX.choixMarcheAdherentId
    WHERE CHX.choixMarcheAdherentId = $adherentId ";
    Ca permet notamment d'avoir les mêmes noms de champs d'une table à l'autre sans souci.
    (ex. : ON ADH.adherentId = CHX.adherentId)

    2- CELA DIT, il faut utiliser une requête PREPAREE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sql2 = "SELECT CHX.choixMarcheAdherentId , CHX.choixMarcheTypeMarcheId 
    FROM t_adherents ADH
    INNER JOIN t_choixmarches CHX
    ON ADH.adherentId = CHX.choixMarcheAdherentId
    WHERE CHX.choixMarcheAdherentId = :adherentId ";
     
    $prep2 = $db->prepare($sql2);
    $req2 = $prep2->execute( array(
       ':adherentId' => $adherentId
       ));


    3- Après.... c'est le souk dans ton code...
    Il faudrait au moins qu'on ait la structure des tables, et un extrait des données pour comprendre ce que tu fais.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Salut

    Je prend note pour l'organisation de la requête avec la jointure des tables

    Pour le souk ok je pense en effet qu'il y a de l'amélioration à faire mais comme disait bakounine il y a de l'ordre dans tout désordre !!! Non mais t'as raison il faudra que je range mieux une fois mon problème réglé (eh encore il y a du mieux par rapport à "l'original") : je vais preparer toutes mes requêtes déjà !!

    J'ai donc un formulaire avec differents champs (texte, checkbox, liste déroulante simple et liste déroulante multiple)
    Voici le code de la liste deroulante multiple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <tr>
        <td class="td-admin">Quel(s) Type de Marche : <br />D&eacute;sirez-vous faire ? :</td>
        <td class="td-admin" colspan="3"><label for="lst_typemarche"></label>
           <select size="4" multiple name="lst_typemarche[]" id="lst_typemarche" ><!-- liste deroulante multiple -->
    	     <option value=-1>---- Choisir ----</option> 
            <?php		
    			$req1 = $db->query ("SELECT * FROM t_typemarches WHERE typeMarcheFlag='0' AND typeMarcheEssai='0'" );
    			while($r1 = $req1->fetch()){ 
    		?>
            <option value="<?php echo $r1['typeMarcheId']; ?>"> <?php echo $r1['typeMarcheLibelle'] ?></option>\n;			                 
            <?php
            }
            ?>        
          </select>
      </tr>
    J'ai donc 3 tables :

    1) Table t_adherents (adherentId, adherentNom , ........................)
    2) Table t_typemarches (typeMarcheId, typemarcheLibelle, ...............)
    3) Table t_choixmarches : c'est dans cette table que je récupère les choix que font les adhérents dans ma liste déroulante multiple

    Sinon voici donc la structure des ainsi que certaines données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    CREATE TABLE IF NOT EXISTS `t_adherents` (
      `adherentId` int(5) NOT NULL auto_increment,
      `adherentCivilite` tinyint(1) NOT NULL,
      `adherentNom` varchar(30) character set utf8 NOT NULL,
      `adherentPrenom` varchar(30) character set utf8 NOT NULL,
      `adherentSaisonSaisonId` int(2) NOT NULL default '1',
      `adherentTelephone` varchar(15) character set utf8 NOT NULL,
      `adherentEmail` varchar(50) character set utf8 NOT NULL,
      `adherentDateNaissance` date default NULL,
      `adherentAdresse` varchar(50) character set utf8 NOT NULL,
      `adherentCodePostal` int(6) NOT NULL,
      `adherentVille` varchar(30) character set utf8 NOT NULL,
      `adherentDateCertificat` date default NULL,
      `adherentNotes` text character set utf8 NOT NULL,
      `adherentFlag` tinyint(1) NOT NULL default '0',
      PRIMARY KEY  (`adherentId`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=4 ;
     
    --
    -- Contenu de la table `t_adherents`
    --
     
    INSERT INTO `t_adherents` (`adherentId`, `adherentCivilite`, `adherentNom`, `adherentPrenom`, `adherentSaisonSaisonId`, `adherentTelephone`, `adherentEmail`, `adherentDateNaissance`, `adherentAdresse`, `adherentCodePostal`, `adherentVille`, `adherentDateCertificat`, `adherentNotes`, `adherentFlag`) VALUES
    (1, 1, 'Morales', 'Jackie', 1, '0140025555', 'leblaireau@jackychantal.fr', '1958-04-10', '6 avenue dausmenil', 75012, 'Paris', '2016-05-19', '', 0),
    (2, 2, 'durand', 'pauline', 1, '0460015555', 'marie@live.fr', '1949-06-28', '4 Rue du 19 Mars 1962', 13000, 'Marseille', NULL, '          l''éèçù pourquoi', 0),
    (3, 1, 'Dupont', 'Jojo', 2, '0256565656', 'jojo@jojo.fr', '2017-12-04', '6 Rue du finistere', 29000, 'Quimper', NULL, '', 0);
     
     
    CREATE TABLE IF NOT EXISTS `t_typemarches` (
      `typeMarcheId` int(2) NOT NULL auto_increment,
      `typeMarcheLibelle` varchar(50) NOT NULL,
      `typeMarcheEssai` tinyint(1) NOT NULL default '0',
      `typeMarcheNotes` text NOT NULL,
      `typeMarcheFlag` tinyint(1) NOT NULL default '0',
      PRIMARY KEY  (`typeMarcheId`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
     
    --
    -- Contenu de la table `t_typemarches`
    --
     
    INSERT INTO `t_typemarches` (`typeMarcheId`, `typeMarcheLibelle`, `typeMarcheEssai`, `typeMarcheNotes`, `typeMarcheFlag`) VALUES
    (1, 'Marche Classique', 0, '', 0),
    (2, 'Marche Nordique', 0, '', 0),
    (3, 'Marche Rando Sante', 0, '', 0),
    (4, 'Marche Rando Sante Essai', 1, '', 0),
    (5, 'Marche Mini Rando Essai', 1, '', 0),
    (6, 'Marche Super Mini Essai', 1, '', 0),
    (7, 'Marche Vendredi Samedi Essai', 1, '', 0),
    (8, 'Marche Nordique Essai', 1, '', 0);
     
     
    CREATE TABLE IF NOT EXISTS `t_choixmarches` (
      `choixMarcheId` int(5) NOT NULL auto_increment,
      `choixMarcheAdherentId` int(5) NOT NULL,
      `choixMarcheTypeMarcheId` int(1) NOT NULL,
      `choixMarcheDate` date default NULL,
      `choixMarcheFlag` tinyint(1) NOT NULL default '0',
      PRIMARY KEY  (`choixMarcheId`),
      KEY `fk_choixmarches_1` (`choixMarcheAdherentId`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
     
    --
    -- Contenu de la table `t_choixmarches`
    --
     
    INSERT INTO `t_choixmarches` (`choixMarcheId`, `choixMarcheAdherentId`, `choixMarcheTypeMarcheId`, `choixMarcheDate`, `choixMarcheFlag`) VALUES
    (1, 1, 1, '2017-12-29', 0),
    (2, 1, 3, '2017-12-29', 0),
    (3, 2, 2, '2017-12-29', 0),
    (4, 3, 1, '2017-12-29', 0),
    (5, 3, 2, '2017-12-29', 0),
    (6, 3, 3, '2017-12-29', 0);
    Donc mon adherent choisit 1 ou plusieurs type de marche et à l'enregistrement ces choix vont dans la table t_choixmarches
    Ensuite j'ai un formulaire dans lequels j'affiche toutes les données de mon adhérent (nom, email...............) ainsi que ses choix de type de marche (ma fameuse liste déroulante multiple). Pour tous les champs (texte,checkbox, date et liste déroulante simple) pas de problème : tout s'affiche correctement. Par contre pour ma fameuse liste déroulante multiple je n'affiche qu'un choix (le dernier) : si l'adhérent a choisi les type de marche 1 et 3 je n'affiche que le 3 !!!
    Je pense qu'il faudrait que je fasse une boucle for mais je vois pas ou et comment !!!
    Donc voici le code de récupération de mes type de marche !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    // liste Type de marche
    // récupération des id type de marche de la table t_choixmarches par rapport à adherentId
     
    $sql2 = "SELECT choixMarcheAdherentId , choixMarcheTypeMarcheId 
    FROM t_adherents
    INNER JOIN t_choixmarches
    ON adherentId = choixMarcheAdherentId
    WHERE choixMarcheAdherentId = $adherentId ";
     
    $req2 = $db->query($sql2);
     
    while ($r2 = $req2->fetch()){ // while 1
        $choixMarcheAdherentId = $r2['choixMarcheAdherentId'];
        $choixMarcheTypeMarcheId = $r2['choixMarcheTypeMarcheId'];
     
    // ici je construit un tableau que je vais utiliser dans mon foreach
     
      $tab_marche = array($choixMarcheTypeMarcheId);
    //  $tab_list = implode( ',', $tab_marche ); // chaine de la forme : 1,3
    //  echo $tab_list;
     
    // là je vais chercher ma table t_typemarches pour avoir les libelles des typemarche
     
        $req3 = $db->query("SELECT typeMarcheId, typeMarcheLibelle,typeMarcheEssai  FROM t_typemarches WHERE typeMarcheEssai = '0' ORDER BY typeMarcheId ASC");
     
    // je commence ma construction de ma liste
    $ld_marches = "<SELECT multiple='4' NAME='lst_marche'>";
    $ld_marches .= "<OPTION VALUE=0>Choisissez</OPTION>";
     
    // et là j'essaie de faire un boucle pour associer le libelle de la marche à l'id récupéré 
    // j'ai bien ma liste qui s'affiche mais avec toujours le dernier choix de l'utilisateur
    // s'il a fait le choix 1,3 c'est le choix 3 qui sera selectionné
    // s'il a fait le choix 1,2 c'est le choix 2 qui sera selectionné
     
    foreach($tab_marche as $id){
    echo "id ".$id."<br>"; // pour vérifier que je récupère bien mes id de type de marche
        while ( $r3 = $req3->fetch()) { // while 2
     
                $typeMarcheId = $r3["typeMarcheId"];
                $typeMarcheLibelle = $r3["typeMarcheLibelle"];
                if ( $typeMarcheId == $id) {
                    $s3 = "selected";
                } else {
                    $s3 = "";
                }
     
                $ld_marches .= "<OPTION VALUE='$typeMarcheId' $s3 >
                            $typeMarcheLibelle</OPTION>";
     
            }// fin while 2
     
        }// fin du foreach
     
    $ld_marches .= "</SELECT>";  
     
    }// fin while 1
    Bon en espérant cette fois avoir été assez clair (mais pas trop long tout de même)
    Et promis je vais optimiser mon code

    Cordialement

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Salut

    Bonne année 2018 à tous les membres du site avec plein de bonnes choses pour vous et ceux que aimez !!

    Bon sinon mon problème de liste déroulante multiple personne n'a la solution ou alors j'ai dit ou fait quelque chose qui ne va pas ????

    Parce que là je suis vraiment bloqué et mon projet est stoppé : sniff sniff

    Quelques piste siou plait !!!!!!

    Merci

    Cordialement

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonannée,

    La construction du <select> est dans le while.
    Elle doit être en dehors.


    Mets des echo et var_dump dans ton code, pour comprendre ce qui se passe.


    Cela dit, je n'aime pas les select multiple.
    Des cases à cocher sont plus ergonomiques.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Gestion liste déroulante
    Par demenvil dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/09/2011, 11h15
  2. Réponses: 7
    Dernier message: 08/12/2007, 14h37
  3. Gestion de 5 listes déroulantes liées avec paramètres SQL
    Par kenshir0 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 06/04/2007, 18h46
  4. Réponses: 1
    Dernier message: 20/06/2006, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo