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 :

Comparaison avec un champ à multiples valeurs. [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut Comparaison avec un champ à multiples valeurs.
    Bonjour à vous,

    Je suis actuellement en stage dans une boite pour développer un logiciel métier avec php/mysql.

    Pour se connecter à se logiciel, la boîte dispose déjà d'un SSO. Ils m'ont demandé de faire des menus différents suivant le groupe de l'utilisateur enregistré. Pour cela ils m'ont demandé d'utilisé la variable [GROUPE] de $_SERVER. Jusqu'à la pas de souci, j'ai fait mes différentes tables de menu suivant les groupes possibles, mais au moment d'effectuer la comparaison entre [GROUPE] et mon groupeId de mes tables, je me suis rendu compte qu'ils avaient chacun plusieurs valeur dans [GROUPE] (entre 5 à 8 valeurs suivant les membres ex:[GROUPE] => (toto;tutu;titi;toto-manager;blabla)

    Malgré plusieurs recherche sur internet, je n'ai pas trouvé de solution viable.

    Quelqu'un pourrait-il m'apporter quelques pistes ou indications sur la façon de comparer mon champ avec un champ contenant plusieurs valeurs ?

    ex :

    j'ai ma table groupe, avec un champ groupeId et un champ groupeNom.
    groupeId - groupeNom
    1 - voiture
    2 - chaise
    3 - maison

    et je veux comparer groupeNom avec $_SERVER[GROUPE] = toto;tutu;maison;titi; sachant que là le résultat doit être positif puisqu'il fait parti du groupe "maison".


    Cordialement,

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    => SQL : l'opérateur IN
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE NomChamp IN (valeur1, valeur2, ... , valeurX )

    Il faudra remplacer les ; par des ,.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $groupe = 'toto;tutu;titi;toto-manager;blabla';
     
    $groupe_list = str_replace(';', ',', $groupe);
    $sql = "SELECT ......... WHERE NomChamp IN ( ".$groupe_list." )";

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 322
    Par défaut
    les valeurs sont des chaines

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $groupe = 'toto;tutu;titi;toto-manager;blabla';
    $groupe_list= explode(';',$groupe);
    $sql = "SELECT ......... WHERE NomChamp IN ('".implode("', '", $groupe_list)."') ";

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut Merci
    Merci pour vos réponses ça marche pour certaines valeurs mais ça me pose un autre souci

    en fait dans $_server[groupe] j'ai des groupes genre ('COMPTA-BLEU', 'COMPTA-ROUGE', 'COMPTA-JAUNE').

    et si je fais un "SELECT ......... WHERE groupeNom IN ( ".$groupe_list." )"; sachant que mon groupeNom = 'COMPTA' car toutes les compta ont les mêmes accès ben ça ne me sort aucun résultat :/ et je ne peux pas rentrer les différentes valeurs de compta dans le tableau car j'ai mis 3 couleurs en exemple mais dans la BDD il y en a plusieurs dizaines, de même pour les autres types.


    J'ai pensé à faire avec les '-' comme vous avez fait pour les ';', c'est à dire les remplacer par des virgules, mais ce n'est pas une bonne solution car ça pose encore un autre souci :

    ex : j'ai dans $_SERVER[groupe] ('DEV-ROUGE', 'DEV-BLEU', 'DEV-MANAGER', 'RESEAU-ROUGE', 'RESEAU-BLEU', 'RESEAU-MANAGER') ... donc si j'enlève les '-', je pourrais plus différencier DEV-MANAGER et RESEAU-MANAGER :/

    une idée ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui.
    Revoir la CONCEPTION.

    Il faut "normaliser" les noms de groupe.

  6. #6
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    Revoir la conception ? Je suis en alternance dans une boite ENORME (elle porte à la fois le nom d'un fruit et d'une couleur pour ne pas la citer ^^)

    Je me vois pas aller voir le patron et lui dire "bon garçon on va revoir la conception de votre LDAP et renommer les milliers de groupes que vous avez !"

    ^^'

  7. #7
    Invité
    Invité(e)
    Par défaut
    Tu travailles à "Banane Bleu" ?

    Dans ton 1er message, tu fais une généralité (toto, tata, titi, maison, chaise....)
    On te répond par une généralité.

    Dans ce cas, donne-nous au moins suffisamment d'information sur les "particularités" des noms de groupe + ceux en BdD.

    On ne peut pas deviner.

  8. #8
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    moi dans ma table groupe j'ai (DOS, DI, DOS-MANAGER, DI-MANAGER, DAS)

    et dans $_SERVER[Groupe] on peut trouver (entre-autre car je vais pas mettre 10000 ligne ahah)
    DOS
    DOS-AVAYA
    DOS-ENREGISTREURS
    DOS-GENESYS
    DOS-ISO
    DOS-LOGISTIQUE
    DOS-MANAGER
    DOS-SD
    DOS-SD-PLS
    DOS-SD-PRS
    DOS-SD-SMS
    DI
    DI-DEV
    DI-OPK
    DI-SO-BL2
    DI-MANAGERS
    DAS-CDG
    DAS-CDG-GRC
    DAS-CDG-ICC
    DAS-CDG-Online
    DAS-CDG-Paiement


    et donc je dois faire un menu qui s'affiche différemment pour chaque catégorie. Un pour tous les DOS, un autre pour tous les DI, et autre pour tous les DAS, et un pour les DOS-MANAGER et un pour DI-MANAGER.

    Donc j'ai déjà fait le menu, lorsque j'entre une valeur en dur "WHERE groupeNom = 'DOS'" ça marche ça affiche que la partie DOS mais la partie qui me bloque c'est pour faire en dynamique avec la comparaison à $_SERVER[groupe].

  9. #9
    Invité
    Invité(e)
    Par défaut
    Et des exemples CONCRETS de $_SERVER[groupe] ?

  10. #10
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    ["Groupe"]=> string(57) "DOSC-SSC;MBS;kvm_admin;rso_user;DOP;OPE-EXPLOIT"


  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par JangoBtz Voir le message
    moi dans ma table groupe j'ai (DOS, DI, DOS-MANAGER, DI-MANAGER, DAS)
    "DOSC-SSC;MBS;kvm_admin;rso_user;DOP;OPE-EXPLOIT"
    Ca n'aide pas vraiment...

    Quand tu sauras ce qu'il faut comparer et avec quoi, tu sauras établir des règles de comparaison...

  12. #12
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    ["Groupe"]=> string(57) ["Groupe"]=> string(57) "DOS-SSC;MBS;kvm_admin;rso_user;DOP;OPE-EXPLOIT"

    (désolé je viens de capter que j'avais mis un C après dos ^' mon ctrl+c à du déraper ^^')

    edit : donc il devrait afficher le menu des DOS en comparant nomGroupe avec $_SERVER[Groupe] vu qu'il appartient à DOS-SSC

  13. #13
    Invité
    Invité(e)
    Par défaut
    Il n'est pas difficile de "sortir "DOS" de "DOS-SSC" avec un explode()

    Mais ce qui me chiffonne, c'est dans la table : DOS, DI, DOS-MANAGER, DI-MANAGER,....
    "DOS" et "DOS-MANAGER" ont des menus différents, c'est bien ça ?
    Ca complique nettement...

    1/ QUESTION 1 : peut-on avoir aussi :
    • "DOS-machin1", "DOS-machin2",... ? => menu "DOS"
    • "DOS-MANAGER-machin1", "DOS-MANAGER-machin2",... ? => menu "DOS-MANAGER"

    Sachant que pour "DOS-machin1", "machin1" ne peut pas être "MANAGER"...

    Si je reprends ce que tu as fourni :
    DOS
    DOS-AVAYA
    DOS-ENREGISTREURS
    DOS-GENESYS
    DOS-ISO
    DOS-LOGISTIQUE
    DOS-SD
    DOS-SD-PLS
    DOS-SD-PRS
    DOS-SD-SMS
    (autres ?)
    => menu "DOS" ??
    DOS-MANAGER
    (autres ?)
    => menu "DOS-MANAGER" ??

    2/ QUESTION 2 : "DOS" et "DI" peuvent-ils être dans un même groupe ?
    "DOS-SSC;DI...."
    Dans ce cas, quel menu afficher : menu "DOS" ou menu "DI" ?? ?

  14. #14
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    oui on a DOS-XXX avec XXX qui peut prendre plusieurs valeurs (DOS-SCC, DOS-SD, DOS-LOGISTIQUE) et aussi DOS-XXX-XXX => menu DOS

    puis parmi eux on a DOS-MANAGER (DOS-MANAGER-XXX n'existe pas ça s'arrête après MANAGER) => menu DOS-MANAGER

    et c'est le même fonctionnement pour les DI.


    le menu est sous la forme
    menu 1
    sous-menu 1
    sous-menu 2
    sous-menu 3
    menu 2
    sous-menu 4
    sous-menu 5
    menu 3
    sous-menu 6
    sous-menu 7

    et genre les DOS ont 1,2,4,6 et les DOS-MANAGER ont 1,2,3,4,5,6,7.

    faire apparaître le bon menu suivant le groupe j'y arrive en rentrant en dur le nom du groupe c'est juste la comparaison entre nomGroupe et $_SERVER[Groupe] qui me bloque :/

    EDIT : non un DOS ne sera jamais DI ni DAS et inversement

  15. #15
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    Oui tu as compris en gros TOUT ce qui commence par DOS- ... prend le menu DOS SAUF pour la catégorie DOS-MANAGER qui sera la seule à avoir le menu DOS-MANAGER

  16. #16
    Invité
    Invité(e)
    Par défaut
    Teste comme ceci :
    1/ requête + création d'un array de tous les groupes en BdD.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $groupeTEST = "DOSC-SSC;MBS;kvm_admin;rso_user;DOP;OPE-EXPLOIT";
    // on ajoute un ; à la fin :
    $groupeTEST = $groupeTEST.';';
     
    // requete de la table "GROUPE"
    $sql = "SELECT groupeNom FROM groupe";
    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    while($row = mysql_fetch_array($req))
    {
    	$result_array[] = $row['groupeNom'];
    }
    2/ recherche le "nom complet" :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $resultat_trouve = false;
    foreach($result_array as $groupeNom){
    	if (strpos($groupeTEST, $groupeNom.';') !== false){ // d'où l'intérêt d'ajouter un ; à la fin
    		echo 'pour '.$groupeTEST.', le menu à afficher est : '.$groupeNom.'<br />';
    		$resultat_trouve = true; // on a bien trouvé un résultat
    	}
    }
    3/ recherche de "sous-groupe" :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Si on ne trouve pas de résultat "complet", il faut chercher la partie AVANT le "-".
    if($resultat_trouve == false)
    {
    	foreach($result_array as $groupeNom)
    	{
    		if (strpos($groupeTEST, $groupeNom.'-') !== false){
    			echo 'pour '.$groupeTEST.', le menu à afficher est : '.$groupeNom.'<br />';
    			$resultat_trouve = true; // on a bien trouvé un résultat
    		}
    	}
    }
    C'est un début.
    Après, il faut voir si ça gère tous les cas particuliers....
    Dernière modification par Invité ; 06/11/2013 à 15h50.

  17. #17
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    Merci beaucoup d'avoir pris le temps de réfléchir à mon problème et de m'aider

    après plusieurs test sur ta solution proposé j'ai encore un souci.

    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
     
    $groupeTEST = "DOS;MBS;kvm_admin;rso_user;DOP;OPE-EXPLOIT";
                // on ajoute un ; à la fin :
                $groupeTEST = $groupeTEST.';';
                $sql = "SELECT groupeNom FROM groupe";
                $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
                while($row = mysql_fetch_array($req))
                {
                            $result_array[] = $row['groupeNom'];
                }
                //$result_array = mysql_fetch_array($req);
                var_dump($result_array);
                $resultat_trouve = false;
                foreach($result_array as $groupeNom){
                  if (strpos($groupeTEST, $groupeNom.';')){ // d'où l'intérêt d'ajouter un ; à la fin
                        echo 'pour '.$groupeTEST.', le menu à afficher est : '.$groupeNom.'<br />';
                        $resultat_trouve = true; // on a bien trouvé un résultat
                   }
                  else {
                  echo 'non';
                  echo $groupeNom;
                  }
                }

    le var_dump($result_array) me donne : array(5) { [0]=> string(4) "DOS" [1]=> string(3) "DDI" [2]=> string(3) "DAF" [3]=> string(12) "DOS-MANAGER" [4]=> string(11) "DDI-MANAGER" }

    donc OK


    mais le foreach me sort nonDOSnonDDInonDAFnonDOS-MANAGERnonDDI-MANAGER ...


    je ne comprend pas ^^ le DOS devrait passer par le if pas par le else pour ce cas là non ? ...

  18. #18
    Invité
    Invité(e)
    Par défaut
    remplace :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $result_array = mysql_fetch_array($req);
    par :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $result_array = array();
    while($row = mysql_fetch_array($req))
    {
    	$result_array[] = $row['groupeNom'];
    }
    => voir mysql_fetch_array() : "Retourne une ligne de résultat MySQL sous la forme d'un tableau associatif, d'un tableau indexé, ou les deux "

  19. #19
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    J'ai édité mon message pendant que tu postais le tien lis celui du dessus !

  20. #20
    Invité
    Invité(e)
    Par défaut
    Le problème vient de strpos() :
    pour "DOS;", la position trouvée est... 0 ! (considérée donc comme "fausse")
    Avertissement
    Cette fonction peut retourner FALSE, mais elle peut aussi retourner une valeur équivalent à FALSE. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.
    Il suffit d'écrire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strpos($groupeTEST, $groupeNom.';') !== false){

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

Discussions similaires

  1. [AC-2010] PB Comparaison avec un champ caché
    Par redbeard dans le forum VBA Access
    Réponses: 3
    Dernier message: 29/09/2013, 22h00
  2. [AC-2010] SELECT / WHERE Champ multiples valeurs
    Par Antoine B dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/04/2013, 18h49
  3. champs à multiples valeurs
    Par lalens dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/03/2009, 19h56
  4. jointure sur champ avec multiple valeur
    Par robert_trudel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/05/2007, 17h40
  5. formulaire avec des champs multiples
    Par don'de dans le forum Struts 1
    Réponses: 13
    Dernier message: 16/02/2007, 09h42

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