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 :

rechercher des valeurs dans 2 tables (table et sous table) et les positionner dans un if


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    fais ce que je peux en n'informatique
    Inscrit en
    Janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : fais ce que je peux en n'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut rechercher des valeurs dans 2 tables (table et sous table) et les positionner dans un if
    Bonjour,

    Désolé par avance pour le titre qui n'est certainement pas explicite

    Je vous expose mon problème :

    au début de mon projet, j'ai crée une table "membre"
    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
    +----------------------+--------------+------+-----+---------+----------------+
    | Field                | Type         | Null | Key | Default | Extra          |
    +----------------------+--------------+------+-----+---------+----------------+
    | membre_id            | int(11)      | NO   | PRI | NULL    | auto_increment |
    | membre_pseudo        | varchar(30)  | NO   |     | NULL    |                |
    | membre_mdp           | varchar(100) | YES  |     | NULL    |                |
    | membre_email         | varchar(250) | NO   |     | NULL    |                |
    | membre_avatar        | varchar(100) | YES  |     | NULL    |                |
    | membre_description   | varchar(100) | NO   |     | NULL    |                |
    | membre_groupe        | int(4)       | NO   |     | NULL    |                |
    | membre_cse           | int(11)      | YES  |     | NULL    |                |
    | membre_valid         | int(2)       | NO   |     | NULL    |                |
    | membre_perdu         | int(2)       | NO   |     | NULL    |                |
    | membre_nom           | varchar(26)  | NO   |     | NULL    |                |
    | membre_prenom        | varchar(26)  | NO   |     | NULL    |                |
    | membre_bureau        | varchar(30)  | YES  |     | NULL    |                |
    | membre_professionnel | varchar(30)  | YES  |     | NULL    |                |
    | membre_personnel     | varchar(30)  | YES  |     | NULL    |                |
    | membre_mdp_mauvais   | int(1)       | YES  |     | NULL    |                |
    +----------------------+--------------+------+-----+---------+----------------+
    et une table "groupe"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +-------------------------------------+-------------+------+-----+---------+----------------+
    | Field                               | Type        | Null | Key | Default | Extra          |
    +-------------------------------------+-------------+------+-----+---------+----------------+
    | groupe_id                           | int(11)     | NO   | PRI | NULL    | auto_increment |
    | groupe_titre                        | varchar(30) | NO   |     | NULL    |                |
    | cat_ordre                           | int(11)     | NO   |     | NULL    |                |
    +-------------------------------------+-------------+------+-----+---------+----------------+
    la spécificité de la table "membre" est la présence d'une colonne "membre_groupe" (donc un membre peut faire parti d'un unique groupe)


    aujourd'hui j'ai besoin qu'un membre face parti de plusieurs groupes. J'ai donc crée une autre table "x_membre_groupe" de liaison entre "membre" et "groupe"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +------------------+---------+------+-----+---------+----------------+
    | Field            | Type    | Null | Key | Default | Extra          |
    +------------------+---------+------+-----+---------+----------------+
    | membre_groupe_id | int(11) | NO   | PRI | NULL    | auto_increment |
    | membre_id        | int(11) | NO   |     | NULL    |                |
    | groupe_id        | int(11) | NO   |     | NULL    |                |
    +------------------+---------+------+-----+---------+----------------+
    avec, comme vous l'avez compris :
    membre.membre_id = x_membre_groupe.membre_id
    et
    x_membre_groupe.groupe_id = groupe.groupe_id

    Jusqu'ici, tout va bien.

    la donnée contenue dans le colonne "membre.membre_groupe" serait considéré comme "groupe principal"
    les données contenues dans la colonne "x_membre_groupe.groupe_id" seraient considérées comme "groupes secondaire"

    Comment puis-je récupérer la valeurs de la colonne "membre.membre_groupe" et toutes les valeurs de la colonne "x_membre_groupe.groupe_id" d'un membre afin de les positionner dans un if ?

    Le but est d'afficher des informations suivant les groupes
    comme ceci en exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ($donnee['membre.membre_groupe'] == 1 or $donnee ['groupe.membre_id'] == 8 or $donnee ['groupe.membre_id'] == 9)
    {
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ($donnee['membre.membre_groupe'] == 2 or $donnee ['groupe.membre_id'] == 10 or $donnee ['groupe.membre_id'] == 11)
    {
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ($donnee['membre.membre_groupe'] == 3 or $donnee ['groupe.membre_id'] == 11 or $donnee ['groupe.membre_id'] == 12)
    {
     
    }
    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 342
    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 342
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = <<<SQL
        SELECT ALL membre_groupe FROM membre WHERE membre_id = {$id}
        UNION ALL
        SELECT ALL groupe_id FROM x_membre_groupe WHERE membre_id = {$id}
        SQL;
     
    $groups = $pdo->query($sql)->fetchAll();
    Avec ceci tu récupères tous les groupes d'un membre dans un tableau $groups.

    Tu peux ensuite utiliser in_array() pour vérifier si un membre appartient à un groupe particulier,

    et array_intersect() pour vérifier s'il appartient à plusieurs groupes en particulier.

  3. #3
    Membre confirmé
    Homme Profil pro
    fais ce que je peux en n'informatique
    Inscrit en
    Janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : fais ce que je peux en n'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut
    Merci de ton intervention,

    Je ne suis pas familiarisé avec la forme de requête que tu me proposes
    j'ai ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    			$query=$db->prepare('SELECT * FROM membre
    			LEFT JOIN x_membre_groupe ON membre.membre_id = x_membre_groupe.membre_id
    			WHERE membre.membre_id = :id');
    			$query->bindValue(':id',$id,PDO::PARAM_INT);
    			$query->execute();	
    			foreach($query as $donnees) 
    			{
    				echo $donnees['groupe_id'] ;
    			}
    			echo $donnees['membre_groupe'];
    c'est la suite que je ne parviens pas à trouver. je connais le principe d'un array avec des valeurs en dur mais je ne sais pas l'appliquer avec le résultat d'une requête.

  4. #4
    Membre confirmé
    Homme Profil pro
    fais ce que je peux en n'informatique
    Inscrit en
    Janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : fais ce que je peux en n'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut
    Bonjour,

    J'ai trouvé quelque chose qui fonctionne : est-ce une solution propre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    			if(in_array("2", $donnees2) or in_array("3", $donnees2))
    			{
    			        echo 'il est dans un des groupes';
    			}
    			else
    			{
    				echo' non, il n'est dans aucun des groupes';
    			}
    Merci

  5. #5
    Membre confirmé
    Homme Profil pro
    fais ce que je peux en n'informatique
    Inscrit en
    Janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : fais ce que je peux en n'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		if(in_array("10", $donnees2) or in_array("3", $donnees2))
    			{
    			        echo 'il est dans un des groupes';
    			}
    			else
    			{
    				echo' non, il n'est dans aucun des groupes';
    			}
    Ce code pose problème. si mon membre fait parti du groupe "1", le texte affiché sera "il est dans un des groupes" puisque dans le nombre "10" il y a le chiffre "1"
    comment faire ?

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 342
    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 342
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par willou-78 Voir le message
    Ce code pose problème. si mon membre fait parti du groupe "1", le texte affiché sera "il est dans un des groupes" puisque dans le nombre "10" il y a le chiffre "1"
    Nope, le problème est ailleurs, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(in_array('10', ['1'])); // false => Le "1" de "10" n'est pas pris en compte
    comment faire ?
    J'ai donné une solution, je ne vois pas mieux. Et ton bout de script ne me permet pas de t'aider davantage.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 623
    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 623
    Billets dans le blog
    10
    Par défaut
    Bonjour Willou-78
    Citation Envoyé par willou-78 Voir le message
    aujourd'hui j'ai besoin qu'un membre face parti de plusieurs groupes. J'ai donc crée une autre table "x_membre_groupe" de liaison entre "membre" et "groupe"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +------------------+---------+------+-----+---------+----------------+
    | Field            | Type    | Null | Key | Default | Extra          |
    +------------------+---------+------+-----+---------+----------------+
    | membre_groupe_id | int(11) | NO   | PRI | NULL    | auto_increment |
    | membre_id        | int(11) | NO   |     | NULL    |                |
    | groupe_id        | int(11) | NO   |     | NULL    |                |
    +------------------+---------+------+-----+---------+----------------+
    avec, comme vous l'avez compris :
    membre.membre_id = x_membre_groupe.membre_id
    et
    x_membre_groupe.groupe_id = groupe.groupe_id

    Jusqu'ici, tout va bien.
    Non, tout ne va pas bien : ce que vous appelez "table de liaison" est en fait une table associative.
    Or une table associative ne doit pas avoir d'identifiant propre, son identifiant doit être composé des différents identifiants des tables avec lesquelles elle est en relation.

    Au niveau conceptuel, on établira le MCD suivant (en supposant qu'un groupe contient au moins un membre qu'un membre peut appartenir à aucun ou plusieurs groupes)

    Nom : Sans titre.png
Affichages : 178
Taille : 12,2 Ko

    De ce MCD, tout logiciel de modélisation dérive automatiquement le modèle tabulaire suivant

    Nom : Sans titre.png
Affichages : 176
Taille : 18,0 Ko

    Ajouter un identifiant artificiel comme vous l'avez fait, a plusieurs inconvénients

    • Si la PK est cet identifiant artificiel, alors vous risquez d'avoir plusieurs fois la même combinaison identifiant membre + identifiant groupe avec différentes PK
    • Si la PK n'est pas cet identifiant artificiel, alors il est inutile
    • Comme on a de toute façon besoin de faire le lien avec les tables membre et groupe, vous aurez besoin d'indexer les colonnes membre_id et groupe_id de la table associative, vous cramez donc un index inutile à cause de l'identifiant artificiel


    Ce n'est pas pour rien qu'aucun logiciel de modélisation n'ajoute un identifiant artificiel aux tables associatives

  8. #8
    Membre confirmé
    Homme Profil pro
    fais ce que je peux en n'informatique
    Inscrit en
    Janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : fais ce que je peux en n'informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour Willou-78
    ...
    oh oui, vous avez raison. Je vais prendre une pose car je développe énormément en ce moment alors que je c'est pas ma formation de base.

    J'ai d'autres tables associatives, je n'ai pas fais cette erreur.

    Merci du rappel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Rechercher des valeurs dans une plage et insérer une ligne en dessous
    Par Maloma dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/06/2016, 12h08
  2. [Débutant] rechercher des valeurs dans une datagrid à partir d'une textbox
    Par franklinw dans le forum C#
    Réponses: 6
    Dernier message: 09/10/2012, 17h30
  3. [XL-97] Rechercher des valeurs dans un tableau
    Par PIEPLU dans le forum Excel
    Réponses: 2
    Dernier message: 25/04/2012, 14h53
  4. Réponses: 4
    Dernier message: 18/12/2009, 13h44
  5. [XL-2003] rechercher des valeurs dans des onglets suivant liste
    Par spico45 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/11/2009, 16h44

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