Page 1 sur 2
transformer les données d'une BDD en array ()
Posté : 03 déc. 2006, 18:49
par DaD
Salut à tous,
Je début en php et j'essais de me faire un menu qui se dévelloppe avec une class que j'ai trouvé sur le net. il s'agit de multiXpandMenu.
J'ai une base de données avec mes catégories et qui a cette forme :
cat_id, cat_nom, cat_id_parent, cat_url, cat_level
Les catégories n'ayant pas de parent ont un cat_parent_id = 1
Pour créer dynamiquement mon menu, il faut que j'arrive à mettre les catégories sous forme de array ayant cette forme :
Code : Tout sélectionner
$items = array (
"node1" => "http://www.node1.com",
"node2" => array(
"node21" => "http://www.node21.com",
"node22" => "http://www.node22.com",
"node23" => array (
"node231" => "http://www.node231.com",
"node232" => "http://www.node232.com",
)
),
"node3" => "http://www.node3.com",
);
J'ai passé la journée entière dessus, mais je n'y arrive pas...
Est ce que vous pourriez m'aider svp?
Merci d'avance
+
DaD
Posté : 03 déc. 2006, 20:03
par winni
La derniére virgule n'est pas nécéssire.
Posté : 03 déc. 2006, 20:08
par DaD
Merci de ta réponse.
J'ai du mal m'exprimer. le code ci dessus n'est pas le mien, mais celui que je dois obtenir à partir de ma base.
pour etre plus précis voilà ce que je dois avoir :
Code : Tout sélectionner
$items = array (
"cat_nom1" => "URL1",
"cat_nom2" => array(
"sous cat_nom 21" => "URL21",
"nsous cat_nom 22" => "URL22",
"sous cat_nom 23" => array (
"sous, sous cat_nom 2231" => "URL231",
"sous, sous cat_nom232" => "URL232",
)
),
"cat_nom3" => "URL3", etc.....
);
J'epère avoir été plus clair

Posté : 03 déc. 2006, 20:23
par DocType
Bon...
Alors, pour commencer il faut savoir ce que tu veux !
Tu souhaites donc sortir les données sous ce type:
Code : Tout sélectionner
Menu 1
Sous menu 1
Sous menu 2
Sous sous menu 1
Sous sous menu 2
Sous sous menu 3
Sous menu 3
Menu2
Si c'est bien cela, il te faut dans ta base, le nom, l'url et l'id de chaque entrée. Pour être plus performant ensuite, il faut faire un "explode" de ton menu. Si par exemple l'entrée x se trouve en Menu 4>Sous menu 10, il faut mettre 4;10 en bdd.
Une autre solution consiste à faire deux tables, voira plus selon le nombre d'imbriquations

Posté : 03 déc. 2006, 20:26
par winni
Ah ui j'ai compris

Il est vrai que ton probléme n'est pas si simple que cela au premier coup d'oeil. Cependant, je te conseille de faire de la maniére suivant.
Code : Tout sélectionner
SELECT * FROM TABLE WHERE cat_level=0
while(mysql_fecth_array(...){
$id=cat_id;
SELECT * FROM TABLE WHERE cat_level=1 and cat_parent='$id'
while(mysql_fecth_array(...){
$id=cat_id;
SELECT * FROM TABLE WHERE cat_level=2 and cat_parent='$id'
while(mysql_fecth_array(...){
}
}
}
Voila
En gros tu fais une première requete ou tu prend tout les level 0.
"cat_nom1", "cat_nom2".
Pour chaque résultat, tu choisis tout les élément de level 1 et dont le parent est l'id du level 0.
"cat_nom1" => "sous cat_nom 21"
Posté : 03 déc. 2006, 20:29
par DocType
Code parfaitement otimisé
winni, ça te fait combien de requêtes pour 4 menu, 16 sous menus ?
pense à fermer tes parenthèses
De plus, vu le gestion generalisée de $id, ça ne fonctionnera pas comme souhaité

Posté : 03 déc. 2006, 20:33
par winni
Code parfaitement otimisé
winni, ça te fait combien de requêtes pour 4 menu, 16 sous menus ?
pense à fermer tes parenthèses
De plus, vu le gestion generalisée de $id, ça ne fonctionnera pas comme souhaité

J'ai essayé de résoudre son probléme suivant sa table, maintenant il est vrai qu'il est possible de faire beaucoup mieux. Et il peux utiliser ID1, ID2 maintenant ce n'est en aucun cas la meilleure méthode mais la première qui m'est venu a l'esprit en réponse à sa demande.
Posté : 03 déc. 2006, 20:46
par DocType
Code parfaitement otimisé
winni, ça te fait combien de requêtes pour 4 menu, 16 sous menus ?
pense à fermer tes parenthèses
De plus, vu le gestion generalisée de $id, ça ne fonctionnera pas comme souhaité

J'ai essayé de résoudre son probléme suivant sa table, maintenant il est vrai qu'il est possible de faire beaucoup mieux. Et il peux utiliser ID1, ID2 maintenant ce n'est en aucun cas la meilleure méthode mais la première qui m'est venu a l'esprit en réponse à sa demande.
Ouep, mais même pour toi pour ta gouverne : ne fais jamais de script comme ça ou alors juste pour faire un update entre deux bases, un truc unique quoi. Cette méthode est plus ou moins correcte, mais très très gourmande et ne peut être developpée pour un site en production
La solution pour substituer cela serait d'enregistrer la résultat de la requête dans une variable et toujours taffer sur cette dernière

Posté : 03 déc. 2006, 20:50
par winni
Code parfaitement otimisé
winni, ça te fait combien de requêtes pour 4 menu, 16 sous menus ?
pense à fermer tes parenthèses
De plus, vu le gestion generalisée de $id, ça ne fonctionnera pas comme souhaité

J'ai essayé de résoudre son probléme suivant sa table, maintenant il est vrai qu'il est possible de faire beaucoup mieux. Et il peux utiliser ID1, ID2 maintenant ce n'est en aucun cas la meilleure méthode mais la première qui m'est venu a l'esprit en réponse à sa demande.
Ouep, mais même pour toi pour ta gouverne : ne fais jamais de script comme ça ou alors juste pour faire un update entre deux bases, un truc unique quoi. Cette méthode est plus ou moins correcte, mais très très gourmande et ne peut être developpée pour un site en production
La solution pour substituer cela serait d'enregistrer la résultat de la requête dans une variable et toujours taffer sur cette dernière

Mettre en cache tu veux faire ?
Posté : 03 déc. 2006, 21:02
par DocType
Mettre en cache tu veux faire ?
Non, tout simplement faire une requête généraliste "SELECT * FROM tatable" et l'enregistrer dans une variable via mysql_fetch_array()
Une fois cela fait, il suffit de ce balader dans ce nouveau tableau avec le pointeur. Ca te met en "cache" la requête, c'est pas vraiment du cache, mais ca economise des nombreuses ressources

Posté : 03 déc. 2006, 21:14
par DaD
Merci à vous 2 pour vos réponses...
LHDN92 pour le coup de mettre dans la base 4;10 pour menu 4 sous menu 10 c'est vrai que ça a l'air mieux, mais dans ce cas c'est la création de ma BDD qui va me prendre un temp fou...y'a plus d'un millier de cat et sous cat confondues...
Pour l'instant j'ai réussit à faire un menu à 2 niveau avec ce code :
Code : Tout sélectionner
////connection à la BDD
$connexion = Connexion (NOM, PASSE, BASE, SERVEUR);
/// lancement de la requête pour récupérer les catégories avec id parent à 0
$resultat = mysql_query ("SELECT * FROM categorie WHERE cat_level='1'", $connexion);
if (!$resultat)
{
die('Requête invalide : ' . mysql_error());
}
while ($items = mysql_fetch_assoc($resultat) )
{
////Si c'est une catégorie de niveau 1, alors on la créer comme parent
if ($items['cat_level'] == 1)
{
$myMenu->addParent($items['cat_nom']);
$cat_id=$items['cat_id'];
///on va chercher ses enfants pour les créer aussi
$resultat2 = mysql_query (" SELECT * FROM categorie WHERE cat_id_parent=$cat_id ", $connexion);
if (!$resultat2)
{
die('Requête invalide : ' . mysql_error());
}
/////tant qu'il reste des enregistrement qui ont l'id_parent qu'on reche, on les crées
while ($itemchild = mysql_fetch_assoc($resultat2) )
{
///on créer ses enfants
$myMenu->addChild($itemchild['cat_nom'],$itemchild['cat_url']);
}
}
}
ça va être gourmand en ressources?
parceque comme je débute, j'ai vraiment du mal à me balader dans les tab que je créer avec mes requetes...c tendu...
Posté : 03 déc. 2006, 21:25
par DocType
si tu as plus d'un milliers de categories, c'est mort...
imagine toi avec environ 60 requêtes sur ta page, si tu as une dizaine de visiteur et que t'es en mutualisé, ça va gueuler chez ton hébegeur.
Ca va te prendre du temps mais selon moi faut reprendre ta base...si tu n'as que categories et sous categories (2 niveaux), je te conseille deux tables liées

Posté : 03 déc. 2006, 21:31
par DaD
Ok, je vois...
Je peux peut etre faire ça sous excel et updater ma base....putain, j'en ai pour des heures
Mais si je fais 2 bases, j'aurais autant de requete, pourquoi ça serait moins lourd?
Posté : 03 déc. 2006, 21:37
par DocType
Ok, je vois...
Je peux peut etre faire ça sous excel et updater ma base....putain, j'en ai pour des heures
Mais si je fais 2 bases, j'aurais autant de requete, pourquoi ça serait moins lourd?
car tu listes d'abord les deux tables une seule et unique fois. Tu vas les mettres an array(), et faudra ensuite juste recouper les résultats:
on liste le array de level 1(table principale)
pour chaque item du level 1, on liste le tablo de level 2 et on ajoute les données seulement si on correspond avec le bon item.
Posté : 03 déc. 2006, 21:59
par DaD
Bien, je vais m'y coller....
Merci beaucoups pour ces conseils précieux..
+
DaD