Script avec des variables variables.

Fermé
yann123 - 29 mai 2008 à 18:21
GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 - 29 mai 2008 à 22:27
Bonjour,

Je réalise un script en php afin d'aller chercher dans ma base de données les catégories mere de mon site, ensuite il va chercher les sous catégorie, puis les sous catégories de deuxième niveau.

Voici mon premier script qui fonctionne mais qui a deux inconvénient:
- je répète trois fois la même chose (grosso-modo)
- le script s'arrête au deuxième sous-niveau et s'il y en a 15, je dois écrire 15 fois la même chose.

// J'afiche toutes les catégories.				
$req_cat_mere1 = mysql_query("SELECT * FROM categories_annuaire WHERE id_categorie_mere='0' order by nom_categorie") or die(mysql_error());  // Requête SQL							
				
   echo '<ul>';				
   while($categorie_mere1 = mysql_fetch_array($req_cat_mere1))
     {
	$id_categorie_mere1 = $categorie_mere1 ['id'];
	 echo '<li>' .$categorie_mere1 ['nom_categorie']. '</li>';
				  
		// J'afiche toutes les sous-catégories				
		$req_cat_mere2 = mysql_query("SELECT * FROM categories_annuaire WHERE id_categorie_mere='$id_categorie_mere1' order by nom_categorie") or die(mysql_error());  // Requête SQL								
						
		echo '<ul>';				
		while($categorie_mere2 = mysql_fetch_array($req_cat_mere2))
		 {
	        	  $id_categorie_mere2 = $categorie_mere2 ['id'];
			  echo '<li>' .$categorie_mere2 ['nom_categorie']. '</li>';
						  
		                // J'afiche toutes les sous-catégories de niveau-2				
				$req_cat_mere3 = mysql_query("SELECT * FROM categories_annuaire WHERE id_categorie_mere='$id_categorie_mere2' order by nom_categorie") or die(mysql_error());  // Requête SQL								
								
				echo '<ul>';				
				while($categorie_mere3 = mysql_fetch_array($req_cat_mere3))
				 {
					  $id_categorie_mere3 = $categorie_mere3 ['id'];
					  echo '<li>' .$categorie_mere3 ['nom_categorie']. '</li>';
				 }	
								 			 
				echo '</ul>';
		 }				 
		echo '</ul>';
 }				 
echo '</ul>';								  
?>


Comme je l'ai dis si dessus mon code ce répète trois fois pour le niveau1, le niveau2 et le niveau3 et s'il y a plus de 3 niveau ce ne marchera plus ou du moins cela s'arrêtera au troisième niveau.

J'ai donc essayé de réalisé ce même script avec des variables variables, puisqu'il n'y a que les niveau qui change dans le code ci-dessus, mais je ne parviens pas à mes fin.

Voici le code qui ne marche pas. (ça tourne en boucle j'ai l'impression)


$niveau = 0; // J'nitialise le niveau de la categorie				
$id_categorie_mere = 0; //J'initialise ma variable id_categorie_mere
$nb_sous_categories != 1  // Pour lancer la premiere bouble. 				
				
while($nb_sous_categories != 0)
   {								
	// J'afiche toutes les catégories.				
	$req_cat_mere{$niveau} = mysql_query("SELECT nom_categorie, id, id_categorie_mere FROM categories_annuaire WHERE id_categorie_mere='$id_categorie_mere' order by nom_categorie") or die(mysql_error());  // Requête SQL
					
	// Je compte le nombre de resultat.
	$compter = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM categories_annuaire WHERE id_categorie_mere = '$id_categorie_mere' ") or die(mysql_error()); 

	$nb_sous_categories = array_pop(mysql_fetch_row($compter));
					
	if ($nb_sous_categories != 0)
	   {					
		echo '<ul>';									
		while($categorie_mere{$niveau} = mysql_fetch_array($req_cat_mere{$niveau}))
		 {
		  $id_categorie_mere = $categorie_mere{$niveau} ['id'];
		  echo '<li>' .$categorie_mere{$niveau} ['nom_categorie']. '</li>';
		 }							
		$niveau = $niveau + 1;
	    }
 }			  
				  
 $nb_ul = 0;
 while($nb_ul != $niveau) // Je ferme autant de liste a puce que j'en ai ouvert
     {								
       echo '</ul>';
     }


Quelqu'un peut-il m'aider à débugger mon script

Merci d'avance.
A voir également:

1 réponse

GallyNet Messages postés 434 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 15 décembre 2008 387
29 mai 2008 à 22:27
Je serai toi, je passerai tout simplement par une fonction récursive. Elle est ce qu'il a de mieux pour ton problème. Elle ne fait qu'afficher les informations d'un niveau, et elle se rappelle pour chacun de ces sous-niveaux.
Voici la fonction tel que je l'aurais fait (enfin pas vraiment, car je l'aurais pas commenté en temps normal).
/* Fonction qui retourne la chaine de caractère à afficher pour un niveau donné
* (et tout ses sous-niveaux).
* */
function afficheCategorie($id_mere = 0){
  /* Chaine à retourner */
  $result = '';
  /* Exécution de la requête */
  $req_cat_mere = mysql_query("SELECT * FROM categories_annuaire WHERE id_categorie_mere='$id_mere' order by nom_categorie") or die(mysql_error());
  /* On boucle sur chacun des résultat. Si aucun résultat, on ne fait rien. */
  while($categorie_mere = mysql_fetch_array($req_cat_mere)){
    /* Ajout du nom dela catégorie */
    $result .= '<li>' .$categorie_mere ['nom_categorie']. '</li>';
    /* Afficahge des sous-niveaux du niveau actuel */
    $result .= '<ul>';
    $result .=afficheCategorie($categorie_mere['id']);
    $result .= '</ul>';
  }
  /* On retourne la chaine résultat */
  return $result;
}

echo afficheCategorie();
0