Concaténation de variables

gregounet -  
macgawel Messages postés 676 Statut Membre -
Bonjour,

j'ai une table mysql de personnes, avec pour chaque personne 0, 1, 2 ou 3 spécialités ou les lignes ressemblent a ceci:
personne1 specialiteA null null
personne2 specialiteA specialiteB null

j aiaussi un tableau qui contient toutes les specialités: $arrayspec=array(specialiteA, specialiteB)

il faudrait que je fasse un affichage

SPECIALITE A
personne1
personne 2

SpecialiteB
personne 2

??????
j'ai pensé parcourire une fois ma table et faire des sous tableau du genre:
$arrayspecialiteA, $arrayspecialiteB etc

et ensuite faire des array_merge (par example sur $arrayspecialiteA) pour rajouter une personne (par example pour rajouter personne1 et personne2 dans $arrayspecialiteA)

et ensuite faire afficher tous les tableaux:

foreach( $i=0; i< count($arrayspec); i++)
{
echo $array.$arrayspec[$i];// il faudrait que ca m affiche : specialiteA puis a la prochaine occurence, specialiteB
for($j=0; j<count($array.$i) ;j++)
{
echo $array.$arrayspec[$i][$j]; // il faudrait que ca m affiche toutes les personnes qui ont la specialiteA puis mm //chose pour la B
}
// Mon probleme est ici, je ne sais pas comment faire changer le nom de la variable avec l evolution de la premiere //boucle
}

un petit peut d aide serrait la bienvenue merci
Configuration: Windows XP
Firefox 1.5.0.12

