Accueil > > > UNE ARBORESCENCE.
UNE ARBORESCENCE.
Information sur la source
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
Sources de la même categorie
Commentaires et avis
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ème que je n'arrive pas a ré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
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
CHAMPS TIMECHAMPS TIME par vargas
Cliquez pour lire la suite par vargas
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|