8791 sujets

Développement web côté serveur, CMS

Bonjour à toutes et à tous! Voilà je vous expose mon problème :

Je possède une base de données Mysql. Dans cette base, j'ai créé 4 tables

- Une table "site"{id_site, nom_site}
- Une table "batiment{id_bat, nom_bat, id_site}
- Une table "zone"{id_zone, nom_zone, id_bat}
- Et une table "responsable" {id_resp, nom_resp, prenom_resp, id_bat}

Dans l'idée, je souhaiterai réaliser un arbre comme celui-ci :

upload/38741-arbre.JPG

Et mon problème c'est que je ne vois pas comment construire ma requête pour réaliser ce type de lien (responsable -> site -> bâtiment -> zone)!

Si quelqu'un a une idée à me proposer, je suis preneur.
Merci d'avance Smiley cligne
Je sais que pour cela, j'ai besoin de réaliser des jointures mais malheuresement je ne suis pas très à l'aise avec ça! Smiley decu
Je comprends un peu mieux le principe des jointures, mais du coup si je comprends bien, dans mon cas je dois imbriquées plusieurs jointures entre elles? Si oui je voudrais bien un petit exemple car là je ne pense pas y arriver tout seul!
Je suis vraiment désolé, mais j'ai beau essayer plusieurs choses, je n'arrive toujours pas au résultat escompté. Je n'arrive vraiment pas à créer cette arborescence pourtant je pense que grâce aux différents champs "id" il y a bien une sorte de relation parent/ enfant entre les tables. Un exemple de code serait vraiment la bienvenue pour que je puisse comprendre le fonctionnement et le mettre en application. Merci!
Bonjour à tous, j'ai essayé de bidouiller une fonction que voici :


	require("configBDD.php");	// récupération des identifiants de la BDD
	$table_B="batiment";	// création de variables
	$table_Z = "zone";
	connexion_BDD();/*Connexion à la BDD*/
	
	$query = 	"SELECT  Z.id_zone AS num_zone, Z.nom_zone AS nom_zone, S.nom_site AS nom_site, B.nom_bat AS nom_bat FROM $table_Z Z INNER JOIN $table_B B ON B.id_bat = Z.id_bat INNER JOIN site S ON B.id_site = S.id_site ORDER BY Z.id_zone ASC"	
				or die('Impossible d\'exécuter la requête :' . mysql_error());		//Sinon ce message d'erreur s'affiche		
	$result = mysql_query($query); // on place le résultat de la requête dans une variable result
	$resultat = array();
	
	$site = '';
	$bat = '';
	$zone = '';
	if($result){	// on vérifie qu'il y a bien un résultat
		while($data = mysql_fetch_array($result)){	//on récupère le résultat dans un tableau nommé data
			if($site != $data['nom_site']){
				$site = $data['nom_site'];
				echo $site.'</br>';
				if($bat != $data['nom_bat']){
					$bat = $data['nom_bat'];
					echo "&nbsp;&nbsp;&nbsp;&nbsp;".'*'.$bat.'</br>';
					if($zone != $data['nom_zone']){
						$zone = $data['nom_zone'];
						echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".'**'.$zone.'</br>';
					}
				}				
			} 
			else{
				if($bat != $data['nom_bat']){
					$bat = $data['nom_bat'];
					echo "&nbsp;&nbsp;&nbsp;&nbsp;".'*'.$bat.'</br>';
					if($zone != $data['nom_zone']){
						$zone = $data['nom_zone'];
						echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".'**'.$zone.'</br>';
					}
				}
				else{
					if($zone != $data['nom_zone']){
						$zone = $data['nom_zone'];
						echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".'**'.$zone.'</br>';
					}
				}				
			}
		}
	}
	else { echo "echec mission";}

	mysql_free_result($result);// on libère la mémoire allouée pour $result		
		  
 	deconnexion_BDD();	



Par contre je ne pense pas que se soit la meilleure méthode et de plus, je ne sais pas comment enregistrer l'arbre complet pour le renvoyer en Json lors d'une requête AJAX faisant appel à ce script PHP.

Voici le résultat obtenu :

