IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Comment éviter des requêtes dans une boucle


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut Comment éviter des requêtes dans une boucle
    Bonjour,

    Voilà tout est dans le titre.
    Je suis obligé de l afire plein de fois, ce qui me donne des temps de réponse très très long.
    Notamment pour des tableaux à double entrée (état des vents par exemple)

    Merci d'avance de votre aide.

  2. #2
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Ben tu fais pas de boucles

    Non, plus sérieusement, pourrais-tu être plus clair, nous montrer ton bout de code sql ... ainsi que ton SGBD.

    Cdlt
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Avec une telle masse d'informations que tu nous fournis, c'est pas gagné.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Ok, merci de ton aide, voici un état des ventes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    <table width="99%" cellpadding="0" cellspacing="0" border="1" bordercolor="#999999"  style="empty-cells: show; border-collapse: collapse;">
    <tr class="entete_tableau">
    <td colspan="14" align="center">&Eacute;tat des ventes</td>
    </tr>
     
     
    <tr class="entetecellule">
    <td>Article</td>
    <?php		//Boucle pour lister les mois
    $retour_mois = mysql_query("SELECT nom_mois, id_mois, num_mois FROM mois ORDER BY id_mois");
    $mois = array();
    while ($donnees_mois = mysql_fetch_array($retour_mois)) 
    { 
    $mois[$donnees_mois['id_mois']] = $donnees_mois['num_mois'];?>
    <td width="7%"><?php echo $donnees_mois['nom_mois']; ?></td>
    <?php	} ?>
    <td width="5%">Total</td></tr>
     
    <?php
    $retour_article = mysql_query("SELECT id_article
    FROM article
    WHERE groupe_stat='$famille'
    AND groupe_produit='$sous_famille'
    ORDER BY id_article");
    while ($donnees_article = mysql_fetch_array($retour_article))
    { ?>
    <tr>
    <td align="left">
    <?php echo $donnees_article['id_article']; ?>
    </td>
    <?php	$retour_mois = mysql_query("SELECT nom_mois, id_mois, num_mois FROM mois ORDER BY id_mois");
    	while ($donnees_mois = mysql_fetch_array($retour_mois)) 
    	{ ?>
    	<td>
    <?php	$retour_vente_mois = mysql_query("	SELECT SUM(quantite) AS somme
    FROM commande_detail cd
    JOIN commande c
    ON cd.num_cmde=c.num
    WHERE YEAR(c.date_commande)='$annee_rch'
    AND MONTH(c.date_commande)='".$donnees_mois['num_mois']."'
    AND cd.article='".$donnees_article['id_article']."'
    GROUP BY cd.article, MONTH(c.date_commande)
    ORDER BY cd.article, MONTH(c.date_commande)");
    $donnees_vente_mois = mysql_fetch_array($retour_vente_mois);
    echo $donnees_vente_mois['somme']; ?></td>
    <?php	} ?>
    </tr><?php
    } ?>
     
     
    </table>
    </center>

    En fait je liste les mois, puis les produits, et pour chaque croisement je fais la somme donc si 100 produits alors 12*100 requêtes !
    Voilà, merci d'avance.

  5. #5
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Heu, c'est clair que c'est très crade ! :S

    Je pense qu'il y a une solution en sql, au lieu de faire 3 appels de requêtes (une pour les mois, une autre pour les articles, et une dernière pour leur combinaison ...), si tu fais une seule requête avec un GROUP BY, ca devrait marcher je crois.

    SELECT ...
    FROM ...
    WHERE ...
    GROUP BY id_mois, id_article

    Je suis un peu rouillé en sql, mais un truc comme ça devrait te permettre d'alléger sérieusement tes temps de réponses ...
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Oui merci, en fait je l'ai déjà fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    $retour_vente_mois = mysql_query("SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois
    FROM commande_detail cd
    JOIN commande c
    ON cd.num_cmde=c.num
    JOIN article a
    ON cd.article=a.id_article 
    WHERE YEAR(c.date_commande)='$annee_rch'
    GROUP BY article, MONTH(c.date_commande)
    ORDER BY article, MONTH(c.date_commande)");
     
     
    while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois))
    	{
    	$id_article = $donnees_vente_mois['article'];
    	$somme = $donnees_vente_mois['somme'];
    	$mois = $donnees_vente_mois['mois'];
    	$articles[$id_article][$mois] = $somme;
     
     
    	}
    Le soucis est dans l'affichage des données,

    Comment faire un jolie tableau avec cette reqûete ?

  7. #7
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Là je t'avoues que c'est une autre paire de manches ...

    Comme ça je ne vois pas trop désolé, il faut s'y pencher sérieusement dessus et là je n'en ai pas le courage dsl ...
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par dam28800 Voir le message
    Oui merci, en fait je l'ai déjà fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    $retour_vente_mois = mysql_query("SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois
    FROM commande_detail cd
    JOIN commande c
    ON cd.num_cmde=c.num
    JOIN article a
    ON cd.article=a.id_article 
    WHERE YEAR(c.date_commande)='$annee_rch'
    GROUP BY article, MONTH(c.date_commande)
    ORDER BY article, MONTH(c.date_commande)");
     
     
    while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois))
    	{
    	$id_article = $donnees_vente_mois['article'];
    	$somme = $donnees_vente_mois['somme'];
    	$mois = $donnees_vente_mois['mois'];
    	$articles[$id_article][$mois] = $somme;
     
     
    	}
    Le soucis est dans l'affichage des données,

    Comment faire un jolie tableau avec cette reqûete ?
    Beh tu fais un tableau et après tu te penche sur l'aspect de celui ci via les css !

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Oui je suis d'accord avec toi, mias le souci (le vrai) c'est comment dire que pour chaqsue mois tu créé une colonne et pour chaque produit tu créé une ligne.

    Merci d'avance!

  10. #10
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Eh oui lespoches, ce n'est pas aussi facile que cela ... Je vais essayer de trouver une solution ce matin ... Dis moi si tu y arrives.

    pour m'aider, peux-tu me donner un exemple de résultats que tu as stp ... ainsi que l'idée du tableau que tu voudrais ?
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Oui alors les résultats sont du style :

    article;mois;montant

    Donc pour chaque article je dois avoir 12 lignes avec le montant pour chqaue mois.

    Ce qui fait un truc du style :
    E567;01;4
    E567;02;2
    E567;03;6
    E567;04;5

    Et j'aimerais avoir en colonne les mois et en ligne les articles.

    Donc pour chaque ligne il faut comparer avec l'avant ernière afin de voir si elle est similaire, si oui je créé une colonne, si non je créé une ligne.

    Un truc dans ce genre... pas gagngé...

  12. #12
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Pour ce faire, tu vas devoir en fait récupérer avant la liste des mois et la liste des articles ..., et ensuite tu pourras faire une correspondance !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    <?php
     
    $retour_mois = mysql_query("SELECT nom_mois, id_mois, num_mois 
    FROM mois 
    ORDER BY id_mois");
     
    $retour_article = mysql_query("SELECT id_article
    FROM article
    WHERE groupe_stat='$famille'
    AND groupe_produit='$sous_famille'
    ORDER BY id_article");
     
    $retour_vente_mois = mysql_query("SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois
    FROM commande_detail cd
    JOIN commande c
    ON cd.num_cmde=c.num
    JOIN article a
    ON cd.article=a.id_article 
    WHERE YEAR(c.date_commande)='$annee_rch'
    GROUP BY article, MONTH(c.date_commande)
    ORDER BY article, MONTH(c.date_commande)");
     
    $tab_article = new array();
    $tab_somme = new array();
    $i = 0;
     
    while ($donnees_articles = mysql_fetch_array($retour_article)) 
    {
    	$tab_article[$i] = $donnees_articles['article'];
    	$i++;	
    }
    // On remet le compteur i à 0
    $i = 0;
     
    while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois))
    {
    	$tab_somme[$i] = $donnees_vente_mois['somme'];	
    	$i++; 
    }
    // On remet le compteur i à 0
    $i = 0;
     
    $nb_lignes = mysql_num_rows($retour_article);
    $nb_colonnes = mysql_num_rows($retour_mois);
     
    ?>
     
     
    <table width="99%" cellpadding="0" cellspacing="0" border="1" bordercolor="#999999"  style="empty-cells: show; border-collapse: collapse;">
    	<tr class="entete_tableau">
    		<td colspan="14" align="center">&Eacute;tat des ventes</td>
    	</tr>
    	<tr class="entetecellule">
    		<td>Article \ Mois</td>
     
    <?php
    	$cpt_somme = 0;
    	while ($donnees_mois = mysql_fetch_array($retour_mois)) 
    	{
    		echo "<td>".$donnees_mois['mois']."</td>";
    	}
     
    	for($cpt_ligne = 0; $cpt_ligne < $nb_lignes; $cpt_ligne++)
    	{
    		echo "<tr><td>".$tab_article[$cpt_ligne]."</td>";
    		for($cpt_colonne = 0; $cpt_colonne < $nb_colonnes; $cpt_colonne++)
    		{
    			echo "<td>";
    			echo $tab_somme[$cpt_somme];
    			echo "</td>";
    			$cpt_somme++;
    		}
    	}
     
    ?>
    Ou un truc dans le genre, attention, je n'ai pas testé je n'ai pas Apache sous la main ...

    PAR CONTRE, il est très important d'ordonner les articles, les mois de la même façon que quand tu récupères les sommes ...

    Essaye ça, tu me dis ce que ça donne.
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Merci beaucoup, ça ma avancée pas mal.

    Alors le tableau se construit bien, en ligne et en colonne.
    Le problème maintenant est plutôt des données qui sont à l'intérieur...
    En effet j'ai des données partout alors que pour le mois de décembre notamment il n'y a pas encire eu de vente...

    Voilà mon (enfin ton) code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    $retour_mois = mysql_query("	SELECT nom_mois, id_mois, num_mois 
    								FROM mois 
    								ORDER BY id_mois
    							");
     
     
    $retour_article = mysql_query("	SELECT id_article
    								FROM article
    								WHERE groupe_stat='$famille'
    								AND groupe_produit='$sous_famille'
    								ORDER BY id_article
    							");
     
    $retour_vente_mois = mysql_query("	SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois
    									FROM commande_detail cd
    									JOIN commande c
    									ON cd.num_cmde=c.num
    									JOIN article a
    									ON cd.article=a.id_article 
    									WHERE YEAR(c.date_commande)='$annee_rch'
    									GROUP BY article, MONTH(c.date_commande)
    									ORDER BY article, MONTH(c.date_commande)
    								");
     
    $tab_article = array();
    $tab_somme = array();
     
    $i = 0;
    while ($donnees_article = mysql_fetch_array($retour_article)) 
    	{
    	$tab_article[$i] = $donnees_article['id_article'];
    	$i++;	
    	}
     
    // On remet le compteur i à 0
    $i = 0; 
    while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois))
    	{
    	$tab_somme[$i] = $donnees_vente_mois['somme'];	
    	$i++; 
    	}
     
    // On remet le compteur i à 0
    $i = 0; 
    $nb_lignes = mysql_num_rows($retour_article);
    $nb_colonnes = mysql_num_rows($retour_mois);
    ?>
     
    <table width="99%" cellpadding="0" cellspacing="0" border="1" bordercolor="#999999"  style="empty-cells: show; border-collapse: collapse;">
    	<tr class="entete_tableau">
    		<td colspan="14" align="center">&Eacute;tat des ventes</td>
    	</tr>
     
    	<tr class="entetecellule">
    		<td>Article \ Mois</td>
     
    <?php
    	$cpt_somme = 0;
    	while ($donnees_mois = mysql_fetch_array($retour_mois)) 
    		{
    		echo "<td>".$donnees_mois['nom_mois']."</td>";
    		}
     	echo "</tr>";	
    	for($cpt_ligne = 0; $cpt_ligne < $nb_lignes; $cpt_ligne++)
    		{
    		echo "<tr><td>".$tab_article[$cpt_ligne]."</td>";
    		for($cpt_colonne = 0; $cpt_colonne < $nb_colonnes; $cpt_colonne++)
    			{
    			echo "<td>";
    			echo $tab_somme[$cpt_somme];
    			echo "</td>";
    			$cpt_somme++;
    			}
    	}
    Merci d'avance de ton aide !

  14. #14
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    He he oui, le problème avec cette méthode est qu'il faut qu'il y ait une somme pour tous les articles tous les mois ... Je cherche une autre façon !
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Oui tout a fait.

    Mais je suis dévutant et je ne vois pas ou tu fais le croisement des données, c'est à dire je veux la somme pour tel mois et tel article.

    Je n'arrive pas à comprendre cette partie là, peux tu m'éclairer ?

    Merci d'avance de ton aide !

  16. #16
    Membre actif
    Avatar de (Benoit)
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 184
    Points : 289
    Points
    289
    Par défaut
    Oublie pas que pour améliorer les performances de tes requêtes, tu peux (entre autres) ajouter des INDEX sur les colonnes "clés", c'est à dire celles sur lesquelles portent tes clauses WHERE.
    "J'adorerais changer le monde, mais pas moyen de mettre la main sur le code source."
    chez moi

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Oui je sais et c'est fait mais le problème c'est que 6 utilisateurs par 100 articles ça fait 600 fois la requête...
    Donc les temps de réponse ne sont pas à la joie !

    Je cherche encore, Merci d'avance !

  18. #18
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Voici un petit code bricolé en vitesse et à adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    <?php 
      function creeTableau()
      {
        //-- tableau pour simuler la BDD ---------------------
        $item = array();
        $item['E567'][1] = 4;
        $item['E567'][2] = 2;
        $item['E567'][3] = 6;
        $item['E567'][4] = 5;
        $item['E567'][10] = 12;
        $item['E567'][12] = 8;
        $item['C456'][2] = 4;
        $item['C456'][5] = 2;
        $item['C456'][7] = 6;
        $item['C456'][8] = 5;
        $item['C456'][9] = 12;
        $item['C456'][11] = 8;
        //-----------------------------------------------------
     
        //-- tableau modèle de colonnes de mois initialisé avec un espce -----
        $ligneModele = array_fill(1, 12, '&nbsp;');
        //-----------------------------------------------------
        //-- tableau qui sera rempli avec les résultat de la requête --------
        //-- dans cet exemple avec le tableau $item --------------------------
        $ligneTableau = array();
        //-----------------------------------------------------
        //-- tableau qui sera le retour de fonction pour affichage ------------
        $tableau = array();
        //-----------------------------------------------------
     
    /*    
        $sql = 'SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois
                FROM commande_detail cd
                JOIN commande c
                ON cd.num_cmde=c.num
                JOIN article a
                ON cd.article=a.id_article 
                WHERE YEAR(c.date_commande) = \'' . $annee_rch . '\'
                GROUP BY article, MONTH(c.date_commande)
                ORDER BY article, MONTH(c.date_commande)';
        $result = mysql_query($sql);
        
        while ($item = mysql_fetch_array($result))
        {
          if (! isset($ligneTableau[$item['article']]))
          {
            $ligneTableau[$item['article']] = $ligneModele;
          }
          $ligneTableau[$item['article']][$item['mois']] = $item['somme'];
        }  
    */  
        //-- cette partie est à remplacer par les lignes commentées ci-dessus ---------------  
        foreach($item as $cle => $valeur)
        {
          if (! isset($ligneTableau[$cle]))
          {
            $ligneTableau[$cle] = $ligneModele;
          }
          foreach($item[$cle] as $mois => $somme)
          {
            $ligneTableau[$cle][$mois] = $somme;
          }
        }
        //------------------------------------------------------------------------------------
     
        foreach ($ligneTableau as $cle => $valeur)
        {
          $tableau[] = '<tr>' . "\n" . '<td>' . $cle . '</td>' . "\n" . '<td>' . implode('</td>' . "\n" . '<td>', $ligneTableau[$cle]) . '</td>' . "\n" . '</tr>' . "\n";
        }
        //-- on prépare l'affichage du tableau ------------------------------------------------
        return implode('', $tableau);
      }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
    		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    		<link rel="stylesheet" href="calendrier.css" type="text/css" />
        <title>test</title>
    		<script type="text/javascript">
        </script>
      </head>
    	<body onload="// init()">
    		<table align="center" border="1">
    		  <tr>
    		    <td>article</td>
    		    <td>janvier</td>
    		    <td>février</td>
    		    <td>mars</td>
    		    <td>avril</td>
    		    <td>mai</td>
    		    <td>juin</td>
    		    <td>juillet</td>
    		    <td>août</td>
    		    <td>septembre</td>
    		    <td>octobre</td>
    		    <td>novembre</td>
    		    <td>décembre</td>
    		  </tr>
    		  <?php echo creeTableau(); ?>
    		</table>
    	</body>
    </html>
    Il sous-entend que ta requête, reprise dans le code et commentée, fonctionne correctement.
    Tu peux faire fonctionner directement ce code afin d'en voir le résultat.

  19. #19
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Merci je viens de faire fonctionner le code est cela ressemble tout à fait à ce que je souhaite.

    En revanche est-il possible à parti de cette exemple de générer dynamiquement l'affichage des colonnes.

    En effet là les mois sont saisies à la main mais on peut imaginer les faires sortir d'une table, ou même ne pas avoir les mois mais des utilisateurs.

    Merci d'avance je me penche sur ton code pour l'adapter.

    Je reste ouvert à toutes solutions; merci encore !

  20. #20
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Je pense que déjà, pour faire plus simple, il faudrait que tu renvoie une valeur pour chaque mois et article.

    Ex : tu as 3articles et 2mois (je sais mon année est très courte ^^), tu fais ça :

    Année\Mois | Mois1 | Mois2
    Art1 | 1 | 2
    Art2 | 4 | 0
    Art1 | 0 | 3


    Dans mon exemple, j'aurais bien une ligne même si je n'ai pas eu de vente d'articles (mais j'aurais 0). Celà pourrait permettre d'éviter de mettre des résultats à des mauvais endroits ...
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

Discussions similaires

  1. [AJAX - PHP] Lancer des requêtes dans une boucle
    Par Psycadi dans le forum AJAX
    Réponses: 12
    Dernier message: 01/07/2010, 17h05
  2. [MySQL] Comment éviter des doublons dans une liste déroulante ?!
    Par L'anonyme_connu dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/03/2008, 12h14
  3. COmment modifier des valeurs dans une requête?
    Par thibouille dans le forum Bases de données
    Réponses: 20
    Dernier message: 26/02/2008, 17h43
  4. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 17h23
  5. [SQL server] Comment Fusionner des données dans une requête
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo