Performance de ma table

Performance de ma table - PHP - Programmation

Marsh Posté le 04-05-2018 à 17:40:24    

Bonjour, tout le monde,  
J’ai une table dénommée ‘’produits ‘’ dans laquelle j’enregistre tous les produits commercialisés par une boutique et qui comporte 02 colonnes :
 
id prdt
1 riz
2 farine de blé
3 tomate concentrée
4 semoule
5 huile
6 biscuit
 
et une autre table dénommée ‘’journal’ ’qui comporte 5 colonnes, chaque ligne contient les éléments d’un journal de stock de produits comme suit :  
 
journal
 
id produit               entree   sortie
1 riz                        2500            0
2 farine de blé        3000            0
3 tomate concentrée    1000            0
4 farine de blé         500            0
5 semoule             2000            0
6 riz                            4000            0
7 huile                          500            0
8 riz                            0         1000
9 semoule               450             0
10 tomate concentrée 4000             0
11 biscuits               1200             0
 
 Je voudrais parcourir la table ‘’journal’’ à l’aide de chaque produit qui se trouve dans la table ‘’produit’’, sélectionner l’ensemble des opérations qui  concernent le produit en question dans la table ‘’journal’’ et ensuite classer les résultats obtenus dans des tableaux d’affichages pour chaque type de produits comme suit :
 
Tableau affichage riz
produit                 entrée         sortie
riz                          2500            0
riz                         4000              0
riz                             0                 1000
 
Tableau farine de blé
produit                entrée        sortie
Farine de blé         3000                   0
Farine de blé          500                   0
 
Etc…
Pour parvenir à cet objectif jai essayé de lire la table avec une boucle ‘’while’’ a l’intérieur de laquelle j’introduis une requête ‘’select ‘’ afin de pouvoir y collecter les données qui devront figurer dans mes petits tableaux  d’affichage. J’ai  effectué cette technique elle marche mais ma table journal ne comporte qu’un petit nombre de lignes pour le moment. Maintenant je  voudrais savoir lorsque que la table ‘’journal’’ comportera dans l’avenir plusieurs lignes (des centaines ou des milliers) est ce que cette méthode sera efficace, est ce qu’elle ne va pas ralentir l’exécution de mon code car j’ai appris dans plusieurs documentations que, introduire une requête dans une boucle while n’est pas conseillé.  
Si la méthode que j’ai adoptée présente des risques de performance au fur et a mesure que les enregistrements de ma table augmentent dans le moyen et le long terme, quelle méthode alternative qui me mettrait à l’abris d’ennuis futurs me conseillez-vous .
Voici mon code :

Code :
  1. <html>
  2. <head>
  3.         <meta charset="utf-8" />
  4.         <link rel="stylesheet" href="" />
  5.     </head>
  6. <body>
  7. <?php
  8.          //connection a la base de données
  9.     try
  10.          {
  11.          $bdd = new PDO('mysql:host=localhost;dbname=comptes','root','',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
  12.          }
  13.     catch(Exception $e)
  14.          {
  15.           die('Erreur : '.$e->getMessage());
  16.          }
  17.  
  18.          // Compter le nombre d'enregistrements contenus dans la table produits
  19.         $req = $bdd->prepare('SELECT * FROM produits'); 
  20.                   $req->execute();
  21.                   echo $req->rowCount() . ' resultat(s)'.'<br />';
  22.         $nbrlignes = $req->rowCount();
  23.                   echo $nbrlignes.'<br />';
  24.  //inialisation de la premiere ligne de la table produit  
  25.            $ligneproduit = 1;
  26.     
  27.     //creation de la boucle chargée d'effectuer toutes les operations
  28.           while ( $ligneproduit <=$nbrlignes )
  29.                         {
  30.                                  //Selection du produit dans la table "produits"  
  31.                
  32.         $req = $bdd->prepare('SELECT * FROM produits WHERE id= :id');
  33.                           $req-> execute(array(
  34.                           'id'=> $ligneproduit,
  35.                                  ));
  36.                          while ($donnees = $req->fetch())
  37.                  {
  38.                                   $produit =$donnees['prdt'];
  39.               }
  40.                 //Recherche dans la table ''journal'', l'ensemble des produits ayants comme nom $produit
  41.              
  42.         $req = $bdd->prepare('SELECT * FROM journal WHERE designation= :designation');
  43.                           $req-> execute(array(
  44.                           'designation'=> $produit,
  45.                                  ));
  46.              
  47.                  // Creation du tableau d'affichage
  48.                                 echo$produit . '<br>';// titre du tableau
  49.        echo "<table border=\"\">";
  50.                                          //entête du tableau  
  51.                                          echo "<tr>";
  52.                                          echo "<th WIDTH=100 HEIGHT= 40>Entrée</th>";
  53.                                          echo "<th WIDTH=100 HEIGHT= 40>Sortie</th>";
  54.                                          echo "</tr>";
  55.                                          //fin de l'entête  
  56.    
  57.                                    
  58.      while ($donnees = $req->fetch())
  59.                  {
  60.                                
  61.          $entree =$donnees['entree'];
  62.          $sortie =$donnees['sortie'];
  63.            
  64.          
  65.                                          echo "<tr ALIGN=center>";
  66.                                      
  67.                                          echo "<td WIDTH=100 HEIGHT= 40>".$entree."</td>";
  68.                                          echo "<td WIDTH= 100 HEIGHT= 40>".$sortie."</td>";
  69.                                          echo '</tr>';
  70.         }
  71.                                  echo "</table>";
  72.        echo ' </br ><br >';
  73.                
  74.                
  75.         $ligneproduit = $ligneproduit +1;
  76.                          }
  77.                          $req->closeCursor();
  78.         echo 'le nombre de ligne est égale a : '.'<br />';
  79.  echo $ligneproduit. '<br/>';
  80. ?>
  81. </body>
  82. </html>


 
 
 

Reply

Marsh Posté le 04-05-2018 à 17:40:24   

Reply

Marsh Posté le 04-05-2018 à 23:33:55    

Bonjour,
 
Je ne suis pas certain de ce que tu veux faire mais je te laisse jeter un coup d'oeil à la commande ORDER BY en espérant que ça réponde à ton besoin.
Sinon pour effectuer des calculs tu peux aussi utiliser la commande GROUP BY.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 05-05-2018 à 06:10:07    

Déjà, que ce soit le libellé du produit en clé étrangère de ta table journal est une mauvaise chose. Il faudrait que ce soit l'id du produit.
Ensuite tu peux tout faire avec une requête avec une jointure et un order by et dans la boucle de résultat, constituer tes tableaux (suffit d utiliser une variable qui va servir à comparer le produit courant du précédent)

Reply

Sujets relatifs:

Leave a Replay

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