Comparer les valeurs affichées dans une boucle while [Résolu]

miga003 7 Messages postés mercredi 16 septembre 2009Date d'inscription 27 février 2010 Dernière intervention - 25 févr. 2010 à 16:39 - Dernière réponse : kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention
- 27 févr. 2010 à 13:21
Bonjour,
Nouveau venu sur ce forum, je suis confronté à une question que je ne sais résoudre :

configuration :
Je récupère les valeurs d'une table par une requête MYSQL et les affiche dans un tableau à l'aide d'une boucle while :
$req="select * from Table where id=$id";
$res= mysql_query($req) or die(mysql_error());
while($row=mysql_fetch_array($res)){
echo '<tr><td>'.$row['Annee'].'</td><td>'.$row['Mois'].</td><td>'.$row['NbDossiers'].'</td></tr>';
}
question :
mais je souhaite comparer les valeurs de chaque ligne pour (par exemple) cumuler les valeurs de NbDossiers dans un même mois d'une même année :
de façon à ce que les résultats de la requête :
2009 - 12 - 2
2009 - 12 - 4
2009 - 10 - 3
s'affichent de la façon suivante :
2009 - 12 - 6
2009 - 10 - 3

Comment faire, donc, pour comparer les valeurs de $row['Annee'] - $row['Mois'] d'une ligne à l'autre à l'intérieur de la boucle while afin d'additionner les valeurs correspondantes de $row['NbDossiers'] ?
Suis-je clair ?
je pensais passer par une boucle for et indexer les variables avec [$i], mais je suis un peu perdu dans cette hypothèse.
Je me dis que les conseils éclairés d'un expert pourraient me faire apprendre à mieux utiliser php tout en gagnant du temps...
Merci de votre aide.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
gibozsec 318 Messages postés mardi 27 mai 2003Date d'inscription 11 mars 2010 Dernière intervention - 26 févr. 2010 à 01:30
3
Merci
Bonjour,

Une première chose avant de te répondre : éviter les "or die()". Si ta connexion à la DB n'est pas possible, si la requête plante ou n'importe quel autre problème affiche un message d'erreur dans une page normale ou redirige le visiteur ou fait autre chose mais n'utilise pas die().

Concernant ton problème tu peux faire plusieurs choses. Première solution, tu enregistre la date "en cours" dans ta boucle et en fonction du fait qu'elle ait changé ou non, tu calcule ou tu affiche.
<?php


$annee = '';
$mois = '';
$dossiers = 0;

while($row=mysql_fetch_array($res)){
//Si on a changé de date, on affiche la date précédente
//$annee != '' permet de ne pas afficher au 1er tour de boucle
if(($row['Annee'] != $annee || $row['Mois'] != $mois) && $annee != ''){
//On a changé de mois, on affiche le précédent
echo '<tr><td>'.$annee.'</td><td>'.$mois.</td><td>'.$dossiers.'</td></tr>;
//Réinitialisation du nombre de dossiers
$dossiers = 0;
}
//Ajout des dossiers de ce tour de boucle
$dossiers += $row['NbDossiers'];

//Mise à jour du mois et de l'année
$annee = $row['Annee'];
$mois = $row['Mois'];
}
//A la fin de la boucle il reste un mois à afficher
echo '<tr><td>'.$annee.'</td><td>'.$mois.</td><td>'.$dossiers.'</td></tr>;

?>


La seconde solution (que je préfère pour raison personnelles) est de faire deux boucles : une pour créer un tableau auto-indexé, une pour l'affichage :

<?php
$data = array();
while($row=mysql_fetch_array($res)){
if(!isset($data[$row['Mois'].'-'$row['Annee']])){
$data[$row['Mois'].'-'$row['Annee']] = $row['NbDossiers'];
}
else{
$data[$row['Mois'].'-'$row['Annee']] += $row['NbDossiers'];
}
}
foreach($data as $k=>$dossiers){
list($mois, $annee) = explode('-',$k);
echo '<tr><td>'.$annee.'</td><td>'.$mois.</td><td>'.$dossiers.'</td></tr>;
}

