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

Eléphant du PHP | 82 Messages

09 nov. 2011, 12:28

J'arrive parfaitement à me situer, a afficher le fil d'ariane et le menu et aussi à afficher les travaux du domaine sélectionné avec les requête montrées plus haut...

Comment dois-je procéder maintenant pour afficher tout les travaux inférieur. C'est a dire les travaux des domaines qui ont le domaine sélectionné comme parent et ainsi de suite jusqu’à arrivé à la fin de l'arbre ?

Merci

ViPHP
ViPHP | 2291 Messages

09 nov. 2011, 13:22

Ok je regarde
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphant du PHP | 82 Messages

09 nov. 2011, 14:53

Merci beaucoup de te pencher sur mon problème :)

J'espère que l'on trouvera une solution :)

Texicitys

Eléphant du PHP | 82 Messages

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

Eléphant du PHP | 82 Messages

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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 ^^


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 82 Messages

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!!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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é ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 82 Messages

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?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 82 Messages

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 nov. 2011, 21:02

De rien ;)
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 82 Messages

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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 ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 82 Messages

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.