Aller au contenu

Afficher le résultat d'une somme...


Sujets conseillés

Posté

Bonjour,

J'ai un petit souci,

J'ai lu que pour afficher le nombre de ligne d'une table il fallait utiliser l'expression COUNT. J'essay, mais ils ne précisent rien pour l'afficher, donc j'ai essayé plusieurs combinaisons, dont celle la qui me parait la plus logique de toutes celle que j'ai essayés :

{

$query6 = "SELECT COUNT(ID) FROM rapport WHERE Valid = '2'";

$result6 = mysql_query($query6)

or die("Erreur. La page est peut être en construction.") ;

while( $row6 = mysql_fetch_array($result6) ) {

echo $row6["ID"];

}

}

Et rien ne s'affiche. Comment faire ??

Merci !

Posté

Si je comprends bien (loin d'être forcément le cas), tu souhaites connaître le nombre de ligne retournée pour une requête ?

$sql = "SELECT...FROM table WHERE...";
$query = mysql_query($sql);
$nb = mysql_num_rows ($query);
echo $nb;

Tu auras une erreur si aucune ligne n'est retournée.

xpatval

Posté

Effectivement, ça marche dans un premier temps, merci.

En fait c'est à dire que j'ai un autre souci, j'ai une colonne Heure de la table Details comme tel :

+++++++

+ Heure +

+----------+

+02:30:00+

+16:40:00+

+12:10:00+

+07:50:00+

+++++++

Et je voudrais savoir comment faire pour afficher le total des heures ?

Merci !

Posté

$query = 'SELECT COUNT(*) as count FROM rapport WHERE Valid = 2';
$result = mysql_query($query) or die("Erreur. La page est peut être en construction.");

$data = mysql_fetch_array($result);
echo $data['count'];

Cela ne serait pas plus rapide que la solution proposée par xpatval ?

Je n'ai fait aucun test, mais il me semble que la fonction mysql_num_rows est plus gourmande (bien qu'elle soit necessaire dans certaines situations). Mais comme sa requette ne retourne aucune donnée, je pense qu'ici on peut s'en passer.

Peut être dis je une bétise, à confirmer.

Posté

Peut être que tu as raison Sonia car quand j'utilisais la mysql_num_rows, ma page afficher parfois l'erreur 500. Et là, tout va mieux ;) merci !

Et correction pour la question précédente je voulais savoir comment faire pour qu'un champ Y d'une table X contienne le total de tout les heures de ma table Details.

Merci !

Posté

Pour mon autre question, j'ai peut être trouvé un début :

       {
       $query8 = "SELECT SUM(Timing) as heures FROM rapport WHERE Callsign = 'SJT014' AND Valid = '2'";
       $result8 = mysql_query($query8) or die("Erreur. La page est peut être en construction.");
       $data8 = mysql_fetch_array($result8);
       echo $data8['heures'];
      }

Mais le problème, c'est qu'il affiche les heures sans ":"

ex : 11:40:00 = 114000

Et quand il doit additionner par exemple 11:40:00 et 00:35:00 il affiche 117500

Quelqu'un à une solution SVP ?

Posté
Peut être que tu as raison Sonia car quand j'utilisais la mysql_num_rows, ma page afficher parfois l'erreur 500. Et là, tout va mieux ;) merci !

<{POST_SNAPBACK}>

Enfin, même si ma solution est, il me semble, plus optimisée, cela doit se jouer a quelques microsecondes. Donc l'erreur n'était pas normale...

Pour additionner les heures, je pense qu'il serait préférable de le faire en php.

Et vu la complexité des dates (60 minutes dans une heure, 60 secondes dans une minutes, etc), je te conseille de passer toutes tes heures en secondes, puis de tout additionner. Voici un exemple :

$query8 = 'SELECT SUM(Timing) as heures FROM rapport WHERE Callsign = \'SJT014\' AND Valid = 2';
$result8 = mysql_query($query8) or die("Erreur. La page est peut être en construction.");
$data8 = mysql_fetch_array($result8);

// On récupère les heures
$heures = substr($data8['heures'], 0, 2);

// On récupère les minutes
$minutes= substr($data8['heures'], 2, 2);

// On récupère les secondes
$secondes = substr($data8['heures'], 4, 2);


// Si les secondes sont supérieures ou egale à 60, on incrémente les minutes
if ( $secondes >= 60 ) {

 $minutes_a_ajouter = floor($secondes / 60);
 $minutes += $minutes_a_ajouter;
 $secondes -= $minutes_a_ajouter * 60;

}


// Si les minutes sont supérieures ou egale à 60, on incrémente les heures
if ( $minutes >= 60 ) {

 $heures_a_ajouter = floor($minutes/ 60);
 $heures+= $heures_a_ajouter;
 $minutes-= $heures_a_ajouter * 60;

}

echo $heures, ':', $minutes, ':', $secondes;

Toutefois, ce n'est pas, je pense, la meilleure solution.

Mais je ne vois pas mieux pour le moment.

Posté

Bah j'ai adopté ta solution pour l'instant elle à l'air de marcher, j'ten remercie j'en avais besoin pour au moins 50 fiches :huh: !

@++ tout le monde et encore merci !

Posté

Ah quoikeu,

J'ai fait 3 lignes : 00:35:00 ; 11:40:00 ; et 00:45:00

A ma connaissance en les ajoutants, ça donne 13:00:00

Il n'en donne que 12:20

A mon avis, le problème viens qu'il calcule le total avant d'effectuer la conversion "SUM(Timing)"

Mais vous auriez une solution ?

Posté (modifié)

Bonsoir,

effectivement ADDTIME(expr1,expr2) ne petmet que d'aditionner deux champs de type "TIME" ou "DATETIME". Ton problème n'a pas de solution directement par une requête SQL.

Le plus rapide est de récupérer le champ TIME en question en utilisant la fonction TIME_TO_SEC ce qui donnerait, d'après le code que tu as présenté :

$query8 = 'SELECT SUM(TIME_TO_SEC(Timing)) as temps_secondes FROM rapport WHERE Callsign = \'SJT014\' AND Valid = 2';
$result8 = mysql_query($query8) or die("Erreur. La page est peut être en construction.");
$data8 = mysql_fetch_array($result8);

Avec cette requête tu obtiens la somme totale des secondes de tous les enregistrements qui correspondent à la clause WHERE de cette requête.

Ensuite tu peux le transformer ce nombre de secondes en une valeur correcte pour un champ TIME lorsque tu vas insérer ces données dans une table à nouveau avec la fonction MySQL : SEC_TO_TIME.

Si tu as besoin d'afficher ce temps en secondes sous forme de chaîne dans ton programme PHP de tu peux par exemple utiliser quelque chose comme :

echo mysql_result(mysql_query('SELECT SEC_TO_TIME('.$data8[0].')'),0);

Ou éventuellement procéder par divisions successives en PHP pour trouver le nombre d'heures, minutes et secondes (par 3600 pour le nombre d'heures, ensuite diviser le reste par 60 pour le nombre de minutes..et le reste correspond au secondes)... cela épargnera une requête au serveur MySQL (quoique dans le cas précédent aucune table n'est ouvert donc les performances sont très bonne si le serveur MySQL est hébergé sur le meme serveur que PHP ;) ).

Bonne chance !

Modifié par TheRec
Posté

Dans un premier temps, tu récupères le total des heures, puis le total des minutes, puis le total des secondes.

Ensuite, tu convertis l'ensemble en secondes, puis tu affiches le nombre d'heures que ca fait.

Le tout en php.

Posté
Ah quoikeu,

J'ai fait 3 lignes : 00:35:00 ; 11:40:00 ; et 00:45:00

A ma connaissance en les ajoutants, ça donne 13:00:00

Il n'en donne que 12:20

A mon avis, le problème viens qu'il calcule le total avant d'effectuer la conversion "SUM(Timing)"

Mais vous auriez une solution ?

<{POST_SNAPBACK}>

Oui, après reflexion, je me suis rendu compte que ma solution n'était pas du tout adaptée à certains cas.

La solution de TheRec est donc la meilleure ici. ;)

