Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/04/2011, 20h18   #1
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Par défaut Une fonction récursive et deux tables SQL

Bonjour à tous,

Soit deux tables, pour une FAQ avec catégories :

- La table cat_faq - classique :
Citation:
id - nom - id_pere
1 - Navigation 0
2 - Commandes 0
3 - Dans les produits - 1
4 - Dans les articles - 1
5 - Express - 2
Dans cet exemple, on voit donc qu'il y a 2 mères, dont une a 2 filles et l'autre 1.

La table Q/R :
Citation:
id - id_cat - Q - R
Qui comprend donc les questions et les réponses, attachées aux catégories.

J'arrive bien à afficher l'arbre des cat / sous cat avec une fonction récursive, pas de problème.
Mais ce que je voudrais c'est pouvoir "fouiller" la descendance d'une cat donnée pour vérifier qu'aucune sous-cat ne contient de Q/R, et dans ce cas, pouvoir supprimer son arbre complet.
Mais je ne trouve pas le type la requête qui va bien...

Auriez-vous une piste ?
Merci d'avance.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 06h34   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Regarde
http://sqlpro.developpez.com/cours/arborescence/
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 08h51   #3
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Bonjour, et merci, mais oui, je connais et j'utilise l'arborescence intervallaire. Mais ici dans ce cas ce n'est pas possible car je veux donner le moyen à l'utilisateur de la FAQ de ranger les cats dans l'ordre qu'il souhaite...et déplacer un arbre entier en intervallaire...bonjour !

Donc là je reste sur du classique récursif
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 09h27   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Je ne comprends pas ... comment est défini ton ordre actuellement ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 09h47   #5
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Ben, j'ai ajouté une colonne "ordre" à la table des cats et quand j'affiche, je fais "ORDER BY ordre".
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 09h53   #6
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Par rapport à ma question, voici ma fonction récursive pour lire les catégories :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
function arbo_cats_general($parent, $niveau, $array){ // récurs
global $wwwroot;
$html = "";
$niveau_precedent = 0;
 
if (!$niveau && !$niveau_precedent) {
	$html .= "\n<ul >\n";
}
 
 
foreach ($array AS $noeud) {
	if ($parent == $noeud['id_pere']) 
	{
 
		if ($niveau_precedent < $niveau) {
			$html .= "\n<ul >\n";
 
		}
 
		$html .= "<li><a ".$styleLi." href='?mode=edite_cat&id=".$noeud['id']."'>" . $noeud['nom'] . "</a>" ;
 
		$niveau_precedent = $niveau;
 
		$html .= arbo_cats_general($noeud['id'], ($niveau + 1), $array);
 
	}
 
}
 
if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) {
	$html .= "</ul>\n</li>\n";
 
}
else if ($niveau_precedent == $niveau) {
	$html .= "</ul>\n";
 
}else {
 
	$html .= "</li>\n";
 
}
return $html;
}
//et le array des cats s'obtient par :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
function cree_tab_cat(){
$sql = mysql_query("SELECT id, nom, etat, id_pere, poids FROM jld_faq_cat ORDER BY poids");
 
while($row = mysql_fetch_assoc($sql)){
	$tab_cat[] = array(
				 'id'=>$row['id'],
				 'nom'=>stripslashes($row['nom']),
				 'etat'=>$row['etat'],
				 'id_pere'=>$row['id_pere'],
				 'poids'=>$row['poids']);
}
return $tab_cat;
}
Mais dans cet arbre, je ne trouve pas comment interroger la table des Q/R par rapport à un arbre complet de catégorie : si une cat mère ou au moins une de ses filles a une Q/R enregistrée, on ne peut pas la supprimer, sinon, si.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 09h57   #7
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Et tu ne pourrais pas avoir la même chose avec une structure intervallaire ?

De toute façon, traiter des requêtes récursivement en PHP c'est indigeste pour la base de données.
Je ne pense pas qu'on puisse le traiter en SQL pur mais tu peux toujours demander aux spécialistes de SQL.
Remarque selon ta base de données, tu peux peut etre avoir une suppression en cascade d'une table sur elle même.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 10h09   #8
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
J'étais parti sur de l'intervallaire...mais comme je l'ai dit, modifier l'ordre d'affichage des catégories d'un même niveau (ou des sous cat au sein d'une catégorie) est quasi impossible. J'ai lu l'article de F.Brouard dans tous les sens, notamment : http://blog.developpez.com/sqlpro/p7...dure-de-depla/

C'est au-dessus de mes moyens intellectuels.

Je suis bien conscient que le récursif est dangereux pour le serveur, mais dans ce cas précis, la FAQ ne comptera pas un arbre gigantesque donc ça devrait passer.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 12h55   #9
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Dans ton cas il ne s'agit pas de déplacer l'arbre mais juste de modifier la valeur de son champ "ordre".
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h22.


 
 
 
 
Partenaires

Hébergement Web