2010-05-20 11 views
1

i enregistrer le nombre de requêtes de mon site Web et dans la page le script ci-dessous s'exécute, 40 requêtes supplémentaires ajoutées à la page.comment modifier une boucle de requête while sql dans une boucle de tableau

comment puis-je modifier cette connexion SQL dans un propper et la lumière d'une

function tree_set($index) 
    { 
     //global $menu; Remove this. 
     $q=mysql_query("select id,name,parent from cats where parent='$index'"); 
     if(mysql_num_rows($q) === 0) 
     { 
      return; 
     } 

     // User $tree instead of the $menu global as this way there shouldn't be any data duplication 
     $tree = $index > 0 ? '<ul>' : ''; // If we are on index 0 then we don't need the enclosing ul 
     while($arr=mysql_fetch_assoc($q)) 
     { 
      $subFileCount=mysql_query("select id,name,parent from cats where parent='{$arr['id']}'"); 
      if(mysql_num_rows($subFileCount) > 0) 
      { 
       $class = 'folder'; 
      } 
      else 
      { 
       $class = 'file'; 
      } 

      $tree .= '<li>'; 
      $tree .= '<span class="'.$class.'">'.$arr['name'].'</span>'; 
      $tree .=tree_set("".$arr['id'].""); 
      $tree .= '</li>'."\n"; 
     } 
     $tree .= $index > 0 ? '</ul>' : ''; // If we are on index 0 then we don't need the enclosing ul 

     return $tree; 
    } 

//variable $menu must be defined before the function call 
$menu = '....<ul id="browser" class="filetree">'."\n"; 
$menu .= tree_set(0); 
$menu .= '</ul>'; 

echo $menu; 

i entendu, cela peut être fait en changeant dans un tableau, mais je ne sais pas comment faire

merci à l'avance

Répondre

2

Essayez ce (code non testé):

function tree_set($index) 
{ 
    //global $menu; Remove this. 
    $q=mysql_query("select id,name,parent from cats where parent='$index'"); 
    if(mysql_num_rows($q) === 0) 
     return; 

    $cats = array(); 
    $cat_ids = array(); 

    while($arr=mysql_fetch_assoc($q)) 
    { 
     $id = intval($arr['id']); 
     $cats[$id] = $arr; 
    } 

    $subFilesCountQuery="select parent,count(*) as subFileCount from cats where parent=". 
        join(" OR parent=",array_keys($cats))." GROUP BY parent"; 

    $subFileCountResult=mysql_query($subFilesCountQuery); 

    while($arr=mysql_fetch_assoc($subFileCountResult)) 
    { 
     $id = intval($arr['parent']); 
     $cats[$id]['subFileCount'] = $arr['subFileCount']; 
    } 

    // If we are on index 0 then we don't need the enclosing ul 
    $tree = $index > 0 ? '<ul>' : ''; 
    foreach($cats as $id => $cat) 
    { 
     if($cat['subFileCount'] > 0) 
      $class = 'folder'; 
     else 
      $class = 'file'; 

     $tree .= '<li>'; 
     $tree .= '<span class="'.$class.'">'.$arr['name'].'</span>'; 
     $tree .=tree_set("".$arr['id'].""); 
     $tree .= '</li>'."\n"; 
    } 
    $tree .= $index > 0 ? '</ul>' : ''; 

Ce que je fais est de deux requêtes: une à récupère toutes les catégories (votre première requête d'origine) suivie d'une seconde requête pour récupérer tous les comptages de sous-catégorie en un seul coup. Je stocke également toutes les catégories dans un tableau que vous pouvez parcourir, plutôt que d'afficher comme vous récupérez de la base de données.

+0

Merci l'homme, mais après l'exécution de votre code, appache arrêter de travailler en raison de débordement de requêtes –

+0

@Mac: Désolé, j'ai eu un bug, s'il vous plaît [voir les changements que j'ai fait] (http://stackoverflow.com/posts/2877867/ révisions) et faites-moi savoir si cela corrige l'erreur. – Josh

+0

@Mac: OH. Silly, je viens de réaliser que ton algorithme est récursif. Ma réponse est complètement fausse ... S'il vous plaît reconnaissez que vous avez vu ce commentaire, parce que je veux supprimer cette réponse. – Josh

0

Il peut être fait en copiant vos données sur dans un tableau, puis en utilisant cette copie: iE

while($arr=mysql_fetch_assoc($q)) 
    { 
     $results[] = $arr; 
    } 

plus tard, vous faites alors tout ce que vous voulez sur $ résultats

Le principal problème avec votre code est que vous mélangez votre logique d'affichage tout avec votre requête SQL.

+0

Je ne comprends pas, pourriez-vous mettre à jour votre réponse avec un code plus complet?! après avoir défini $ result [] que dois-je faire?! –

-1

Sélectionnez l'arbre entier dans une seule requête, par exemple "select id, name, parent from cats". Itérer sur le résultat, construire ensemble en PHP qui représentera votre arbre, puis dessinez tableau en utilisant HTML en tant que source

Questions connexes