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
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
A voir également:
- Concaténation de variables
- Excel concatener une plage de cellules ✓ - Forum Excel
- Vba excel sélectionner une plage de cellules variable ✓ - Forum VB / VBA
- Nuage de points excel 4 variables - Forum Excel
- Concaténation pdf - Guide
- Inverse de concatener - Forum Excel
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
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é.
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...)
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...)
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" ...
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" ...
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
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 :
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>'; }
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;
}
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;
}
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
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").
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").
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
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
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
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
- 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