jointures de tables et affichage

Répondre
Keika
le 10/10/2007 à 16:13
Keika
Salut.

Voici mon probleme:
j'ai trois tables:
-membre (contient les membres)
-menus (contient mes menus...)
-link (lie les menus et les membres)

Alors voila comment ca fonctionne, lors de l'ajout d'un membre, je lui attribue aussi des menus afin qu'il puisse gerer ses propres parties du site. Jusque la pas de probleme. Maintenant dans la partie admin, pour le "super-admin", j'essaye d'aficher un tableau avec tous les menus et dans la cellule en face du menu, les differents pseudos autorises a effectuer des changements dans ce menu.

Alors je trouve les bonnes entrees seulement au lieu d'afficher une seul fois le menu puis tous les noms attribues a ce menu, j'ai une ligne par entree.

ma ligne SQL:

<?php

$sql = 'SELECT menus.id, nom, position, id_membre, id_menu, membre.id, login
FROM menus, membre, link
WHERE menus.id = link.id_menu
AND membre.id = id_membre
ORDER BY nom ASC ;' ;
?>


et la tete de l'affichage:

id nom position id_membre id_menu id login
11 Arbitrage 1 18 11 18 Ellya
2 Calendrier 2 19 2 19 Test3
6 Clubs du 92 1 17 6 17 test
8 Comite directeur 1 19 8 19 Test3
1 Contact 2 19 1 19 Test3
14 Ecole des cadres 1 19 14 19 Test3
14 Ecole des cadres 1 18 14 18 Ellya
14 Ecole des cadres 1 17 14 17 test
5 Entrainements Elite 1 19 5 19 Test3
9 Stages 1 18 9 18 Ellya

Comme vous le voyez pour le menu Ecole des Cadres, j'ai les trois entrees normal, mais l'affichage est comme ca, alors que je ne voudrais qu'une ligne et les pseudo dans la cellule d'en face...

merci d'avance

K.
Le PHP --> C'est dur !
LA GLOBULE
le 10/10/2007 à 22:35
LA GLOBULE
Tu peux t'en sortir avec un petit traitement en PHP.

Le tout, c'est que lorsque tu affiches tes données SQL, à chaque passage dans le while (j'imagine que tu as un while mysql_fetch_array), tu dois tester si le nom du menu que tu cherches à afficher n'a pas déjà été affiché.

Cela se fait sans soucis avec un if et une variable temporaire qui "retient" le nom du menu du dernier passage dans le while.
Keika
le 11/10/2007 à 14:04
Keika
Merci bien LA GLOBULE, c'etait effectivement ca.
Maintenant j'ai ca:

<?php

echo'<table summary="menus et logins">' ;
//Tant qu'on a des resultats on les enregistres
while($data = mysql_fetch_array($req)){

//On teste si le menu dans la session n'est pas egal au menu sortit de la requete
if($_SESSION['menu'] != $data['nom']){

echo '<tr><td>'.$data['nom'].'</td>' ;
}

echo'<td>'.$data['login'].'</td>' ;

//On definit la session menu comme etant le dernier nom de menu sortit
$_SESSION['menu'] = $data['nom'] ;

}//Fin while

echo'</tr></table>' ;

?>


Par contre maintenant, j'aimerai eviter d'avoir une nouvelle cellule par login... une idee pour ca ? (je suis decu la...)

Merci en tout cas.

K.
Le PHP --> C'est dur !
tyberium
le 14/10/2007 à 00:34
tyberium
Bonsoir

Je vais essayé de t expliquer.

1 - la requête :
1.1 - Tu fais ta requête et tu l exécutes avec une boucle. La pas de problème.

2 - La boucle :
2.1 - Il faut que tu initialises une variable $last_nom
2.2 - Tu lui donneras $data['nom'] comme valeur en fin de boucle.

3 - Le tableau :
3.1 - En premier il faut faire 2 comparaisons (dans la meme condition) pour fermer la ligne en cours
3.2 - en second tu fais une comparaison pour demarrer une nouvelle ligne si menu_id change.

<?php
$sql = 'SELECT menus.id AS menu_id, nom, position, id_membre, id_menu, membre.id, login
FROM menus, membre, link
WHERE menus.id = link.id_menu
AND membre.id = id_membre
ORDER BY nom ASC';

$reg = mysql_query($sql);

$last_menu_id = '';
echo'<table summary="menus et logins">' ;

while($data = mysql_fetch_array($req))
{
//On teste si le nouveau menu_id est differant de l ancien ET que $last_menu_id n est pas égale à '', c est pour fermer la ligne
if($last_menu_id != $data['menu_id'] AND $last_menu_id != '')
{
echo '</tr>' ;
}
//On teste si le nouveau menu_id est égal à l ancien
if($last_menu_id == $data['menu_id'])
{
echo '<tr><td>'.$data['nom'].'</td>' ;
}

echo'<td>'.$data['login'].'</td>' ;

// on donne $data['menu_id'] comme valeur à $last_menu_id
$last_nom = $data['nom'];
}//Fin while

echo'</tr></table>' ;

?>


Test ca. Attention ton tableau sera déformé du à une différence de cellule par ligne. Je n est pas testé

Pour tout ce qui est des comparaisons, utilise les id car il est unique, tu peux avoir des nom identique( ptete pas dans ton cas mais c'est un bon réflex à prendre).

++ Jerome


Ps je te laisse imaginer la galère si tu as plusieurs niveaux genre section, cat, id ... un petit exemple dont je suis assez fière !
Keika
le 14/10/2007 à 06:34
Keika
Merci bien Jerome, effectivement c'est plus propre comme ca. Au moins le code est valid !

Ce que je ne comprends pas c'est que firefox comprenait tout de meme le fonctionnement.
Mon code creait une nouvelle ligne avant de fermer la precedente et pourtant le tableau s'affichait correctement...

Mais bon, probleme resolu !

Merci encore.
Le PHP --> C'est dur !
Keika
le 14/10/2007 à 06:42
Keika
pardon du double post.

Pour ce qui est de la difference de ligne, j'ai mis un colspan="6" sur ma toute premiere cellule (celle avec "Membres" dedans)
Je ne pense pas que ca depassera 6 donc ca a toujours l'air ok. Mais si ca depasse, je modifierai ou j'essaye un code qui compte le nom de login et trouve le bon colspan ^_^
Le PHP --> C'est dur !
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours