Comparer les valeurs affichées dans une boucle while

Résolu
miga003 Messages postés 7 Date d'inscription mercredi 16 septembre 2009 Statut Membre Dernière intervention 27 février 2010 - 25 févr. 2010 à 16:39
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 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.

7 réponses

gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010
26 févr. 2010 à 01:30
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
3
miga003 Messages postés 7 Date d'inscription mercredi 16 septembre 2009 Statut Membre Dernière intervention 27 février 2010
26 févr. 2010 à 16:37
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 (?)
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
27 févr. 2010 à 12:39
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 -
0
miga003 Messages postés 7 Date d'inscription mercredi 16 septembre 2009 Statut Membre Dernière intervention 27 février 2010
27 févr. 2010 à 12:54
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010
27 févr. 2010 à 12:58
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
0
miga003 Messages postés 7 Date d'inscription mercredi 16 septembre 2009 Statut Membre Dernière intervention 27 février 2010
27 févr. 2010 à 13:01
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.
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
27 févr. 2010 à 13:21
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 -
0
Rejoignez-nous