begin process at 2012 02 15 04:57:57
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

SQL

 > UNE ARBORESCENCE.

UNE ARBORESCENCE.


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :SQL Classé sous :arborescence, mysql, arbre, tree, requetes Niveau :Débutant Date de création :04/03/2008 Vu :9 600

Auteur : coucou747

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note


 Description

il existe deux facons de faire une arborescence, la naive, et l'autre.

pre-requis :
http://sqlpro.developpez.com/cours/arborescence/

je propose ici, quelques fonctions en php, qui permettent d'utiliser de facon simple, et en mysql4, ce qui est explique dans le tuto (suite a un bloquage sur le forum, j'ai decide de recoder ca).

on peut donc ajouter dans l'arborescence, supprimer un element, ou supprimer un element et les sous-branches. les fonctions d'affichages sont aussi fournies (d'ailleur, elles sont en mode debug).

c'est fait juste pour illustrer le tuto, normalement, on devrais en faireu ne class php5, voir une abstract class + deux implementations, enfin j'ai pas trop reflechi au schemat, mais c'etait pas vraiment le but de la source...

Source

  • <?php
  • // http://sqlpro.developpez.com/cours/arborescence/
  • mysql_connect(............) or die(mysql_error());
  • mysql_query('CREATE DATABASE IF NOT EXISTS tests') or die(mysql_error());
  • mysql_query('USE tests') or die(mysql_error());
  • function array_top($s){
  • $top=array_pop($s);
  • array_push($s, $top);
  • return $top;
  • }
  • //MODELE 1 D'ARBO :
  • //creation de la table
  • mysql_query('CREATE TABLE IF NOT EXISTS arbo1(
  • id INT UNSIGNED AUTO_INCREMENT,
  • nom VARCHAR(100),
  • id_parent INT UNSIGNED,
  • PRIMARY KEY(id))
  • ') or die(mysql_error());
  • //ici, les insertions se font naturellement. Exemple
  • //mysql_query('INSERT INTO arbo1(nom, id_parent) VALUES ("parent", 0), ("enfant1", 1), ("enfant2", 1), ("enfant de enfant1", 2), ("enfant de enfant 2", 3) ') or die(mysql_error());
  • //mais la fonction d'affichage est recursive...
  • function affArbo1($id=0){
  • echo '<ul>';
  • $r=mysql_query('SELECT id, nom FROM arbo1 WHERE id_parent='.$id) or die(mysql_error());
  • while($data=mysql_fetch_assoc($r)){
  • echo '<li>'.$data['nom'];
  • affArbo($data['id']);
  • echo '</li>';
  • }
  • echo '</ul>';
  • }
  • //affArbo1();
  • // MODELE 2 D'ARBO
  • //mysql_query('DROP TABLE arbo2');
  • // creation de la table
  • mysql_query('CREATE TABLE IF NOT EXISTS arbo2(
  • id INT UNSIGNED AUTO_INCREMENT,
  • nom VARCHAR(100),
  • poidG INT UNSIGNED,
  • poidD INT UNSIGNED,
  • PRIMARY KEY(id))
  • ') or die(mysql_error());
  • // insertion dans la racine
  • //mysql_query('INSERT INTO arbo2(nom, poidG, poidD) VALUES ("parent", 0, 1) ') or die(mysql_error());
  • // fonction d'ajout dans l'arbo : on ajoute sous l'id $id, avec le nom $nom.
  • function addInArbo2($id, $nom){
  • $req=mysql_query('SELECT poidD FROM arbo2 WHERE id='.$id) or die(mysql_error());
  • $poidD=mysql_fetch_row($req);
  • if ($poidD===false) throw new Exception('id invalide');
  • $poidD=$poidD[0];
  • mysql_query('UPDATE arbo2 SET poidD=poidD+2 WHERE poidD >= '.$poidD) or die(mysql_error());
  • mysql_query('UPDATE arbo2 SET poidG=poidG+2 WHERE poidG > '.$poidD) or die(mysql_error());
  • mysql_query('INSERT INTO arbo2(nom, poidG, poidD) VALUES("'.$nom.'", '.($poidD).', '.($poidD+1).')') or die(mysql_error());
  • }
  • /*
  • addInArbo2(1, 'enfant');addInArbo2(1, 'enfant');addInArbo2(1, 'enfant');
  • addInArbo2(2, 'enfant');addInArbo2(2, 'enfant');addInArbo2(2, 'enfant');
  • addInArbo2(3, 'enfant');addInArbo2(3, 'enfant');addInArbo2(4, 'enfant');
  • */
  • // suppression de l'element $id. (les sous menus prennent la place de l'element.)
  • function dellArbo2($id){
  • $req=mysql_query('SELECT poidG, poidD FROM arbo2 WHERE id='.$id) or die(mysql_error());
  • $poidG=mysql_fetch_assoc($req);
  • if ($poidG===false) throw new Exception('id invalide');
  • $poidD=$poidG['poidD'];
  • $poidG=$poidG['poidG'];
  • mysql_query('DELETE FROM arbo2 WHERE id='.$id) or die(mysql_error());
  • mysql_query('UPDATE arbo2 SET poidD=poidD+1, poidG=poidG+1 WHERE poidD < '.$poidD.' AND poidG > '.$poidG) or die(mysql_error());
  • mysql_query('UPDATE arbo2 SET poidG=poidG-2 WHERE poidG >= '.$poidG) or die(mysql_error());
  • mysql_query('UPDATE arbo2 SET poidD=poidD-2 WHERE poidD >= '.$poidG) or die(mysql_error());
  • }
  • // suppression de l'element $id, et de tout les sous menu.
  • function delAllSub2($id){
  • $req=mysql_query('SELECT poidG, poidD FROM arbo2 WHERE id='.$id) or die(mysql_error());
  • $poidG=mysql_fetch_assoc($req);
  • if ($poidG===false) throw new Exception('id invalide');
  • $poidD=$poidG['poidD'];
  • $poidG=$poidG['poidG'];
  • mysql_query('DELETE FROM arbo2 WHERE poidD<='.$poidD.' AND poidG>='.$poidG) or die(mysql_error());
  • mysql_query('UPDATE arbo2 SET poidG=poidG-'.($poidD-$poidG+1).' WHERE poidG >= '.$poidG) or die(mysql_error());
  • mysql_query('UPDATE arbo2 SET poidD=poidD-'.($poidD-$poidG+1).' WHERE poidD >= '.$poidD) or die(mysql_error());
  • }
  • // affichage de l'arbo 2.
  • function affArbo2(){
  • echo '<ul>';
  • $r=mysql_query('SELECT id, nom, poidD, poidG FROM arbo2 ORDER BY poidG') or die(mysql_error());
  • $l=0;
  • $stack=array();
  • while($data=mysql_fetch_assoc($r)){
  • do {
  • $top=array_top($stack);
  • if ($top===null || $top>$data['poidG']+1){
  • break;
  • }else {
  • echo '</ul>';
  • array_pop($stack);
  • }
  • } while(true);
  • echo '<li>'.$data['nom'].' : [ '.$data['poidG'].', '.$data['poidD'].'] ->'.$data['id'];
  • if ($data['poidD']==$data['poidG']+1)
  • echo '</li>';
  • else{
  • echo '<ul>';
  • array_push($stack, $data['poidD']);
  • }
  • }
  • echo '</ul>';
  • }
  • //dellArbo2(2);
  • //delAllSub2(2);
  • affArbo2();
  • ?>
<?php
// http://sqlpro.developpez.com/cours/arborescence/
mysql_connect(............) or die(mysql_error());
mysql_query('CREATE DATABASE IF NOT EXISTS tests') or die(mysql_error());
mysql_query('USE tests') or die(mysql_error());


function array_top($s){
	$top=array_pop($s);
	array_push($s, $top);
	return $top;
}


//MODELE 1 D'ARBO :

//creation de la table
mysql_query('CREATE TABLE IF NOT EXISTS arbo1(
	id 	INT UNSIGNED AUTO_INCREMENT,
	nom	VARCHAR(100),
	id_parent INT UNSIGNED,
	PRIMARY KEY(id))
') or die(mysql_error());

//ici, les insertions se font naturellement. Exemple
//mysql_query('INSERT INTO arbo1(nom, id_parent) VALUES ("parent", 0), ("enfant1", 1), ("enfant2", 1), ("enfant de enfant1", 2), ("enfant de enfant 2", 3) ') or die(mysql_error());

//mais la fonction d'affichage est recursive...
function affArbo1($id=0){
	echo '<ul>';
	$r=mysql_query('SELECT id, nom FROM arbo1 WHERE id_parent='.$id) or die(mysql_error());
	while($data=mysql_fetch_assoc($r)){
		echo '<li>'.$data['nom'];
		affArbo($data['id']);
		echo '</li>';
	}
	echo '</ul>';
}
//affArbo1();







// MODELE 2 D'ARBO

//mysql_query('DROP TABLE arbo2');
// creation de la table
mysql_query('CREATE TABLE IF NOT EXISTS arbo2(
	id 	INT UNSIGNED AUTO_INCREMENT,
	nom	VARCHAR(100),
	poidG INT UNSIGNED,
	poidD INT UNSIGNED,
	PRIMARY KEY(id))
') or die(mysql_error());
// insertion dans la racine
//mysql_query('INSERT INTO arbo2(nom, poidG, poidD) VALUES ("parent", 0, 1) ') or die(mysql_error());
// fonction d'ajout dans l'arbo : on ajoute sous l'id $id, avec le nom $nom.
function addInArbo2($id, $nom){
	$req=mysql_query('SELECT poidD FROM arbo2 WHERE id='.$id) or die(mysql_error());
	$poidD=mysql_fetch_row($req);
	if ($poidD===false) throw new Exception('id invalide');
	$poidD=$poidD[0];

	mysql_query('UPDATE arbo2 SET poidD=poidD+2 WHERE poidD >= '.$poidD) or die(mysql_error());
	mysql_query('UPDATE arbo2 SET poidG=poidG+2 WHERE poidG > '.$poidD) or die(mysql_error());

	mysql_query('INSERT INTO arbo2(nom, poidG, poidD) VALUES("'.$nom.'", '.($poidD).', '.($poidD+1).')') or die(mysql_error());
}

/*
addInArbo2(1, 'enfant');addInArbo2(1, 'enfant');addInArbo2(1, 'enfant');
addInArbo2(2, 'enfant');addInArbo2(2, 'enfant');addInArbo2(2, 'enfant');
addInArbo2(3, 'enfant');addInArbo2(3, 'enfant');addInArbo2(4, 'enfant');
*/

// suppression de l'element $id. (les sous menus prennent la place de l'element.)
function dellArbo2($id){
	$req=mysql_query('SELECT poidG, poidD FROM arbo2 WHERE id='.$id) or die(mysql_error());
	$poidG=mysql_fetch_assoc($req);
	if ($poidG===false) throw new Exception('id invalide');
	$poidD=$poidG['poidD'];
	$poidG=$poidG['poidG'];

	mysql_query('DELETE FROM arbo2 WHERE id='.$id) or die(mysql_error());

	mysql_query('UPDATE arbo2 SET poidD=poidD+1, poidG=poidG+1 WHERE poidD < '.$poidD.' AND poidG > '.$poidG) or die(mysql_error());
	mysql_query('UPDATE arbo2 SET poidG=poidG-2 WHERE poidG >= '.$poidG) or die(mysql_error());
	mysql_query('UPDATE arbo2 SET poidD=poidD-2 WHERE poidD >= '.$poidG) or die(mysql_error());
}

// suppression de l'element $id, et de tout les sous menu.
function delAllSub2($id){
	$req=mysql_query('SELECT poidG, poidD FROM arbo2 WHERE id='.$id) or die(mysql_error());
	$poidG=mysql_fetch_assoc($req);
	if ($poidG===false) throw new Exception('id invalide');
	$poidD=$poidG['poidD'];
	$poidG=$poidG['poidG'];

	mysql_query('DELETE FROM arbo2 WHERE poidD<='.$poidD.' AND poidG>='.$poidG) or die(mysql_error());

	mysql_query('UPDATE arbo2 SET poidG=poidG-'.($poidD-$poidG+1).' WHERE poidG >= '.$poidG) or die(mysql_error());
	mysql_query('UPDATE arbo2 SET poidD=poidD-'.($poidD-$poidG+1).' WHERE poidD >= '.$poidD) or die(mysql_error());

}

// affichage de l'arbo 2.
function affArbo2(){
	echo '<ul>';
	$r=mysql_query('SELECT id, nom, poidD, poidG FROM arbo2 ORDER BY poidG') or die(mysql_error());
	$l=0;
	$stack=array();
	while($data=mysql_fetch_assoc($r)){
		do {
			$top=array_top($stack);
			if ($top===null || $top>$data['poidG']+1){
				break;
			}else {
				echo '</ul>';
				array_pop($stack);
			}
		} while(true);
		echo '<li>'.$data['nom'].' : [ '.$data['poidG'].', '.$data['poidD'].'] ->'.$data['id'];
		if ($data['poidD']==$data['poidG']+1)
			echo '</li>';
		else{
			echo '<ul>';
			array_push($stack, $data['poidD']);
		}
	}
	echo '</ul>';
}


//dellArbo2(2);

//delAllSub2(2);

affArbo2();

?>

 Conclusion

pour tester, vous devrez de-commenter quelques lignes (les insertions, etc...)


 Sources du même auteur

Source avec une capture IMAGES GENETIQUES
Source avec Zip Source avec une capture RUBIX CUBE
Source avec Zip INTERPRETEUR BRAINFUCK
Source avec Zip PROXY HTTP : SAUVEZ VOS VIDEOS PREFEREES.
Source avec une capture ECRIRE UN TEXTE EN CERCLE SUR UNE IMAGE

 Sources de la même categorie

Source avec Zip CLASS PHP :: REQUÊTES MYSQL par devgoneti
Source avec Zip Source avec une capture CONVERTIR BASE FIREBIRD EN MYSQL par castelfrederic29
Source avec une capture SQL/EXE EXECUTEUR DE REQUETTES SQL par enokbyreal
Source avec Zip ESPACE MEMBRE BASIQUE par bonhommecrea
Source avec Zip Source avec une capture MODIFICATEUR DE DONNEES DANS UNE BASE SQL AVEC LISTING DES T... par cram121

 Sources en rapport avec celle ci

Source avec Zip CLASS PHP :: REQUÊTES MYSQL par devgoneti
Source avec Zip RECHERCHE DES DOUBLONS DANS UNE TABLE MYSQL EN SÉLECTIONNANT... par aladec2007
Source avec Zip LEVELPARSER par jonguignolo
Source avec Zip CLASSE QUI PERMET DE GENERER UN ARBRE par gagah1
Source avec Zip Source avec une capture LISTER DOSSIER AVEC UN ARBRE / TREE EN PHP / JAVASCRIPT par cyril6789

Commentaires et avis

Commentaire de LocalStone le 04/03/2008 10:43:05

J'ai pas le temps de lire le tutoriel de Developez.com complet maintenant donc je pose quand même ma question ...
Tu peux vite fait expliquer à quoi correspond la méthode non-naïve ?

Commentaire de codefalse le 04/03/2008 13:27:30 administrateur CS

C'est vrai que ca aurait été mieux en Poo ^^ :p

Par contre, malgré le pré-requis, une petite description rapide de l'utilité des fonctions serait la bienvenue, histoire qu'en quelques lignes on comprenne de quoi ca parle :)

Commentaire de coucou747 le 04/03/2008 18:41:01 administrateur CS


en une image, ca donne ca :

http://sqlpro.developpez.com/cours/arborescence/images/SQLtree2_1.gif

l'arbo 2 c'est ce schemat...

Commentaire de malalam le 04/03/2008 19:50:00 administrateur CS

Hello,

il faut aussi préciser que cette méthode, si elle permet d'afficher une arbo bien plus rapidement, ne convient absolument pas pour une arbo qui serait amenée à bouger. Ca doit être quasiment du statique.

Commentaire de coucou747 le 05/03/2008 15:22:21 administrateur CS

codefalse, si tu trouves une methode interessante pour modeliser ca en Objet, je serais curieux d'avoir un diagramme, parce-que moi, ce que j'arrive a faire devrait :
- s'integrer a part entiere dans :
   - la SPL
   - un framework
   - php6

ou

- ne servirait a rien tout seul

j'ai prefere expliquer les principes vaguement... en corrigant quelques requetes de developpez, et en postant un exemple.

Commentaire de codefalse le 05/03/2008 18:37:36 administrateur CS

Honnetenement ? non, je n'ai pas de solutions.
A vrai dire je ne comprends pas tres bien le principe d'arborescence et je n'ai malheureusement pas le temps de m'y mettre. Désolé :/

Commentaire de coucou747 le 05/03/2008 18:52:34 administrateur CS

... c'est juste un "type" arbre stoque en sql...

j'ai commence a faire un truc en OO, mais ca n'aurait pas ete le meme genre de source, celle ci doit-etre comprehensible par tous, simple et claire. l'autre, fait une classe Element, une classe Elements, une abstraction sql, une classe MyIterator, une class abstraite Arbo, deux classes Arbo, mais pour qu'elles soient generiques, faut des descriptions de types d'elements...

bref c'est pas simple...

Commentaire de codefalse le 05/03/2008 23:11:50 administrateur CS

Je veux bien te croire :)

Commentaire de stefane321 le 06/03/2008 04:52:36

Je choisie la méthode 1 pour naif qui me convient bien.

Mais je souhaite l'utiliser pour une liste déroulante.

J'ai donc modifier le html de la fonction pour ceci:

function affArbo1($id=0){

$r=mysql_query('SELECT id, nom FROM arbo1 WHERE id_parent='.$id) or die(mysql_error());
while($data=mysql_fetch_assoc($r)){
echo '<option>'.$data['nom'].'</option>';
affArbo1($data['id']);

}

}
echo '<select>';
affArbo1();
echo '</select>';

Sa marche sauf il n'y a pas de démarcation entre les parent et les enfants.

Pouvez-vous svp m'aider à obtenir un affichage du genre:

<select name="categories">
<option value="1">Fruit</option>
<option value="2">Fruit -> Sud-americain</option>
<option value="3">Fruit -> Sud-americain -> Orange</option>
<option value="4">Fruit -> Sud-americain -> Pamplemousse</option>
<option value="5">Fruit -> Nord-americain</option>
<option value="6">Fruit -> Nord-americain -> Pomme</option>
<option value="7">Fruit -> Nord-americain -> Bleuet sauvage</option>
<option value="8">Fruit -> Nord-americain -> Citrouille</option>
</select>

Merci!

Commentaire de coucou747 le 06/03/2008 13:47:45 administrateur CS

tu ne peux pas faire ca avec des options et select.

Commentaire de FhX le 06/03/2008 19:26:22

Pour faire un arbre de ce type, utilise XML :

<racine>
<element1>Nom</element1>
<element2>xxx...</element2>
<element3>
  <sselement31>...</sselement31>
  <sselement32>...</sselement32>
</element3>
</racine>

Si tu veux le sauvegarder, parse ton document XML pour le foutre en chaine et ou dans une base SQL par la suite.

Pour un arbre, XML y'a pas mieux !

Commentaire de malalam le 06/03/2008 19:30:45 administrateur CS

Hello,

"tu ne peux pas faire ca avec des options et select."
si, avec <optgroup />

Commentaire de coucou747 le 06/03/2008 19:39:59 administrateur CS

fhx, en sql, ca implique de parser ton xml...

Commentaire de codefalse le 06/03/2008 23:22:11 administrateur CS

ouah ! Fhx ! Ca faisait un moment :p

Bon je dirai que je suis d'accords pour le fait que le xml s'approche plus de la notion d'arborescence vu que C'EST de l'arborescence :p Apres Sql, ce sera de l'arbo abstraite, puisqu'il faudra construire son arbre en bien pensant sa requete !

Apres, c'est mon avis ! :p

Commentaire de coucou747 le 07/03/2008 02:49:30 administrateur CS

t'as parfaitement raison codefalse, mais tu traites plus facilement du sql que du xml... et avec moins de ressources... enfin, c'est pas du tout le meme genre de choses, genre imagine sur CS, t'as pas qu'un seul serveur, donc avoir du sql, c'est mieux que des fichiers...

fhx, l'idee de mettre ton xml en sql, ca veut dire que pour traiter ton xml, tu dois appeller mysql ou autre puis traiter ton xml avant de pouvoir faire tes modifs, puis remettre tout ca en mysql... c'est franchement lourd comme methode...

Commentaire de codefalse le 07/03/2008 09:34:27 administrateur CS

Coucou, je suis parfaitement d'accord avec toi pour dire que le xml serait plus gourmand en ressource que le sql, mais dire que c'est plus simple, à mon avis ca va dépendre de la structure de ta base.
En effet, le xml étant déjà structuré comme un arbre, sa compréhension est directe.

Mais apres c'est clair, ya pas photos, sur un site avec des serveurs décentralisés, le sql sera la meilleure méthode !

Commentaire de flashnet le 10/01/2009 14:00:24 8/10

Le script fonctionne super bien par contre au lieu de faire des listes avec <ul> et <li> serait-il possible de faire des sauts de ligne et des espaces entre les cat?gories (dans le but de mettre des images ? la place) ?

Exemple :
Cat1
  ss Cat1
    sss cat
Cat2 etc...

Je ne vois pas la solution... Merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

comment passer des requetes mysql à une date/heure predefinie [ par attonnnn ] salut bon voila je suis en train de creer un jeu en php dans lequel la plupart des requetes mysql devront etre passer 12h ou bien 24h apres que la per question fermeture windows et mise a jour mysql [ par pioupioupioupiou ] tout d'abord mon probleme et de mettre une variable de mon tableau contenue dans ma base mysql a jour losque je quitte internet explorer soit en cliqu Requetes MySQL en SQL? [ par spyro666 ] Bonjour, je travaille en ce moment sur un projet de gestion d'erreurs que je développe avec MySQL, seulement le système ou il va tourner plus tard n'a arbre généalogique-collapse tree [ par rami3b ] bonjourexiste-t-il un équivalent libre de yfiles ajax -http://www.yworks.com/en/products_yfilesajax_about.htmlje veut afficher une arbre c arbre généalogique-collapse tree [ par rami3b ] bonjourexiste-t-il un équivalent libre de yfiles ajax -http://www.yworks.com/en/products_yfilesajax_about.htmlje veut afficher une arbre c requetes multitables liées par clés etrangeres en mysql [ par tricour ] Bonjour, je suis en train de mettre en ligne une base de données clients avec 11 tables en Mysql.J'ai des contraintes pour certaines tables. 1 client Aide sur les requetes [ par bruce207 ] Bonjour,je debute avec php et mysql et j'ai des problemes au niveau de la syntaxe de l'utilisation des variables php dans les requetes d'insertion, de arborescence [ par aamsa ] J'aimerais savoir comment on peut créer des lies pour le référencement dans les pages web comme par exemple celle de www.phpcs.com(Accueil > Forum > P requetes temporelle sur base mysql [ par tekbright717 ] bonjour a tous! j'ai un probl&#232;me que je n'arrive pas a r&#233;soudre : je voudrais faire que par un formulaire on puisse modifier les valeurs d Optimisation de requetes [ par Tilix ] Salut, Je voudrais optimiser mes requetes, mais j'ai besoin de votre aide. 1ere, j'ai un forum, et sur celui ci, je voudrais y affiché les information


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,654 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales