[SQL] Menu à plusieurs niveaux, afficher les non vides

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [SQL] Menu à plusieurs niveaux, afficher les non vides

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par Texicitys » 22 nov. 2011, 16:31

up :)

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par Texicitys » 16 nov. 2011, 14:30

Merci pour ta réponse.

Pour ce qui est de ta deuxième proposition, je vois comment faire. Cependant, pour ensuite afficher le travail dans ma page de recherche par domaine, ça devient impossible non?

Dans le tableau qui est sur cette page: http://www.collaide.com/travaux/p1-list ... aines.html , j'affiche le domaine du travail... Je ne vois pas trop comment faire si les travaux commence a avoir plusieurs domaines. Et je pense que ça sera encore moins bien organisé si un travail se situait 3 fois dans science naturel (une fois pour bio, une foi pour chimie et une fois pour math, par exemple)..

Sinon, ce que je pourrais faire, c'est que dans la table lien, je rajoute un champs dom_princ et si cette valeur vaux 1, c'est que le domaine en question est le domaine principal du travail et c'est donc lui qui est pris en compte dans mes pages de recherche de travaux par domaine?

Les domaines secondaires seront utile dans la page information du travail (pour voir tous les domaines que le travail touche) et dans un futur module de recherche..

Comme ça je ne casse pas tout le boulot deja fourni et je garde le "1 domaine par travail".

Par contre, pour modifier ma requete et y instauré le domaine principal, je ne vois pas comment faire. Je ne peux pas faire une simple liaison, car il y a une 3eme table qui rentre en compte.

Comment est-ce que je pourrais par exemple modifier cette requête?
// Récupérer tous les travaux     
    			$page_works = $bdd->prepare('SELECT work_id, work_name, work_desc, doc_format, work_type, work_acces, work_rs, dom_name, dom_id FROM tab_works 
				INNER JOIN domains
				ON work_domain = dom_id WHERE work_acces=0 AND work_status = 1 AND work_statusM = 1 AND work_domain = dom_id AND dom_gauche >= :dom_gauche
   AND dom_droite <= :dom_droite ORDER BY work_id DESC LIMIT :premier, :nombre'); 
   				$page_works->bindValue(':dom_gauche', $dom_gauche, PDO::PARAM_INT);
				$page_works->bindValue(':dom_droite', $dom_droite, PDO::PARAM_INT);
				$page_works->bindValue(':premier', $premierMessageAafficher, PDO::PARAM_INT);
				$page_works->bindValue(':nombre', $nombreDeMessagesParPage, PDO::PARAM_INT);
				$page_works->execute();
Merci beaucoup

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par moogli » 16 nov. 2011, 06:20

La y a pas solution miracle je pense, soit tu fait un produit cartésien de ce que tu as avec la table domaine (donc n fois les meme infos par domaine, c'est dire que tu répète les infos d'un "works" autant de fois que tu a de domaine sur ce "works")
Soit dans le traitement tu envoi une requête par "works" pour récupérer les domaines associés.

Je ne sais pas quel est le plus performant, dans le cas du tout en un il faut réalisée une césure sur le nom du "works".
Dans le second tu peux utiliser une requête préparée (voir utiliser une "vrai" requête préparée) histoire d'être un peux plus performant sachan que seul le paramètre du documents change, la jointure est simple sur une seule table.

@+

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par Texicitys » 16 nov. 2011, 02:31

Merci pour ta réponse.

Oui, je maitrise les jointures standards, mais là, ce n'est pas le cas.

Car dans ma requête ou je vais recevoir le work_name, work_desc, etc... Je dois demandé plusieurs domaines... Je ne vois pas comment procéder.

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par moogli » 15 nov. 2011, 22:52

Salut,

Pour répondre à ta question j'ai lu cette après midi que la philosophie d'un po te d'oracle est : rien n'est impossible, l'impossible c'est juste un peu plus long ;)


Pour en revenir à tes moutons, la meilleur solution est celle avec trois tables au finale (relation 0-n 1-n).
Tu va donc avoir une table pour faire la liaison ente domains et works !

Après côté requête tu a l'air de maîtriser les jointures ;)


@+

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par Texicitys » 15 nov. 2011, 21:44

Aie aie aie, je galère encore!

J'aimerais accepter plusieurs domaines pour un seul travail. J'ai pensez à deux solutions: mettre l'id de tous les domaines du travail dans le champs work_domain en les séparant par une vigule (ex: 3,30,20) et ensuite faire un explode pour afficher tout les domaines. ou créer une nouvelle table works_domains qui contient work_id et dom_id pour faire la liaison.

Quel est la meilleur des deux solutions?

Et comment modifier mes requête ensuite?

Voici la requête pour afficher un travail:
$work = $bdd->prepare('SELECT work_id, work_status, work_statusM, work_name, work_desc, work_hits, work_autor, work_autors, work_domain, work_type, work_degre, work_eta, work_rs, doc_name, doc_name_serv, doc_format, doc_size, work_stars, work_dateR, DATE_FORMAT(work_date, \'Le %d/%m/%Y à %Hh%i\') AS work_date, DATE_FORMAT(work_date_edit, \'Le %d/%m/%Y à %Hh%i\') AS work_date_edit, work_acces, membres.mem_pseudo, membres.mem_ID, membres.mem_mail, etablissement.eta_id, etablissement.eta_name, reseaux.rs_id, reseaux.rs_name 
	FROM tab_works 
	LEFT JOIN membres ON work_autor = mem_id
	LEFT JOIN etablissement ON work_eta = eta_id 
	LEFT JOIN reseaux ON work_rs = rs_id 
	WHERE work_id = ?');
Mais le plus dur sera au niveau de la recherche par domaine. J'aimerais qu'un travail qui a pour domaine la biologie et la chimie, soit accessible dans les deux catégories..


Voici par exemple la requête pour afficher la liste des travaux dans le domaine sélectionné et ceux du dessous:
// Verifier que le domaine existe
			$query = $bdd->prepare('SELECT dom_name, dom_id, dom_gauche, dom_droite, dom_level FROM domains WHERE dom_id = ?');
			$query->execute(array((int) $_GET['value']));
			if ($data=$query->fetch())
			{
				$dom_exist=TRUE;
				
				$dom_name=stripslashes(htmlspecialchars($data['dom_name']));
				$dom_id=(int)$data['dom_id'];
				$dom_gauche=(int)$data['dom_gauche'];
				$dom_droite=(int)$data['dom_droite'];
				$dom_level=(int)$data['dom_level'];
				
				// Pour les requetes de récupération de travaux CF sur le fil d'ariane.
				// Compter le nombre total de travaux
  				$total_works = $bdd->prepare('SELECT COUNT(*) AS nbworks FROM tab_works 
				INNER JOIN domains
				ON work_domain = dom_id
				WHERE work_status = 1 AND work_statusM = 1 AND dom_gauche >= :dom_gauche
   AND dom_droite <= :dom_droite');
  				$total_works->bindValue(':dom_gauche', $dom_gauche, PDO::PARAM_INT);
				$total_works->bindValue(':dom_droite', $dom_droite, PDO::PARAM_INT);
				$total_works->execute();
  				$total_works_row = $total_works->fetch();
  				$total=$total_works_row['nbworks'];
		
    			$totalDesMessages = $total + 1;
				$nombreDeMessagesParPage = 20;
				$nombreDePages = ceil($total / $nombreDeMessagesParPage);

				//Nombre de pages
				$page = (isset($_GET['page']))?intval($_GET['page']):1;

				$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
	
	
  				// Récupérer tous les travaux     
    			$page_works = $bdd->prepare('SELECT work_id, work_name, work_desc, doc_format, work_type, work_acces, dom_name, dom_id FROM tab_works 
				INNER JOIN domains
				ON work_domain = dom_id WHERE work_status = 1 AND work_statusM = 1 AND work_domain = dom_id AND dom_gauche >= :dom_gauche
   AND dom_droite <= :dom_droite ORDER BY work_id DESC LIMIT :premier, :nombre'); 
   				$page_works->bindValue(':dom_gauche', $dom_gauche, PDO::PARAM_INT);
				$page_works->bindValue(':dom_droite', $dom_droite, PDO::PARAM_INT);
				$page_works->bindValue(':premier', $premierMessageAafficher, PDO::PARAM_INT);
				$page_works->bindValue(':nombre', $nombreDeMessagesParPage, PDO::PARAM_INT);
				$page_works->execute();
			}
			else
			{
				$dom_name='Domaine inéxistant';
			}
			$query->closeCursor();
Est-ce que ce que je veux faire est possible? Si oui comment faire?

Merci

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par moogli » 15 nov. 2011, 21:02

De rien ;)
@+

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par Texicitys » 15 nov. 2011, 19:21

Merci beaucoup pour tes réponses!

J'ai décidé de ne pas rendre cliquable les domaines vides et de les griser pour plus de clarté : http://www.collaide.com/travaux/p1-list ... aines.html (F5)..

Merci énormément.

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par moogli » 15 nov. 2011, 14:31

Je vais encore essayer d'afficher l'arbre au complet. Me conseillez vous de faire que les liens contenant aucun travaux ne soit pas cliquable?
ça c'est un choix, cosmétique et fonctionnel.

cosmétique, la pour le coup ça ne se commente pas ;)

fonctionnel : cela dépend de la façon dont tu peuple la base. Tu peux, par exemple garder le lien et afficher, rien dans ce domaine + un bouton / lien pour ajouter du contenu). si tel n'est pas le cas tu peux très ne pas mettre de lien effectivement

@+

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par Texicitys » 15 nov. 2011, 13:16

Cette sous requête fonctionne parfaitement, j'ai juste du l'ajouter dans mes requêtes :
$query = $bdd->query('SELECT dom_name, dom_id, dom_level, (SELECT COUNT(*) FROM tab_works 
				INNER JOIN domains 
				ON work_domain = dom_id
				WHERE work_status = 1 AND work_statusM = 1 AND dom_gauche >= d.dom_gauche
   AND dom_droite <= d.dom_droite) nbworks FROM domains AS d WHERE dom_level = 0');
Voici le résultat!

http://www.collaide.com/travaux/p1-list ... aines.html

Je vais encore essayer d'afficher l'arbre au complet. Me conseillez vous de faire que les liens contenant aucun travaux ne soit pas cliquable?

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par moogli » 15 nov. 2011, 13:06

j'aime bien le nom de ta fonction : mrpropre() au moins le nom est clair ;)


j'ai pris le code qu'il y avait :/ mais oui à priori la représentation intervallaire est plus efficace sur ce type de chose (surtout si tu a une profondeur importante dans l'arbre).
Pour ce qui est d'afficher entre parenthèse, je ne veux pas afficher le nombre de sous domaine, mais bien le nombre de travaux qui sont contenu dans le sous domaine et le domaine en question.
tu au ne table qui contient les travaux correspondants à un domaine ?

si oui le principe reste le même
SELECT dom_id, dom_name,( SELECT count(*) FROM travaux WHERE dom_id=d.dom_id) as nbtravaux FROM domains AS d
En supposant que tu ai une table travaux qui contienne la clef primaire du domaine concerné ;)


@+

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par Texicitys » 15 nov. 2011, 12:53

Merci à toi pour toutes tes précisions et ton aide.


Je ne veux plus réutilisé mes requête car de 1: elle sont très moche, et de 2: elle utilise encore les champs dom_parent. Hors, j'ai tout modifié ma base de donnée en utilisant la technique pas intervalle. Donc quand j'aurais tout correctement codé, j'aimerais ne plus utilisé le champs dom_parent.. Je ne savais pas qu'on pouvait faire une sous requête. Je vais essayer (sur celle que tu me proposes, tu utilises justement mon ancienne base de donnée (qui contient dom_parent, j'espère pouvoir la supprimer et n'utiliser que la façon intervallaire).

Désolé de changer tout le temps. Mais il est vrai que j'ai tellement galéré, quand j'ai fini par me rendre compte qu'il serait plus simple d'utilisé la façon intervallaire. Meme si cela m'a pris beaucoup de temps à la recréer.

Mes requête sont maintenant plus propre. Voici comment j'affiche le fils d’Ariane:
// cherecher les domaines parents + le domain actuel
			$query = $bdd->prepare('SELECT dom_name, dom_id, dom_level 
    FROM domains
    WHERE dom_gauche <= :dom_gauche 
        AND dom_droite >= :dom_droite
    ORDER BY dom_level');
			$query->bindValue(':dom_gauche', $dom_gauche, PDO::PARAM_INT);
			$query->bindValue(':dom_droite', $dom_droite, PDO::PARAM_INT);
			$query->execute();
			
				echo '<div id="ariane"><a href="'.htmlspecialchars($ip_serv).'">Collaide</a> > <a href="p1-liste-des-travaux.html">Liste des travaux</a>';
				while ($data = $query->fetch())
				{
					$url_dom_name2=mrpropre(stripslashes(htmlspecialchars($data['dom_name'])));
					echo ' > <a href="p1-liste-des-travaux-1-'.$data['dom_id'].'-'.$url_dom_name2.'.html">'.stripslashes(htmlspecialchars($data['dom_name'])).'</a>';
				}
				echo '</div>';
				$query->closeCursor();
Et voici les requête pour mon menu de gauche:
echo '<div class="menu_gauche">
    	<h5>Menu</h5>';
		$lvl=0;
		echo '<ul>';
		
		switch ($dom_level)
		{
			case 0:
			$query = $bdd->query('SELECT dom_name, dom_id, dom_level FROM domains WHERE dom_level = 0');
			
			while($data=$query->fetch())
			{
				if ($data['dom_id']!=$dom_id)
				{
					$url_dom_name2=mrpropre(stripslashes(htmlspecialchars($data['dom_name'])));
					echo '<li class="lvl_'.stripslashes(htmlspecialchars($data['dom_level'])).' fleche"><strong><a class="noir" href="p1-liste-des-travaux-1-'.$data['dom_id'].'-'.$url_dom_name2.'.html">'.stripslashes(htmlspecialchars($data['dom_name'])).'</a></strong></li>';
				}
				else
				{
					echo '<li class="lvl_'.$dom_level.' fleche_bas"><strong>'.stripslashes(htmlspecialchars($data['dom_name'])).'</strong></li>';
					$level_fils=(int) $dom_level+1;

					$query2 = $bdd->prepare('SELECT dom_id, dom_name FROM domains WHERE dom_level = :dom_level AND dom_gauche >= :dom_gauche
   AND dom_droite <= :dom_droite');
   					$query2->bindValue(':dom_level', $level_fils, PDO::PARAM_INT);
					$query2->bindValue(':dom_gauche', $dom_gauche, PDO::PARAM_INT);
					$query2->bindValue(':dom_droite', $dom_droite, PDO::PARAM_INT);
					$query2->execute();
					while ($data = $query2->fetch()) // afficher les parents
					{
						echo '<li class="lvl_'.$level_fils.' fleche"><a href="p1-liste-des-travaux-1-'.$data['dom_id'].'-'.$url_dom_name2.'.html">'.stripslashes(htmlspecialchars($data['dom_name'])).'</a></li>';
					}
					$query2->closeCursor();
				}
			}
			$query->closeCursor();
			break;
			default:
			$query = $bdd->prepare('SELECT dom_name, dom_id, dom_level, dom_gauche, dom_droite  
    FROM domains
    WHERE dom_gauche < :dom_gauche 
        AND dom_droite > :dom_droite
    ORDER BY dom_level');
			$query->bindValue(':dom_gauche', $dom_gauche, PDO::PARAM_INT);
			$query->bindValue(':dom_droite', $dom_droite, PDO::PARAM_INT);
			$query->execute();
			
			while($data=$query->fetch())
			{
					$url_dom_name2=mrpropre(stripslashes(htmlspecialchars($data['dom_name'])));
					echo '<li class="lvl_'.stripslashes(htmlspecialchars($data['dom_level'])).' fleche"><strong><a class="noir" href="p1-liste-des-travaux-1-'.$data['dom_id'].'-'.$url_dom_name2.'.html">'.stripslashes(htmlspecialchars($data['dom_name'])).'</a></strong></li>';
					$parent_gauche=(int)stripslashes(htmlspecialchars($data['dom_gauche']));
					$parent_droite=(int)stripslashes(htmlspecialchars($data['dom_droite']));
			}
			$query->closeCursor();
			
			$query = $bdd->prepare('SELECT dom_name, dom_id, dom_level FROM domains WHERE dom_gauche > :parent_gauche
   AND dom_droite < :parent_droite
   AND dom_level = :level');
   			$query->bindValue(':level', $dom_level, PDO::PARAM_INT);
			$query->bindValue(':parent_gauche', $parent_gauche, PDO::PARAM_INT);
			$query->bindValue(':parent_droite', $parent_droite, PDO::PARAM_INT);
			$query->execute();
			
			while($data=$query->fetch())
			{
				if ($data['dom_id']!=$dom_id)
				{
					$url_dom_name2=mrpropre(stripslashes(htmlspecialchars($data['dom_name'])));
					echo '<li class="lvl_'.stripslashes(htmlspecialchars($data['dom_level'])).' fleche"><a href="p1-liste-des-travaux-1-'.$data['dom_id'].'-'.$url_dom_name2.'.html">'.stripslashes(htmlspecialchars($data['dom_name'])).'</a></li>';
				}
				else
				{
					echo '<li class="lvl_'.stripslashes(htmlspecialchars($data['dom_level'])).' fleche_bas">'.stripslashes(htmlspecialchars($data['dom_name'])).'</li>';
					
					$level_fils=(int) $dom_level+1;
					$query2 = $bdd->prepare('SELECT dom_id, dom_name FROM domains WHERE dom_level = :dom_level AND dom_gauche >= :dom_gauche
   AND dom_droite <= :dom_droite');
   					$query2->bindValue(':dom_level', $level_fils, PDO::PARAM_INT);
					$query2->bindValue(':dom_gauche', $dom_gauche, PDO::PARAM_INT);
					$query2->bindValue(':dom_droite', $dom_droite, PDO::PARAM_INT);
					$query2->execute();
					while ($data = $query2->fetch()) // afficher les parents
					{
						echo '<li class="lvl_'.$level_fils.' fleche"><a href="p1-liste-des-travaux-1-'.$data['dom_id'].'-'.$url_dom_name2.'.html">'.stripslashes(htmlspecialchars($data['dom_name'])).'</a></li>';
					}
					$query2->closeCursor();
				}
			}
			$query->closeCursor();
			break;
		}
		

		
		echo '</ul>';
		
		
		echo '</div>'; // Fin menu 
Pour ce qui est d'afficher entre parenthèse, je ne veux pas afficher le nombre de sous domaine, mais bien le nombre de travaux qui sont contenu dans le sous domaine et le domaine en question.

Mais je vais essayer avec cette sous requête, je ne connaissais pas l'astuce!

Merci encore à toi pour toutes tes aides précieuse que tu m'a fournies!!

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par moogli » 15 nov. 2011, 12:14

Comment puis-je maintenant afficher entre parenthèse le nombre de travaux que contient chaque catégorie ?
une sous requête qui prend en paramètre l'id du père c'est relativement simple
SELECT dom_id, dom_name,( select count(*) from domains where dom_parent=d.dom_id) nbchild FROM domains as d
avec le jeux de donnée que tu a fournis
dom_id dom_name nbchild
1 Langues 7
2 Sciences humaines 8
3 Sciences naturelles 8
4 Autres documents 2
67 Macroéconomie 0
7 Arts 4
8 Droit 2
9 Histoire 8
10 Economie 10
11 Géographie 0
12 Politique 0
13 Phylosophie 0
14 Sports 4
15 Biologie 0
16 Chimie 0
17 Physique 0
18 Electronique 0
19 Informatique 3
20 Mathématique 2
21 Médecine 0
22 Curiculum Vitae (CV) 0
23 Lettres de motivation 0
24 Français 0
25 Allemand 0
26 Anglais 0
27 Italien 0
28 Espagnole 0
29 Grec 0
30 Latin 0
31 Musique 0
pour ce qui est de la première demande un truc dans le style
select e.dom_id, e.dom_parent, e.dom_ordre, e.dom_name, 
        parent.dom_id as parentid, parent.dom_name as parentName
    from domains e
    join domains parent on e.dom_parent= parent.dom_id
    order by parentid
coté php
<?php
try {
    $pdo = new PDO('mysql:host=localhost;dbname=test;', 'root');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = 'select e.dom_id, e.dom_parent, e.dom_ordre, e.dom_name, 
        parent.dom_id as parentid, parent.dom_name as parentName
    from domains e
    join domains parent on e.dom_parent= parent.dom_id
    order by parentid';
    //dom_id 	dom_parent 	dom_ordre 	dom_name 	parentid 	pranteName
    $result = $pdo->query($sql);
    $result->setFetchMode(PDO::FETCH_OBJ);
    //echo '<ul>';
    $parent = null;
    while ( ($data = $result->fetch())!== false){
        if ($data->parentid != $parent) {
            if ($parent !== null ) echo '</ul></li>
                '."\r\n";
            $parent = $data->parentid;
            //echo '<ul>'."\r\n";
            echo '<li class="parent">'.utf8_encode($data->parentName)."\r\n";
            echo '<ul>'."\r\n";
        }
        else {
            echo '</li>';
        }
        echo '<li class="enfant">'.utf8_encode($data->dom_name);
    }
    echo '</ul>'."\r\n";
    $result->closeCursor();
}
catch (Exception $e){
echo '
 <div class="notification error">
 '.$e->getCode().'<br />
     '.$e->getMessage().'
         '.$e->getTraceAsString().'
 </div>
 ';
}
?>
te donne
<ul><li class="parent">Langues
<ul>
<li class="enfant">Italien</li><li class="enfant">Allemand</li><li class="enfant">Latin</li><li class="enfant">Espagnole</li><li class="enfant">Anglais</li><li class="enfant">Français</li><li class="enfant">Grec</ul></li>
                
<li class="parent">Sciences humaines
<ul>
<li class="enfant">Géographie</li><li class="enfant">Histoire</li><li class="enfant">Arts</li><li class="enfant">Sports</li><li class="enfant">Politique</li><li class="enfant">Economie</li><li class="enfant">Droit</li><li class="enfant">Phylosophie</ul></li>
                
<li class="parent">Sciences naturelles
<ul>
<li class="enfant">Electronique</li><li class="enfant">Mecanique</li><li class="enfant">Chimie</li><li class="enfant">Médecine</li><li class="enfant">Informatique</li><li class="enfant">Physique</li><li class="enfant">Biologie</li><li class="enfant">Mathématique</ul></li>
                
<li class="parent">Autres documents
<ul>
<li class="enfant">Lettres de motivation</li><li class="enfant">Curiculum Vitae (CV)</ul></li>
                
<li class="parent">Arts
<ul>
<li class="enfant">Photographie</li><li class="enfant">Dessin</li><li class="enfant">Vidéo</li><li class="enfant">Musique</ul></li>
                
<li class="parent">Droit
<ul>
<li class="enfant">Droit privé suisse</li><li class="enfant">Droit public suisse</ul></li>
                
<li class="parent">Histoire
<ul>
<li class="enfant">La Renaissance</li><li class="enfant">Préhistoire</li><li class="enfant">Le XXe Siècle</li><li class="enfant">Les Révolutions au XVIIe et XVIIIe siècle</li><li class="enfant">Epoque Médiévale</li><li class="enfant">Epoque antique</li><li class="enfant">Epoque contemporaine</li><li class="enfant">Le XIXe Siècle</ul></li>
                
<li class="parent">Economie
<ul>
<li class="enfant">Management</li><li class="enfant">Statistiques</li><li class="enfant">Commerce</li><li class="enfant">Mathématiques</li><li class="enfant">Gestion d'entreprise</li><li class="enfant">Comptabilité</li><li class="enfant">Microéconomie</li><li class="enfant">Gestion</li><li class="enfant">Macroéconomie</li><li class="enfant">Finance</ul></li>
                
<li class="parent">Sports
<ul>
<li class="enfant">Pédagogie</li><li class="enfant">Santé</li><li class="enfant">Performence</li><li class="enfant">Sciences</ul></li>
                
<li class="parent">Informatique
<ul>
<li class="enfant">Système d'exploitation</li><li class="enfant">Graphisme</li><li class="enfant">Programmation</ul></li>
                
<li class="parent">Mathématique
<ul>
<li class="enfant">Algèbre</li><li class="enfant">Analyse</ul></li>
                
<li class="parent">Commerce
<ul>
<li class="enfant">Etude de marcher</li><li class="enfant">International</ul></li>
                
<li class="parent">Gestion
<ul>
<li class="enfant">Contrôle de gestion</li><li class="enfant">Finance</li><li class="enfant">Comptabilité</ul></li>
                
<li class="parent">Programmation
<ul>
<li class="enfant">Java</li><li class="enfant">C</li><li class="enfant">PHP/MYSQL</li><li class="enfant">C++</li><li class="enfant">Javascript</li><li class="enfant">HTML/CSS</ul></li>
                
<li class="parent">Système d'exploitation
<ul>
<li class="enfant">Linux</li><li class="enfant">Unix</li><li class="enfant">Windows</li><li class="enfant">Mac</ul></li>
                
<li class="parent">Graphisme
<ul>
<li class="enfant">Photoshop</ul></li>
                
<li class="parent">Préhistoire
<ul>
<li class="enfant">Paléolithique</li><li class="enfant">Néolithique</ul></li>
                
<li class="parent">Epoque Médiévale
<ul>
<li class="enfant">Le Haut Moyen-Age</li><li class="enfant">Le Bas Moyen-Age</ul></li>
                
<li class="parent">Epoque antique
<ul>
<li class="enfant">L'Egypte antique</li><li class="enfant">La Grèce antique</li><li class="enfant">La Rome antique</li></ul>
        </li>
        </ul>
bon reste a faire l'affichage.

ceci tu montre déjà une page où tu a déjà fait la chose c'est assez étonnant de ne pas le ré employer ^^


@+

Re: [SQL] Menu à plusieurs niveaux, afficher les non vides

par Texicitys » 15 nov. 2011, 04:25

http://www.collaide.com/travaux/p1-list ... ngues.html

Voici ma page que j'ai faite. Comment puis-je maintenant afficher entre parenthèse le nombre de travaux que contient chaque catégorie ? Comme ça je peux rendre cliquable uniquement les liens qui contiennent des travaux..

Et je cherche toujours un moyen d'afficher l'intégralité de mes domaines de la meme manière qu'ici: http://www.collaide.com/travaux/liste-des-domaines.html

Merci à vous!

Tex

par Texicitys » 14 nov. 2011, 18:44

Merci énormément à dunbar pour son aide en privé..

Cependant, c'était vraiment trop compliqué avec ma base de donnée...

Je l'ai donc modifié et ajouté le tri de façon intervallaire:
--
-- Structure de la table `domains`
--

CREATE TABLE IF NOT EXISTS `domains` (
  `dom_id` int(11) NOT NULL AUTO_INCREMENT,
  `dom_parent` int(11) NOT NULL,
  `dom_gauche` int(11) NOT NULL,
  `dom_droite` int(11) NOT NULL,
  `dom_ordre` int(11) NOT NULL,
  `dom_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `dom_comment` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `dom_level` int(11) NOT NULL,
  PRIMARY KEY (`dom_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=141 ;

--
-- Contenu de la table `domains`
--

INSERT INTO `domains` (`dom_id`, `dom_parent`, `dom_gauche`, `dom_droite`, `dom_ordre`, `dom_name`, `dom_comment`, `dom_level`) VALUES
(1, -1, 1, 16, 0, 'Langues', '', 0),
(2, -1, 17, 169, 0, 'Sciences humaines', '', 0),
(3, -1, 170, 208, 0, 'Sciences naturelles', '', 0),
(4, -1, 219, 224, 0, 'Autres documents', '', 0),
(67, 10, 122, 123, 0, 'Macroéconomie', '', 2),
(7, 2, 18, 27, 0, 'Arts', '', 1),
(8, 2, 28, 76, 0, 'Droit', '', 1),
(9, 2, 77, 120, 0, 'Histoire', '', 1),
(10, 2, 121, 152, 0, 'Economie', '', 1),
(11, 2, 153, 154, 0, 'Géographie', '', 1),
(12, 2, 155, 156, 0, 'Politique', '', 1),
(13, 2, 157, 158, 0, 'Phylosophie', '', 1),
(14, 2, 159, 168, 0, 'Sports', '', 1),
(15, 3, 171, 172, 0, 'Biologie', '', 1),
(16, 3, 173, 174, 0, 'Chimie', '', 1),
(17, 3, 175, 176, 0, 'Physique', '', 1),
(18, 3, 177, 178, 0, 'Electronique', '', 1),
(19, 3, 179, 208, 0, 'Informatique', '', 1),
(20, 3, 209, 214, 0, 'Mathématique', '', 1),
(21, 3, 215, 216, 0, 'Médecine', '', 1),
(22, 4, 220, 221, 0, 'Curiculum Vitae (CV)', '', 1),
(23, 4, 222, 223, 0, 'Lettres de motivation', '', 1),
(24, 1, 2, 3, 0, 'Français', '', 1),
(25, 1, 4, 5, 0, 'Allemand', '', 1),
(26, 1, 6, 7, 0, 'Anglais', '', 1),
(27, 1, 8, 9, 0, 'Italien', '', 1),
(28, 1, 10, 11, 0, 'Espagnole', '', 1),
(29, 1, 12, 13, 0, 'Grec', '', 1),
(30, 1, 14, 15, 0, 'Latin', '', 1),
(31, 7, 19, 20, 0, 'Musique', '', 2),
(32, 7, 21, 22, 0, 'Dessin', '', 2),
(33, 7, 23, 24, 0, 'Vidéo', '', 2),
(35, 7, 25, 26, 0, 'Photographie', '', 2),
(104, 8, 29, 36, 0, 'Droit privé suisse', '', 2),
(103, 8, 37, 44, 0, 'Droit public suisse', '', 2),
(41, 10, 124, 129, 0, 'Commerce', '', 2),
(42, 10, 130, 137, 0, 'Gestion', '', 2),
(43, 14, 160, 161, 0, 'Pédagogie', '', 2),
(44, 14, 162, 163, 0, 'Performence', '', 2),
(45, 3, 217, 218, 0, 'Mecanique', '', 2),
(46, 19, 180, 193, 0, 'Programmation', '', 2),
(47, 19, 194, 203, 0, 'Système d''exploitation', '', 2),
(48, 19, 204, 207, 0, 'Graphisme', '', 2),
(49, 20, 210, 211, 0, 'Analyse', '', 2),
(50, 20, 212, 213, 0, 'Algèbre', '', 2),
(51, 41, 125, 126, 0, 'International', '', 3),
(52, 41, 127, 128, 0, 'Etude de marcher', '', 3),
(53, 42, 131, 132, 0, 'Comptabilité', '', 3),
(54, 42, 133, 134, 0, 'Contrôle de gestion', '', 3),
(55, 42, 135, 136, 0, 'Finance', '', 3),
(56, 46, 181, 182, 0, 'HTML/CSS', '', 3),
(57, 46, 183, 184, 0, 'PHP/MYSQL', '', 3),
(58, 46, 185, 186, 0, 'Javascript', '', 3),
(59, 46, 187, 188, 0, 'C', '', 3),
(60, 46, 189, 190, 0, 'C++', '', 3),
(61, 46, 191, 192, 0, 'Java', '', 3),
(62, 47, 195, 196, 0, 'Windows', '', 3),
(63, 47, 197, 198, 0, 'Linux', '', 3),
(64, 47, 199, 200, 0, 'Unix', '', 3),
(65, 47, 201, 202, 0, 'Mac', '', 3),
(66, 48, 205, 206, 0, 'Photoshop', '', 3),
(68, 10, 138, 139, 0, 'Microéconomie', '', 2),
(69, 10, 140, 141, 0, 'Statistiques', '', 2),
(70, 10, 142, 143, 0, 'Comptabilité', '', 2),
(71, 10, 144, 145, 0, 'Management', '', 2),
(72, 10, 146, 147, 0, 'Gestion d''entreprise', '', 2),
(73, 10, 148, 149, 0, 'Finance', '', 2),
(74, 10, 150, 151, 0, 'Mathématiques', '', 2),
(90, 79, 79, 80, 10, 'Néolithique', '', 3),
(77, 14, 164, 165, 0, 'Santé', '', 3),
(78, 14, 166, 167, 0, 'Sciences', '', 3),
(79, 9, 78, 83, 10, 'Préhistoire', '', 2),
(80, 9, 84, 89, 20, 'Epoque Médiévale', '', 2),
(81, 9, 90, 91, 30, 'La Renaissance', '', 2),
(82, 9, 92, 99, 40, 'Les Révolutions au XVIIe et XVIIIe siècle', '', 2),
(83, 9, 100, 101, 50, 'Le XIXe Siècle', '', 2),
(84, 9, 102, 109, 60, 'Le XXe Siècle', '', 2),
(85, 9, 110, 111, 70, 'Epoque contemporaine', '', 2),
(89, 79, 81, 82, 20, 'Paléolithique', '', 3),
(91, 9, 112, 119, 80, 'Epoque antique', '', 2),
(92, 91, 113, 114, 0, 'L''Egypte antique', '', 3),
(93, 91, 115, 116, 0, 'La Grèce antique', '', 3),
(94, 91, 117, 118, 0, 'La Rome antique', '', 3),
(95, 80, 85, 86, 0, 'Le Haut Moyen-Age', '', 3),
(96, 80, 87, 88, 0, 'Le Bas Moyen-Age', '', 3);
Voilà.. Maintenant, comment je dois procéder pour afficher tout mon arbre de la même façon que les sommaires de wiki: http://fr.wikipedia.org/wiki/Wiki ?

Et pour afficher touts les travaux qui se site sur et en dessous du domaine sélectionné?

Merci