site1
*bat1
**SEJOUR
**CUISINE
**WC
**CHAMBRE 4
**CHAMBRE 1
**CHAMBRE 2
**CHAMBRE 3
**SALLE DE BAIN 1
**SALLE DE BAIN 2
**DRESSING
*bat_2
**SEJOUR
**CUISINE
**WC
**CHAMBRE 4
**CHAMBRE 1
**CHAMBRE 2
**CHAMBRE 3
**SALLE DE BAIN 1
**SALLE DE BAIN 2
**DRESSING
site 2
*bat 1
**SEJOUR

Si quelqu'un a une idée, je suis preneur. Merci! Smiley smile
Modifié par lorenzo_one (15 Sep 2011 - 10:42)
La question à se poser n'est elle pas sur l'architecture de la base ?

Je m'explique.

La table resp liste les responsables. Chaque responsable doit être unique dans cette table.
Un responsable peut-il l'être de plusieurs bâtiments ?
La table resp contenant l'id du bâtiment montre a priori que non.

Une table "batiment{id_bat, nom_bat, id_resp, id_site} me semble plus adéquate : chaque bat a un responsable

Je pense que cela simplifie la requête : "chercher id_bat, nom_bat, id_site" quand "id_resp=12"


Dans le futur, est-il envisageable qu'il y ait un responsable par zone ? si oui c'est la table zone qui devrait contenir l'id_resp ...

Dans ce cas il faut penser la requête resp - > zone ( puis zone -> bat -> site)
En fait si, il y a bien un responsable qui sera responsable de plusieurs bâtiments. Du coup, ma structuration est fausse et la tienne me semble la plus adéquate. Je te remercie de m'avoir fait découvrir cette erreur. Mais du coup saurais-tu comment réaliser cet arbre. Je m'explique, je souhaite qu'au démarrage de ma page, une requête AJAX fasse appel à un script me renvoyant cet arbre et que chacun de ses éléments soit sélectionnable.

Exemple, lorsque je cliquerai sur bat1, j'afficherai toutes les données concernant ce bâtiment.
Et je ne vois vraiment pas comment m'y prendre! (En fait la requête AJax, je sais comment m'y prendre mais je ne vois pas comment créer l'arbre et le renvoyer au navigateur?)
Modifié par lorenzo_one (15 Sep 2011 - 11:35)
J'ai du mal à voir l'intérêt de l'arbre en fait. Il faudrait en savoir plus sur les cas possibles dans la réalité.

La requête à partir du responsable doit sortir le bâtiment (et les zones?) pour lequel il est responsable et pas les autres sites, bâtiments, zones ...
Les informations me semblent inutiles (et pas liées à la personne choisie)

Les informations me semblent signifiantes en phase "descendante"
- je choisis un site -> je veux voir les bâtiments
- je choisis un bâtiment -> je veux voir le responsable

Pour une information "montante" l'arbre ne me semble pas indiqué (je choisis un responsable, je veux voir de quel bâtiment il est responsable, voir les autres ne sert (à mon avis) pas à grand chose

Si cet arbre doit servir de navigation il ne faut pas la lier à un responsable.

Boucle pour lister les sites
Dans cette boucle lister les bâtiments
Dans cette boucle lister les zones et les responsables



Pour le fonctionnement en ajax la requête bat -> resp (ou zone) se fait au clic sur le lien (chaque nom de batiment est un lien vers la page php qui fait la requete avec l'id du bat en paramètre)

L'information se développe au besoin, à la demande de l'utilisateur


Ce n'est peut être pas la solution, cela dépend vraiment de l'utilisation au final... quelles seront les voies de consultation des données, quelle est l'information nécessaire etc.



edit ; j'avais mal lu...
apparemment tu es d'accord que le resp n'est pas le bon point d'entrée pour l'arbre...

Donc ta page liste les sites avec un lien vers requete_site.php?site="id_site"
la page requête renvoie la liste des bâtiments avec un lien vers requete_bat.php?bat="id_bat"&resp="id_resp"
la page requete_resp renvoie les infos sur le responsable et le batiment
Modifié par pascal31 (15 Sep 2011 - 15:25)