[PHP/MySQL] Besoin d'un coup de pouce pour optimiser un petit script

Besoin d'un coup de pouce pour optimiser un petit script [PHP/MySQL] - PHP - Programmation

Marsh Posté le 15-12-2002 à 23:35:30    

J'utilise un bout de script qui fonctionne bien, mais qui me semble beaucoup trop lourd par rapport au résultat qu'il donne. Vu que je ne suis pas un pro du maniement de tableaux, si quelqu'un veut bien me filer un coup de pouce pour optimiser ca ce sera avec plaisir :)
 
Alors, je commence par récupérer une liste de produits (catégorie mère + nom) et à la stocker dans un tableau, qui sera utilisé plus loin. Le tableau est réalisé ainsi :
 

Code :
  1. $requete = mysql_query("SELECT cat_produit, nom_produit FROM produits", $db);
  2. $nbproduits = mysql_num_rows($requete);
  3. if($nb_nbproduits ) {
  4.     do {
  5.         $liste_produits[] = array($myrow[0] => $myrow[1]);
  6.     } while($myrow = mysql_fetch_row($requete));
  7. }


 
Un peu plus loin donc, je décompose ce tableau. Ca se fait à l'intérieur d'une boucle qui liste plusieurs infos en provenance d'une autre table. Parmi ces infos on retouve la catégorie mère ($donnees[$i][0]), et lorsqu'elle coincide avec la catégorie des produits récupérés plus haut je fais un simple echo du nom du produit :
 

Code :
  1. while(list($null, $produit) = each($liste_produits)) {
  2.     while(list($cat_produit, $nom_produit) = each($produit)) {
  3.         if($cat_produit == $donnees[$i][0]) {
  4.         echo $nom_produit;
  5.         }
  6.     }
  7. }


 
Ce bout de script n'est pas catastrophique prit de manière isolée, mais quand il s'exécute à l'identique autant de fois qu'il y a de lignes $i dans ma deuxième boucle, c'est pas génial. Je suis un adepte de la bidouille, mais quand elle ne se fait pas au détriment des performances. Une idée pour améliorer ca ?
 
PS : je précise que j'ai déjà testé une fonction qui me permet de me passer de la première partie du script, en sélectionnant dans la seconde uniquement les enregistrements qui m'intéressent (SELECT nom_produit FROM produits WHERE cat_produit = $donnees[$i][0]). Il n'y a pas redondance d'infos et ca économise une boucle*$i, par contre c'est plus couteux niveau MySQL et ca se voit en temps processeur (chiffres à l'appui). Je préfère donc faire une seule requête MySQL en laissant PHP se démerder pour traiter ca derrière, plutôt que d'avoir plusieurs petites requetes (d'autant plus que MySQL est installé sur un serveur distant au perfs aléatoires).


Message édité par Core 666 le 15-12-2002 à 23:46:41
Reply

Marsh Posté le 15-12-2002 à 23:35:30   

Reply

Marsh Posté le 16-12-2002 à 00:24:54    

tu veux lister  
 
catégorie1
 -produit1  
 -produit2
...
catégorie2
 -produit1  
 -produit2
...
 
c'est ça ?


---------------
...oups kernel error...
Reply

Marsh Posté le 16-12-2002 à 07:24:50    

C'est ca oui :)
 
Enfin, je ne sais pas quelle est l'idée que tu as derrière la tête et ca si change quelque chose, mais ca correspond un peu plus à :
 
catégorie1  
-produit1  
-produit2  
...  
catégorie2  
-produit3  
-produit4
 
:)

Reply

Marsh Posté le 16-12-2002 à 12:04:48    

mais à quoi te sert le donnee[$i][0] ???
tes tables sont bien comme ceci ?
table categories : cat_id, cat_nom
  avec cat_prod en primary key, autoincrement
table produits : prod_id, cat_id, prod_nom  
  avec prod_id en primary key, autoincrement
       cat_id en index
 
si tu veux faire ce que tu dis, ceci suffit :

Code :
  1. $result = mysql_query("SELECT cat_nom, prod_nom FROM categories C, produits P where C.cat_id=P.cat_id", $db);
  2. $prev= '';
  3. while ($row= mysql_fetch_array($result) ){
  4.   if ( $row['cat_nom']!= $prev ){
  5.     echo $row['cat_nom'].'<br>';
  6.   }
  7.   echo '->' . $row['prod_nom'].'<br>';
  8.   $prev= $row['cat_nom'];
  9. }


 
maintenant il faut voir si tu veux afficher toute les categories et tout les produits sur une page, ou juste les produits d'une catégorie définie par l'utilisateur (passée en paramètre lors de l'appel à la page.
ex index.php?categorie=2:
categorie1
categorie2
  produit1
  produit2
categorie3
...
dans ce cas, tu rajoutes un if après le if ($row['cat_nom']!=$prev)


Message édité par ethernal le 16-12-2002 à 12:24:47

---------------
...oups kernel error...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed