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 :

Affectation "dynamique" de valeurs dans un tableau


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Par défaut Affectation "dynamique" de valeurs dans un tableau
    Bonjour,

    J'ai la problématique suivante :
    - Je fais une requête sur des tables d'une base de données afin de récupérer deux types de données : Un ensemble de fonctions et un ensemble de valeurs (chaque valeur correspond à une fonction).
    - A partir de ces valeurs, je souhaite créer un tableau qui contient chacune des fonctions récupérées et qui leur affecte la bonne valeur.
    - A noter que le nombre de fonctions (et donc de valeurs) peut changer en fonction de la requête effectuée (l'un des paramètres de la requête est une variable).

    Mon problème porte sur la création du tableau. J'ai trouvé 2-3 trucs, mais ça me semble trop tordu pour être une bonne solution. Est-ce que quelqu'un peut m'aider ?

    Merci d'avance pour toute aide .

    devdebutante

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu n'as pas un lien relationnel dans ta base entre les fonctions et les valeurs ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Par défaut
    Bonjour,

    Tout d'abord, merci de t'intéresser à mon problème. Je ne suis pas sure de comprendre ta question. En fait, ma requête porte sur trois bases de données :
    - AccessContextualMenus : SupportMemberStateID, ContextualMenuFonctionID, AccessContextualMenuState.
    - ContextualMenuFonctions : ContextualMenuFonctionID, ContextualMenusID, ContextualMenuFonctionName, ContextualMenuFonctionDescription.
    - ContextualMenus : ContextualMenuID, ContextualMenuName, ContextualMenuDescription.

    Ma jointure entre ces trois tables porte sur ContextualMenuID et sur ContextualMenuFonctionID. Je récupère les données ContextualMenuFonctionName et AccessContextualMenuState pour un profil SupportMemberStateID et un nom de menu ContextualMenuName donnés.

    Normalement, je récupère donc une table avec deux colonnes. Dans chaque ligne j'ai un nom de fonction et une valeur correspondante. Je me trompe ?

    Mon soucis, c'est donc de créer un tableau avec comme champ (le nom de chaque fonction => valeur de chaque fonction).
    J'ai pensé à créer une chaîne de caractères, mais c'est très moche, non ?

    devdebutante

  4. #4
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    heu.. si tu récupères les fonctions et les valeurs correspondantes sur chaque ligne, il te suffit de faire un truc du genre (pseudo code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $array = array();
    while (fetch(...)) { // fetch spécifique à ton system (pdo, mysql etc)
      $array[column_des_funcs] = column_des_valeurs;
    }
    Trop simple pour être vrai ?

  5. #5
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Par défaut
    Salut et merci .

    Mon problème porte justement sur comment je dois procéder à l'affectation. En fait je suis en train de revoir un bout de code d'une application (astres, pour ne pas la citer) afin de pour voir créer des profils et leur affecter des fonctions. Actuellement, tout est codé en dur :
    array(contextualMenuName1=array(fonction1.1=>valeur1.1, fonction1.2=>valeur1.2,etc.), contextualMenuName2=array(fonction2.1=>valeur2.1, etc.), etc.).
    Les valeurs, ce sont simplement des "TRUE" ou "FALSE" (j'ai mis 0 ou 1 dans ma table) pour dire si en fonction du profil, on affiche dans le menu telle ou telle fonction ("ajouter un document", "rechercher une personne", etc.).
    Si je comprend bien ton pseudo code, je fait un fetch (ma base est en mysql => wampserver) qui va me donner deux tableaux. Un avec mes fonctions, l'autre avec mes valeurs.
    Ensuite, j'imagine qu'il faut que j'ajoute un count pour trouver le nombre de lignes de mes tableau (normalement, les deux doivent avoir le même nombre de lignes). Ou alors, c'est via ton "while" que cela est fait ?
    Ensuite je fait une boucle sur chaque élément de mon tableau "fonctions" pour lui affecter la valeur "valeurs". Mais je vois pas trop comment jouer sur les indices . Au niveau de l'affectation, cela ne posera pas de problèmes si je fais un "=>" à la place de ton"=" ?

    Désolé si les questions sont un peu "naïves", mais je rame un peu avec les tableaux et les requêtes sql.

    Merci en tout cas de m'aider.

    devdebutante.

  6. #6
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Par défaut
    C'est encore moi.

    J'ai parcouru un peu mon ami et voici ce que j'ai trouvé (ça me semble très proche de ce que tu m'as proposé metagoto) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ($row = mysql_fetch_assoc($requete) ){ 
    $fonction = $row['ContextualMenuFonctionName]; 
    $ContextualMenu [$fonction] = $row['AccessContextualMenuState']; 
    }
    Ya des chances pour que ça fonctionne ? Je vais tester ce soir, mais si on peut me dire avant s'il y a des trucs complètement aberrant par rapport à ce que je veux...
    Si ça marche, c'est vraiment tout simple comme bout de code

    devdebutante

  7. #7
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Oui c'est ça (toujours d'après ce que tu avais dit)

    Les tableaux en php sont dynamiques, pas la peine de préciser une taille fixe ou des indices pour ajouter des items.

    Comme là tu travailles avec des tableaux associatifs (les clé sont des chaînes), tu peux procéder comme tu l'as fait.

  8. #8
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Par défaut
    Je vais être un poils embêtante...

    Dans l'application, il y a une fonction pour gérer la connexion à la base de données. Voici la définition de la fonction :
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
     function dbConnection()
     {
         switch($GLOBALS["CONF_DB_SGBD_TYPE"])
         {
             case "IBMDB2" :
             case "MSAccess" :
                 $PearServerType = "odbc";
                 break;
             default:
                 $PearServerType = $GLOBALS["CONF_DB_SGBD_TYPE"];
                 break;
         }
     
         $Dsn = "$PearServerType://";
     
         if (!empty($GLOBALS["CONF_DB_USER"]))
         {
             $Dsn .= $GLOBALS["CONF_DB_USER"];
         }
     
         if (!empty($GLOBALS["CONF_DB_PASSWORD"]))
         {
             $Dsn .= ":".$GLOBALS["CONF_DB_PASSWORD"];
         }
     
         $Dsn .= "@".$GLOBALS["CONF_DB_SERVER"];
     
         if (!empty($GLOBALS["CONF_DB_DATABASE"]))
         {
             $Dsn .= "/".$GLOBALS["CONF_DB_DATABASE"];
         }
     
         // Open the connection
         $DbCon = DB::connect($Dsn, FALSE);
     
         // If the connection fails
         if (DB::isError($DbCon))
         {
             // Try to create a localhost connection
             $Dsn = "$PearServerType://";
     
             if (!empty($GLOBALS["CONF_DB_USER"]))
             {
                 $Dsn .= $GLOBALS["CONF_DB_USER"];
             }
     
             if (!empty($GLOBALS["CONF_DB_PASSWORD"]))
             {
                 $Dsn .= ":".$GLOBALS["CONF_DB_PASSWORD"];
             }
     
             $Dsn .= "@localhost";
     
             if (!empty($GLOBALS["CONF_DB_DATABASE"]))
             {
                 $Dsn .= "/".$GLOBALS["CONF_DB_DATABASE"];
             }
     
             // Open the localhost connection
             $DbCon = DB::connect($Dsn, FALSE);
     
             // If the localhost connection fails
             if (DB::isError($DbCon))
             {
                 die("$DbCon->message<br /><b>".$GLOBALS["LANG_ERROR_DB_CONNECTION"]."</b>");
             }
         }
     
         // Return the DB object created
         return $DbCon;
     }
     
     
    J'ai vu dans le code de l'application qu'habituellement, les requêtes sont effectuées de la façon suivante :
    $DbResult = $DbCon->query(Select ... WHERE ...);
     
    J'ai donc opté pour créer la fonction suivante :
     
    function AccessConextualMenus($ContextualMenu)
    {
    	// Connection to the database
    	$DbCon = dbConnection();
     
    	$SupportMemberStateID = $_SESSION["SupportMemberStateID"];
     
    	// Database request
    	$DbResult = $DbCon->query("SELECT cmf.ContextualMenuFonctionName, acm.AccessContextualMenuState FROM AccessContextualMenus acm, ContextualMenuFonctions cmf, ContextualMenus cm WHERE cm.ContextualMenuID = cmf.ContextualMenusID AND acm.ContextualMenuFonctionID = cmf.ContextualMenuFonctionID AND cm.ContextualMenuName = '$ContextualMenu' AND acm.SupportMemberStateID = '$SupportMemberStateID'");
     
    	// Creation of the contextual menu
    	while ($row = mysql_fetch_assoc($DbResult) ){
    		$fonction = $row['ContextualMenuFonctionName'];
    		$ContextualMenuReturned [$fonction] = $row['AccessContextualMenuState'];
    	}
     
    	return $ContextualMenuReturned;
    }
     
    Mais je récupère l'errreur suivante :
    Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource
    J'ai essayé d'utiliser mysql_error, mais ça ne me met rien...:cry:
     
    Par contre, avec le code :
     
    function AccessConextualMenus($ContextualMenu)
    {
    	// Connection to the database
    	$DbCon = dbConnection();
     
    	$SupportMemberStateID = $_SESSION["SupportMemberStateID"];
     
    	// Database request
    	$sql= "SELECT cmf.ContextualMenuFonctionName, acm.AccessContextualMenuState FROM AccessContextualMenus acm, ContextualMenuFonctions cmf, ContextualMenus cm WHERE cm.ContextualMenuID = cmf.ContextualMenusID AND acm.ContextualMenuFonctionID = cmf.ContextualMenuFonctionID AND cm.ContextualMenuName = '$ContextualMenu' AND acm.SupportMemberStateID = '$SupportMemberStateID'";
    	$DbResult = mysql_query($sql);
     
    	// Creation of the contextual menu
    	while ($row = mysql_fetch_assoc($DbResult) ){
    		$fonction = $row['ContextualMenuFonctionName'];
    		$ContextualMenuReturned [$fonction] = $row['AccessContextualMenuState'];
    	}
     
    	return $ContextualMenuReturned;
    }
    Ca marche. Je sais que c'est bien d'avoir un truc qui marche, mais comme dans toute l'application c'est le premier cas qui est utilisé, ça me gène de faire un truc à ma sauce .

    Je ne comprend pas la différence .

    Encore un peu d'aide s'il-te-plait ?

    devdebutante

  9. #9
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    mysql_fetch_assoc($resource_result) prend en paramètre un result retourné au préalable par mysql_query()

    $DbCon->query() retourne sûrement un truc différent. Ca retourne même peut être un objet qui encapsule un "result_resource". Ca dépend de l'implémentation.

    Regarde les sources ? Aussi, si on a à faire à un objet, alors celui-ci implémente peut être des méthodes qui font office des fetch_*() de mysql.

    Ta deuxième solution fonctionne car mysql_query() travaille à partir de la base de la connexion courante (crée dans dbConnection()).

    Bref, ton prob est spécifique à l'implémentation de "$DbCon->query()" dont on ne sait rien...

  10. #10
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Par défaut
    En fait, j'initialise $DbCon = dbConection();

    A part ça je ne peux pas en dire beaucoup plus .

    PS : Désolé pour le code directement dans le message .

    devdebutante

  11. #11
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Ah, en fait ton DB:: est à coup sûr PEAR DB
    Donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ($row = $DbResult->fetchRow(DB_FETCHMODE_ASSOC)) {
      // ...
    }
    Ca fait des lustres que je n'ai pas utilisé PEAR DB. Regarde la doc au cas où.

  12. #12
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Par défaut
    Youhou, ça marche

    Merci bcp de ton aide

    devdebutante

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/01/2008, 19h04
  2. Réponses: 6
    Dernier message: 26/12/2006, 18h01
  3. Réponses: 4
    Dernier message: 28/11/2006, 00h20

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