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 :

Select alimenté dynamiquement


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    .
    Inscrit en
    Juin 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Juin 2014
    Messages : 25
    Par défaut Select alimenté dynamiquement
    Bonjour,

    J'ai une page HTML "Objectifs" (formulaire avec checkboxes enregistré dans la table "objectif" ; valeur d'une checkbox cochée = 1 et non cochée = 0)
    Nom : Capture d’écran 2022-05-31 à 12.00.28.png
Affichages : 108
Taille : 50,5 Ko
    Dans cet exemple, les objectifs cochés sont : objectif1, objectif3 et objectif7.

    Dans ma bdd, j'ai une table "produit" avec pour chacun des produits enregistrés, le ou les objectif(s) au(x)quel(s) il répond
    Nom : Capture d’écran 2022-05-31 à 12.04.24.png
Affichages : 101
Taille : 72,9 Ko

    Je souhaiterais que, dans ma page "Solution", un select ne propose que les produits de ma table "Produit" répondant aux objectifs de la page "Objectifs"
    Dans notre exemple,
    les produits qui répondent à objectif1 sont : produit 1 et produit11 ;
    les produits qui répondent à objectif3 sont : produit 1, produit4 et produit6 ;
    les produits qui répondent à objectif7 sont : produit et produit3.

    Donc dans mon SELECT de ma page "Solution", je devrais avoir :
    Produit 1
    Produit 2
    Produit 3
    Produit 4
    Produit 6
    Produit 11

    Nom : Capture d’écran 2022-05-31 à 12.20.52.png
Affichages : 92
Taille : 60,4 Ko

    Mon problème est que je ne sais même pas par ou commencer.

    Quelqu'un pourrait-il me mettre sur la voie SVP ?????
    Peut-être ai-je mal construit ma table "Produit" ????

    Par avance merci.

    En attendant, je continue à chercher.

    François

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    J'ai une page HTML "Objectifs" (formulaire avec checkboxes enregistré dans la table "objectif" ; valeur d'une checkbox cochée = 1 et non cochée = 0)
    Une case à cocher non cochée ne vaut pas 0, elle n'existe pas.
    Tu décris plutôt des boutons radio Oui/Non.

    Dans ma bdd, j'ai une table "produit" avec pour chacun des produits enregistrés, le ou les objectif(s) au(x)quel(s) il répond
    Tu as donc autant de colonnes que d'objectifs possibles ?

    Je souhaiterais que, dans ma page "Solution", un select ne propose que les produits de ma table "Produit" répondant aux objectifs de la page "Objectifs"
    Dans notre exemple,
    les produits qui répondent à objectif1 sont : produit 1 et produit11 ;
    les produits qui répondent à objectif3 sont : produit 1, produit4 et produit6 ;
    les produits qui répondent à objectif7 sont : produit et produit3.

    Donc dans mon SELECT de ma page "Solution", je devrais avoir :
    Produit 1
    Produit 2
    Produit 3
    Produit 4
    Produit 6
    Produit 11
    Tu récupères les produits répondant à au moins 1 des objectifs sélectionnés => Il faut donc construire un WHERE composé de OR.

    Pour ton exemple la requête correspondante est :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ALL ...
    FROM ...
    WHERE FALSE OR objectif1 = 1 OR objectif3 = 1 OR objectif7 = 1
    -- Le FALSE sert juste à faciliter la construction, voir plus bas

    Pour pouvoir construire cette requête il faut que tu récupères le nom des objectifs cochés, ex.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    objectif1 : <input type="checkbox" name="objectifs[]" value="objectif1">
    objectif2 : <input type="checkbox" name="objectifs[]" value="objectif2">
    objectif3 : <input type="checkbox" name="objectifs[]" value="objectif3">
    ...
    Avec ce formulaire, tu récupèreras un tableau $_POST['objectifs'] contenant "objectif1", "objectif3" et "objectif7"

    Pour construire le WHERE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $where_objectifs = '';
    foreach ($_POST['objectifs'] as $objectif) {
        $where_objectifs .= " OR {$objectif} = 1";
    }
     
    $sql = <<<SQL
        SELECT ALL ...
        FROM ...
        WHERE FALSE {$where_objectifs}
        SQL;

  3. #3
    Membre averti
    Homme Profil pro
    .
    Inscrit en
    Juin 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Juin 2014
    Messages : 25
    Par défaut
    Bonjour Seb et un grand merci pour cette réponse rapide

    Effectivement, une checkbox non cochée ne vaut pas 0 mais enregistrée comme ça dans la BDD car case "NULL" non cochée.

    Oui c'est ça, il y a autant de colonnes que d'objectifs possibles.

    Je me penche sur ta solution et je reviens vers toi quoiqu'il en soit.

    Encore merci

    François

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    La table produit ne devrait pas être affublée d'autant de colonnes que d'objectifs possibles, car si le nombre d'objectifs évolue, il faut modifier la table des produits. De plus, la plupart des produits ne concernent qu'à un ou deux objectifs, on a donc une pléthore de colonnes vides systématiquement.

    Ce type de modèle "à plat" correspond à un tableur, pas à un SGBD-R, ce n'est pas un modèle évolutif (imaginez la tronche de la table produit si un jour on a besoin de gérer des centaines ou des milliers d'objectifs...)

    Si les règles de gestion sont
    R001 : un produit peut concerner zéro à plusieurs objectifs
    R002 : un objectif peut être concerné par zéro à plusieurs produits

    Alors il faut créer une table associative entre produit et objectif ayant pour PK (ID_produit+ID_objectif)

    Ainsi, la solution devient basique par une simple jointure.

    Il faudra toutefois faire attention à préciser s'il faut sélectionner tous les produits correspondants à au moins l'un des objectifs ou seulement les produits correspondants à tous les objectifs.

Discussions similaires

  1. [Toutes versions] Selection range selon valeur
    Par Kirgerad dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/04/2010, 13h12
  2. Apparition d'1 champ selon valeur de select
    Par BnA dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 24/07/2007, 10h54
  3. interdire une selection dans une liste selon valeur
    Par polianita dans le forum Access
    Réponses: 3
    Dernier message: 08/09/2006, 17h19
  4. Problème de "select" avec des valeurs a null
    Par SchpatziBreizh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/07/2005, 16h08
  5. affichage selon valeur entiere ou decimale
    Par Ankya dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 04/05/2005, 10h36

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