4 réponses

  1. macgawel Messages postés 676 Statut Membre 89
     
    Bonjour.

    Il y a un problème dans la logique de tes tables.
    Base de données Relationnelle : voir la normalisation des BDD.

    Exemple de problèmes qui peuvent arriver avec ton modèle :
    - Une personne se retrouve avec une quatrième spécialité.
    - Afficher la liste des personnes correspondant à une spécialité.

    Si c'est possible, revoir le schéma, avec les tables (PK = Primary Key, clé primaire) :

    Personnes => Id_pers (PK), Nom, Prenom, <autres>
    Specialites => Id_spec (PK), Nom_spec, <autres>
    Sachant qu'une personne peut avoir zéro, une ou plusieurs spécialités, et qu'une spécialité peut correspondre à zéro, une ou plusieurs personnes, il faut faire une table de liaison :
    Spec_Pers =>Id_pers (PK), Id_spec (PK)
    (que tu peux dénormaliser en rejoutant nom et nom_spec)
    Ce qui te permet d'avoir des relations normales entre tes tables...
    Du coup, pour ta demande, il suffira de faire une jointure sur les trois tables.

    Si tu ne peux pas modifier ton schéma, le plus efficace (à mon sens), c'est de faire une fonction qui t'affiche la liste des personnes ayant la spécialité passée en paramètre. Ensuite, tu l'appelles une fois pour chaque spécialité.

    function AfficherSpecialistes($spec) {
       $liste_spec = '';
       // Connexion à la base
       $req = "SELECT Nom from Personnes WHERE (spec1 = $spec) OR (spec2 = $spec) OR (spec3 = $spec=";
       $result = mysql_db_query($req) or die ('Erreur de requete '.$req.'<br />'.mysql_error());
       while ($row = mysql_fetch_array($result)) {
    // On récupère la liste des personnes ayant la spécialité $spec
          $liste_spec = $row['Nom'].'<br />';
       }
       return $liste_spec;
    }
    
    // On prend chaque spécialité
    foreach ($arrayspec as $specialite) {
    // On affiche la spécialité
       echo '<h2>'.$specialite,'</h2>';
    // On affiche les personnes ayant cette spécialité   
       echo AfficherSpecialistes($specialite);
    }


    Le problème, avec ton code, c'est que tu mélange FOR et FOREACH (va voir le rôle de FOREACH dans la doc, ça devrait te donner des idées ;-).

    Il faudrait faires soit :
    for( $i=0; $i< count($arrayspec); $i++)
    Soit :
    foreach($arrayspec as $i)
    (Et aussi, n'oublie pas le $ pour tes variables...)
    0
  2. gregounet
     
    désolé,

    j'avais deja envisagé cette solution mais je voulais éviter de faire 30 requetes, car il me semblait que ce ne serrait pas efficace...

    c'est pour ca que je ne voulais faire qu'un requete sur toutes les personnes , et de la, les "trier" ...
    0
    1. macgawel Messages postés 676 Statut Membre 89
       
      J'insiste : Tu ne peux pas modifier ton schéma de BDD ? Ca te simplifierait les choses...

      Sinon, ça va dépendre du nombre de spécialités envisagées, du nombre de personnes, et de la façon dont tu récupères tes valeurs. Mais il faudrait tester si ce n'est pas plus rentable de faire plusieurs requêtes (une par spécialité), plutôt qu'une grosse et des tris...

      Si tu tiens vraiment à tout récupérer d'un coup, puis à "trier", tant qu'à faire, tu peux faire ça au moment où tu récupères le résultat de ta requête :
      //Tu commences par initialiser un tableau associatif qui fera correspondre aux spécialités la liste des personnes.
      // J'utilise ton tableau qui contient toutes les spécialités,
      // Mais tu pourrais utiliser le résultat d'une requête...
      foreach ($arrayspec as $var) {
      	$specs[$var] = '';
      }
      
      //Maintenant, tu récupères le résultat de ta requête.
      // (Je ne suis plus sûr que c'est bien un fetch_assoc qu'il faut utiliser :-O )
      while ($res=mysql_fetch_assoc($req)) {
      // Au niveau mise en page HTML, je fais une liste, mais tu peux faire ce que tu veux....
      // A modifier suivant les noms des champs...
      	$specs[$res['spec1']] .= '<li>'.$res['nom'].'</li>';
      	$specs[$res['spec2']] .= '<li>'.$res['nom'].'</li>';
      	$specs[$res['spec3']] .= '<li>'.$res['nom'].'</li>';
      }
      
      // Affichage :
      // On boucle sur le tableau $specs qui est de la forme $specs['nom de specialité']=<liste des personnes>
      foreach ($specs as $var=>$val) {
      // Donc $var contient le nom de la spécialité et $val la liste des personnes...
      	echo '<ul>'.$var;
      	echo $val;
      	echo '</ul>';
      }
      
      
      0
  3. gregounet
     
    je ne vois pas comment je pourrai changer ma bddpour une meilleur optimisation ... pourrait tu expliciter
    par contre grace a ton aide, je pense que ceci devrai marcher

    $req_spec qui contiendrait les resultats de "SELECT * FROM specialite"
    //et
    $req_equi qui contiendrait les resultats de "SELECT * FROM equipe"

    //ensuite,
    //creation du tableau des différentes specialités
    while($res_spec=mysql_fetch_assoc($req_spec))
    {
    $specs[$res_spec['specialite']]=' ';
    }

    //etant donné que je sais( c'est moi qui l'ai défini comme ca) qu'il ne peut y avoir que 4 specialités par personne au maximum, et que cette specialité se trouve d office dans la table des specialités
    while($res_equi = mysql_fetch_assoc($req_equi))
    {
    if($res_equi['specialite1'] != NULL)$specs[$res_equi['specialite1']].='<BR>'.$res_equi['nom'];
    if($res_equi['specialite2'] != NULL)$specs[$res_equi['specialite2']].='<BR>'.$res_equi['nom'];
    if($res_equi['specialite3'] != NULL)$specs[$res_equi['specialite3']].='<BR>'.$res_equi['nom'];
    if($res_equi['specialite4'] != NULL)$specs[$res_equi['specialite4']].='<BR>'.$res_equi['nom'];
    }

    //et pour l'affichage:
    foreach($specs as $var=>$val)
    {
    echo '<BR>'.$var;
    echo $val;
    }
    0
    1. macgawel Messages postés 676 Statut Membre 89
       
      Pour optimiser ta BDD...

      Au pire, si tu es sûr de ne pas avoir plus de 4 spécialités, mets 4 champs dans la table des personnes, un par spécialité, et tu "flag" (un 1 pour "il a cette spécialité", un 0 pour "il ne l'a pas").
      0
  4. gregounet
     
    hehe :p

    tu as mal compris

    en fait les champs de ma table equipe resemblent a ca:
    id - Nom - Prenom - specialité1 - id_spec1 - specialite2 - id_spec2 - specialite3 - id_spec3 - specialite4 - id_spec4

    et on aurra par example

    1- jean- aimarre- kiné- 1- null-null- null-null- podologue-13

    4- mac- gawel- podologue - 13- infirmié- 10 -null - null

    et je m attend a un affichage:

    kiné:
    jean aimarre

    podologue:
    jean aimarre
    mac gawel

    infirmié:
    mac gawel

    sachant que les champs de ma table specialité ont la forme:

    id specialite
    ex:
    1 kiné
    13 podologue
    10 infirmier
    0
    1. macgawel Messages postés 676 Statut Membre 89
       
      - Le jour où tu (ou ton successeur) passes à "kinésithérapeute", tu fais quoi ?
      - Le jour où tu rajoutes une spécialité, tu fais quoi ?
      - ...

      Si je devais faire une BDD à partir de zéro, je ferais ça :
      EQUIPE : id - Nom - Prenom
      SPECIALITE : id specialite
      SPEC_EQU : id_equipe, id_spec

      =>
      EQUIPE :
      1- jean- aimarre
      4- mac- gawel

      SPECIALITE
      1 kiné
      13 podologue
      10 infirmier

      SPEC_EQU
      1 - 1 (Jean aimarre Kiné)
      1 - 13 (jean aimarre Podo)
      4 - 13
      4 - 10

      En rajoutant éventuellement le nom de l'aquipier et le nom de la spécialité dans SPEC_EQU
      - Changer l'appellation ne pose aucun problème
      - Rajouter une spécialité non plus
      0