?>

(je n'ai pas testé le code mais l'idée est là)


En espérant t'avoir aidé.
Grrrrrrrrrrr

Merci gibozsec 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de gibozsec
miga003 7 Messages postés mercredi 16 septembre 2009Date d'inscription 27 février 2010 Dernière intervention - 26 févr. 2010 à 16:37
0
Merci
Merci pour ta réponse;
je suis toujours agréablement surpris par l'esprit collaboratif et solidaire des forums. Si c'était tout le temps comme ça !
Je vais tester les solutions que tu me proposes et reviens vite te dire le résultat.
Merci encore.
Grrrrrr (?)
Commenter la réponse de miga003
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 27 févr. 2010 à 12:39
0
Merci
Salut,

Ca me parait complexe tout ça.

Une date se stocke dans un champ date, pas, comme tu sembles le faire, dans plusieurs (Mois, Année) champs d'un autre type.
Cela relève bien sur de ton contexte, que je ne connais pas, mais, même si à l'instant présent tu n'as pas besoin d'une date complète (entends par là jour/mois/année) je reste persuadé qu'un type date serait plus approprié.

Par exemple :
$sql = "
SELECT LEFT(champ_date, 4) AS Y, 
SUBSTRING(champ_date,6,2) AS M,
SUM(NbDossiers) AS tot
FROM Table
GROUP BY LEFT(champ_date,7)";

$res = $dbh->query($sql); // suppose une utilisation de PDO

echo '';
foreach($res as $v) {
echo '----
'.$v['Y'].', '.$v['M'].', '.$v['tot'].', ';
}
echo '
';


Je trouve cela plus clair et c'est sans doute bien plus rapide (même si ça pourrait être optimisé).


Cordialement,



Kohntark -
Commenter la réponse de kohntark
miga003 7 Messages postés mercredi 16 septembre 2009Date d'inscription 27 février 2010 Dernière intervention - 27 févr. 2010 à 12:54
0
Merci
bonjour,
j'ai utilisé la première solution et ça fonctionne super bien.
Dès que j'ai plus de temps j'essaie la deuxième...
Merci de ton aide.
Commenter la réponse de miga003
gibozsec 318 Messages postés mardi 27 mai 2003Date d'inscription 11 mars 2010 Dernière intervention - 27 févr. 2010 à 12:58
0
Merci
A ton service.

La solution avec un seul champ pour la date et un group by est pas mal aussi à condition que ce ne soit pas un problème pour toi d'enregistrer la date dans un seul champ.


Grrrrrrrrrrr
Commenter la réponse de gibozsec
miga003 7 Messages postés mercredi 16 septembre 2009Date d'inscription 27 février 2010 Dernière intervention - 27 févr. 2010 à 13:01
0
Merci
Salut Kohntark,
en effet le format date serait plus approprié, mais mon client a configuré sa table avec un champ Année (AAAA) et un champ Mois (MM) sous Access et l'importe dans mysql tout comme.
Par ailleurs, ta solution avec foreach me semble en effet simple et rapide. Je m'en vais l'essayer aussi histoire de parfaire ma formation php (lol)
Merci de tes remarques et propositions.
Commenter la réponse de miga003
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 27 févr. 2010 à 13:21
0
Merci
Merci de tes remarques et propositions.

De rien
C'est toujours agréable de répondre à des questions bien posées et surtout à des personnes qui ne prennent pas les intervenants pour des cons ou des vaches à lait (ce qui repésente plus de la moitié des messages postés ici, malheureusement )

C'est un peu un message pour rien mais je tenais à le préciser

N'hésite pas à nous faire part de tes avancées ou difficultés.


Kohntark -
Commenter la réponse de kohntark

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.