miga003
Messages postés7Date d'inscriptionmercredi 16 septembre 2009StatutMembreDernière intervention27 février 2010
-
25 févr. 2010 à 16:39
kohntark
Messages postés3705Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 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.
gibozsec
Messages postés318Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention11 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 :
miga003
Messages postés7Date d'inscriptionmercredi 16 septembre 2009StatutMembreDernière intervention27 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 (?)
kohntark
Messages postés3705Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 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é).
gibozsec
Messages postés318Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention11 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.
miga003
Messages postés7Date d'inscriptionmercredi 16 septembre 2009StatutMembreDernière intervention27 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.
kohntark
Messages postés3705Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 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.