Posté

Re,

Ca marche à quelques endroits, là j'ai un problème, il m'affiche une erreur pourtant j'ai tout vérifié.

<?   //Sélection des appareils
$query2 = "SELECT * FROM appareils WHERE Callsign ='SJT014'";
$result2 = mysql_query($query2)
or die("Erreur 2"); ?>

<p align="left"><b><u><font color="#003399" face="Verdana" size="4">Carnets de
bord :</font></u></b></p>

<?
while( $val = mysql_fetch_array($result2) ) {
$immat = $val["Immatriculation"];
?>
<?   //A partir d'ici affichage en HTML   ?>

<table style="border-collapse: collapse;" id="AutoNumber3" border="1" bordercolor="#111111" cellpadding="0" cellspacing="0" height="108" width="100%">
 <tr>
   <td colspan="2" align="center" bgcolor="#EAF1F7" height="18" width="100%">
   <p align="center"><b><font color="#003399" face="Verdana"><? echo $val["Appareil"]; ?> [<? echo $val["Immatriculation"]; ?>] :</font></b></td>
 </tr>
 <tr>
   <td align="center" bgcolor="#EAF1F7" height="18" width="50%"><b>
   <font color="#003399" face="Verdana">Vols : </font><font color="#0033cc" face="Verdana">
   <?
      {
       $query20 = "SELECT COUNT(*) as vols_acft FROM rapport WHERE Immat = '.$immat.' AND Valid = '2'";
       $result20 = mysql_query($query20) or die("Erreur. La page est peut être en construction.");
       $data20 = mysql_fetch_array($result20);
       echo $data20['vols_acft'];
      }
   ?></font></b></td>
   <td align="center" bgcolor="#EAF1F7" height="18" width="50%"><b>
   <font color="#003399" face="Verdana">Heures de vols :</font><font color="#0033cc" face="Verdana">
   <?
   {
   $immat = $val["Immatriculation"];
   $query18 = "SELECT SUM(TIME_TO_SEC(Timing)) as temps_acft FROM rapport WHERE Immat = '.$immat.' AND Valid = '2'";
   $result18 = mysql_query($query18) or die("Erreur. La page est peut être en construction.");
   $data18 = mysql_fetch_array($result18);
   echo mysql_result(mysql_query('SELECT SEC_TO_TIME('.$data18[0].')'),0);
   }
   ?></font></b></td>
 </tr>
 <tr>
   <td align="center" bgcolor="#EAF1F7" height="18" width="50%"><b>
   <font color="#003399" face="Verdana">Distance Parcourue : </font>
   <font color="#0033cc" face="Verdana"><? echo $val["Distance"]; ?> nm</font></b></td>
   <td align="center" bgcolor="#EAF1F7" height="18" width="50%"><b>
   <font color="#003399" face="Verdana">Pannes reçus : </font><font color="#0033cc" face="Verdana">
   <? echo $val["Pannes"]; ?></font></b></td>
 </tr>
 <tr>
   <td colspan="2" align="center" bgcolor="#EAF1F7" height="13" width="100%">
   <b><font color="#003399" face="Verdana">Suivi des vols :<br>
   </font><font color="#0033cc" face="Verdana"><? echo $val["Suivi"]; ?></font></b>
   </td>
 </tr>
 <tr>
   <td colspan="2" align="center" bgcolor="#EAF1F7" height="18" width="100%">
   <b><font color="#003399" face="Verdana">Liste des pannes :<br>
   </font><font color="#0033cc" face="Verdana"><? echo $val["PanList"]; ?></font></b></td>
 </tr>
 <tr>
   <td colspan="2" align="center" bgcolor="#EAF1F7" height="18" width="100%">
   <b><font color="#003399" face="Verdana">Rapports de révision :<br>
   </font><font color="#0033cc" face="Verdana"><? echo $val["Revisions"]; ?></font></b></td>
 </tr>
</table>
<br> 
   
<?
}
?>

Voici la page : http://va.skyjet.free.fr/modules.php?name=SJT014

Comme vous le voyez, tout en bas dans les carnets de bord, il m'affiche 0 pour le nombre de vols, or il y'a 1 vol sur le P-001. Aussi il m'affiche une erreur pour l'affichage de l'heure de vols.

En fait, je pense savoir d'ou viens le problème :

Quand j'appelle le nombre de vols et le nombre d'heures de vols, j'utilise la clause

WHERE Immat = '.$immat.'

Et apparamment il n'est pas content, s'il n'arrive pas a repêcher le nombre de vols, c'est qu'il n'arrivera pas a repêcher le nombre d'heures de vol, et donc les heures = 00:00:00, et dans ce cas le SEC_TO_TIME ne fonctionne plus, d'où l'erreur des heures de vols.

Quelqu'un saurait-il si j'ai réellement fait une erreur de syntaxe ou c'est que ce code n'est pas valable ?

Merci !

Posté (modifié)

En fait, tu as un problème avec tes guillemets et ta concaténation.

Ainsi, cette requete pose problème :

$query20 = "SELECT COUNT(*) as vols_acft FROM rapport WHERE Immat = '.$immat.' AND Valid = '2'"

Les "points" qui encadrent $immat sont totalement inutiles, car ta requete est placée entre double guillemets (" et ").

---

Si tu souhaites utiliser la concaténation, il est préférable d'utiliser les guillemets simples.

Si $immat contient une valeur numérique, tu peux faire :

$query20 = 'SELECT COUNT(*) as vols_acft FROM rapport WHERE Immat = '.$immat.' AND Valid = 2'

Par contre, si $immat contient (ou peut contenir, car cette méthode marche à tous les coups) des lettres ou autres caractères spéciaux, il faut utiliser des \'. Tu dois donc faire :

$query20 = 'SELECT COUNT(*) as vols_acft FROM rapport WHERE Immat = \''.$immat.'\' AND Valid = 2'

---

Avec les guillemets doubles, il aurait fallu faire :

$query20 = "SELECT COUNT(*) as vols_acft FROM rapport WHERE Immat = '".$immat."' AND Valid = 2"

ou alors :

$query20 = "SELECT COUNT(*) as vols_acft FROM rapport WHERE Immat = '$immat' AND Valid = 2"

ou encore (si $immat est un nombre seulement) :

$query20 = "SELECT COUNT(*) as vols_acft FROM rapport WHERE Immat = $immat AND Valid = 2"

---

La requete 18 contient la même erreur.

Je te laisse corriger ;)

Modifié par Sonia Gazil
Posté

Eh ben effectivement, ça marche !

J'suis plutôt débutant dans le php (vous l'aurez remarqué) et je pense que c'est la dernière chose dont j'avais besoin, j'arrête de vous embêter ;) !

Ah aussi (une dernière fois sinon ça va me manquer) :

Il est possible d'insérer dans un champ d'une table la somme de toutes les valeurs d'une autre table ? Par exemple tout ce qu'on vient de refaire la pour l'afficher sur une page je voudrais qu'elle soit aussi stockée dans une autre table. A moins que il faudrait faire une requête INSERT INTO ou MODIFY sur cette même page pour qu'elle s'auto insert.

Voilà, je pense que j'ai fini, merci encore à ce sympathique forum !

Posté

Tu pourrais oui.

Mais le problème, c'est que ta table ne contiendrait, d'après ce que j'ai compris, un seul enregistrement : la somme de toutes les valeurs.

Dans ce cas, l'utilisation d'une table MySQL n'est pas vraiment utile, il serait préférable de stocker cette valeur dans un fichier texte.

Pour sauvegarder ta valeur dans un fichier texte, regarde du coté des fonctions fopen, fread, fwrite et fclose.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...