Concaténation de variables

Fermé
gregounet - 9 juil. 2008 à 23:14
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 - 10 juil. 2008 à 14:01
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

4 réponses

macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
10 juil. 2008 à 09:05
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
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
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
10 juil. 2008 à 11:33
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
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
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
10 juil. 2008 à 12:50
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
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
macgawel Messages postés 664 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 1 novembre 2008 89
10 juil. 2008 à 14:01
- 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