[RESOLU] REQUETTE SQL sur une Table

Eléphanteau du PHP | 32 Messages

12 oct. 2009, 23:37

Bonjour,

Je suis débutant dans le dev PHP et je vous soumets mon soucis :

J'ai une table MySQL ci-dessous :
Image

J'ai un fichier roster.php ou je peux faire apparaitre quelques infos suivantes :
http://www.siberiavirtual.fr/cargo/inde ... age=roster
Du type temps de vol, poids, distance et carburant ( tout cela lié au pilot_id de la table Mysql
Voici mon fichier php :
/* Calculate flight hours */ 
		$query_hours = "SELECT sec_to_time(sum(time_to_sec(t2.duration))) AS duration_sum FROM pilots t1, reports t2 WHERE t1.pilot_id=$id AND t1.pilot_id=t2.pilot_id";
          	$result_hours = mysql_query($query_hours);
       
          	if (mysql_numrows($result_hours) > 0) {
         	$time = mysql_result($result_hours,0,"duration_sum");
      	}

	/* Calculate distance */ 
		$query_dist = "SELECT (sum(t2.distance)) AS distance_sum FROM pilots t1, reports t2 WHERE t1.pilot_id=$id AND t1.pilot_id=t2.pilot_id";
          	$result_dist = mysql_query($query_dist);
       
          	if (mysql_numrows($result_dist) > 0) {
         	$dist = mysql_result($result_dist,"distance_sum");
      	}	

	/* Calculate poids */ 
		$query_poids = "SELECT (sum(t2.registration)) AS registration_sum FROM pilots t1, reports t2 WHERE t1.pilot_id=$id AND t1.pilot_id=t2.pilot_id";
          	$result_poids = mysql_query($query_poids);
       
          	if (mysql_numrows($result_poids) > 0) {
         	$poids = mysql_result($result_poids,"registration_sum");
      	}	
         	
	/* Calculate fuel */ 
		$query_fuel = "SELECT (sum(t2.fuel)) AS fuel_sum FROM pilots t1, reports t2 WHERE t1.pilot_id=$id AND t1.pilot_id=t2.pilot_id";
          	$result_fuel= mysql_query($query_fuel);
       
          	if (mysql_numrows($result_fuel) > 0) {
         	$fuel = mysql_result($result_fuel,"fuel_sum");
      	}

	/* Calculate CA */ 

Ce que je souhaiterais, c'est de faire le calcul du Chiffre d'affaire comme ceci : $ca=( $(poids*4.9) + ($dist*300) + ($fuel*63)) et ceci pour chaque id_pilot
Les chiffres sur le site sont rentrés en manuel ( donc me convennent pas, car ce n'est pas du temps réel )
Je n'arrives pas à trouver la syntaxe de ce calcul

Auriez-vous une idée?
Merci d'avance
Jacky
Modifié en dernier par sbi016 le 16 oct. 2009, 17:38, modifié 1 fois.

Eléphanteau du PHP | 32 Messages

13 oct. 2009, 19:44

Bonjour Messieurs,

Petit UP pour ce message
Personne n'a une idée, ais-je bien mis ce post au bon endroit.

Cordialement
Jacky

Kran
Invité n'ayant pas de compte PHPfrance

13 oct. 2009, 20:07

Hum... j'me suis déja pas mal humilié en sql ces derniers temps mais...
SELECT pilot_id, ((poids * 4.9) + (distance * 300) + (fuel * 63)) as ca FROM pilots ORDER BY pilot_id
ça marche pas ça ?
(si tant est que poids est bien un champ de ta table pilots car il n'apparait pas dans la partie visible de la descritpion de ta table...)

Kran
Invité n'ayant pas de compte PHPfrance

13 oct. 2009, 20:29

Ha heu... ou alors ta question est plutot pour calculer $ca en php en fonction des information que tu as récupéré par les requêtes sql précédentes... ?
Dance ce cas t'aurais juste à remplacer
$ca=( $(poids*4.9) + ($dist*300) + ($fuel*63)) 
par
$ca=( ($poids*4.9) + ($dist*300) + ($fuel*63)); 
je suppose...

En même temps tu devrais pouvoir faire toutes les requêtes précédentes en une seule fois si je n'm'abuse... vu qu'elles ont la même clause where et utilisent les mêmes tables...
/* Calculate all */ 
                $sqltxt= "SELECT t1.pilot_id,
                                         sec_to_time(sum(time_to_sec(t2.duration))) AS duree_sum,
                                         (sum(t2.distance)) AS distance_sum,
                                         (sum(t2.registration)) AS poids_sum,
                                         (sum(t2.fuel)) AS fuel_sum                                         
                              FROM pilots t1, reports t2 
                              WHERE t1.pilot_id=t2.pilot_id";
               
                $sql_result = mysql_query($query_hours);
       
                if (mysql_numrows($sql_result) > 0) {
                      while($resline=mysql_fetch_assoc($sql_result) )
                           $pilot_id = $resline['pilot_id']; 
                           $time = $resline['duree_sum'];
                           $distance = $resline['distance_sum'];
                           $registration = $resline['poids_sum'];
                           $fuel = $resline['fuel_sum'];
                           $ca = (($poids*4.9) + ($distance*300) + ($fuel*63)); 
                           echo "Resultats pour pilote $pilot_id : temps:$time distance:$distance poids:$poids fuel:$fuel ca:$ca";
                     }
                }

Kran
Invité n'ayant pas de compte PHPfrance

13 oct. 2009, 20:32

erf... correctif :
// remplace 
$sql_result = mysql_query($query_hours);
// par 
$sql_result = mysql_query($sqltxt);
J'suis pas en forme en c'moment moi :roll:

Eléphanteau du PHP | 32 Messages

13 oct. 2009, 20:37

Merci Kran de ta réponse

Malheureusement cela ne fonctionne pas, ( pour le poids, j'utilise le champs registration qui est libre ) cela doit etre plus compliqué que ca ci-joint mon code :
/* Calculate CA */ 
		SELECT pilot_id, ((t2.registration * 4.9) + (t2.distance * 300) - (t2.fuel * 63)) AS ca_sum FROM pilots t1, reports t2 WHERE t1.pilot_id=$id AND t1.pilot_id=t2.pilot_id";
          	
         	$ca = ca_sum;
	/*SELECT pilot_id, ((registration * 4.9) + (distance * 300) - (fuel * 63)) AS ca FROM pilots ORDER BY pilot_id	
		
	}	

     		/* Display roster entries */
     		print "<tr>";
     		print "<td width=70 height=12 align=center><font face=Arial size=3 color=#FFFFFF> <a href=\"index.php?page=carnet$num\"> $num </a> </font></td>";
		print "<td width=90 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$name</font></td>";
     		print "<td width=110 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$time</font></td>";
     		print "<td width=70 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$poids</font></td>";
		print "<td width=70 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$dist</font></td>";
		print "<td width=80 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$fuel</font></td>";
		print "<td width=110 height=12 align=right><font face=Arial size=2 color=#FFFFFF>$ca</font></td>" ;
		  
		print "</tr>";
MOi aussi, je suis vraiment pas en forme
Modifié en dernier par sbi016 le 14 oct. 2009, 07:32, modifié 2 fois.

Kran
Invité n'ayant pas de compte PHPfrance

13 oct. 2009, 20:38

J'suis un boulet... version définitive :
$sqltxt= "SELECT t1.pilot_id,
                          sec_to_time(sum(time_to_sec(t2.duration))) AS duree_sum,
                          (sum(t2.distance)) AS distance_sum,
                          (sum(t2.registration)) AS poids_sum,
                          (sum(t2.fuel)) AS fuel_sum                                         
              FROM pilots t1, reports t2 
              WHERE t1.pilot_id=t2.pilot_id";
               
$sql_result = mysql_query($sqltxt);

if (mysql_numrows($sql_result) > 0) {
     while($resline=mysql_fetch_assoc($sql_result) )
        $pilot_id = $resline['pilot_id']; 
        $time = $resline['duree_sum'];
        $distance = $resline['distance_sum'];
        $poids = $resline['poids_sum'];
        $fuel = $resline['fuel_sum'];
        $ca = (($poids*4.9) + ($distance*300) + ($fuel*63)); 
        echo "Resultats pour pilote $pilot_id : temps:$time distance:$distance poids:$poids fuel:$fuel ca:$ca";
    }
}
Promis j'arrête de répondre aux questions tant qu'j'aurai pas dormi pasque la ça devient critique... quelqu'un peut effacer mes deux derniers posts pliz =P~ ?

Kran
Invité n'ayant pas de compte PHPfrance

13 oct. 2009, 20:40

Malheureusement cela ne fonctionne pas
heu... un indice supplémentaire peut-être ?
ca affiche quoi ?

Eléphanteau du PHP | 32 Messages

13 oct. 2009, 20:58

Re bonjour Kran

Voici mon code ( et encore merci mille fois de te pencher sur ma demande ) :
$sqltxt= "SELECT t1.pilot_id,
                          sec_to_time(sum(time_to_sec(t2.duration))) AS duration_sum,
                          (sum(t2.distance)) AS distance_sum,
                          (sum(t2.registration)) AS poids_sum,
                          (sum(t2.fuel)) AS fuel_sum                                         
              FROM pilots t1, reports t2 
              WHERE t1.pilot_id=t2.pilot_id";
               
$sql_result = mysql_query($sqltxt);

if (mysql_numrows($sql_result) > 0) {
     while($resline=mysql_fetch_assoc($sql_result) )
        $time = $resline['duration_sum'];
        $distance = $resline['distance_sum'];
        $poids = $resline['poids_sum'];
        $fuel = $resline['fuel_sum'];
        $ca = (($poids*4.9) + ($distance*300) - ($fuel*63)); 
        
    }
}
      
	

     		/* Display roster entries */
     		print "<tr>";
     		print "<td width=70 height=12 align=center><font face=Arial size=3 color=#FFFFFF> <a href=\"index.php?page=carnet$num\"> $num </a> </font></td>";
		print "<td width=90 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$name</font></td>";
     		print "<td width=110 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$time</font></td>";
     		print "<td width=70 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$poids</font></td>";
		print "<td width=70 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$dist</font></td>";
		print "<td width=80 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$fuel</font></td>";
		print "<td width=110 height=12 align=right><font face=Arial size=2 color=#FFFFFF>$ca</font></td>" ;

Mais malheureusement, ce n'est pas le pied
ci-joint le lien du résultat
http://www.siberiavirtual.fr/cargo/inde ... age=roster

Mais encore Merci de toute façon
Modifié en dernier par sbi016 le 14 oct. 2009, 07:32, modifié 1 fois.

Kran
Invité n'ayant pas de compte PHPfrance

13 oct. 2009, 22:23

Essayes ça tel-quel en changeant juste le nom du champ t2.name par la bonne valeur et dis nous ce qui s'affiche...
<?php
echo "<table>
		<tr>
			<td>PILOTE</td>
			<td>NOM</td>
			<td>TVD</td>
			<td>POIDS</td>
			<td>MN</td>
			<td>FUEL</td>
			<td>CA</td>
		</tr>";

// cette requete est sensée te retourner une ligne d'infos PAR PILOT_ID
// au passage, j'espère que tu ouvres bien ta connexion bdd quelquepart au dessus...
// et que tu la fermes quelquepart en dessous...
// ATTENTION : remplace t1.name par le champ qui sert à stocker le nom du pilote dans la table pilots
$sqltxt= "SELECT t1.pilot_id,
				 t1.name as nom_pilote, 
				 sec_to_time(sum(time_to_sec(t2.duration))) AS duration_sum,
				 (sum(t2.distance)) AS distance_sum,
				 (sum(t2.registration)) AS poids_sum,
				 (sum(t2.fuel)) AS fuel_sum 
		FROM pilots t1, reports t2 
		WHERE t1.pilot_id=t2.pilot_id";
// il faut peut-être ajouter une clause "GROUP BY"...

$sql_result = mysql_query($sqltxt) or die ("<br/><br/>mysql_query returns : Err".mysql_errno()." ".mysql_error() );

if(mysql_numrows($sql_result) > 0) {
	// ici tu parcours le jeu de résultats retournés :
	// tant qu'il reste des lignes de résultat, je passe à la suivante et je la traite
	while($resline=mysql_fetch_assoc($sql_result) ) {
		// ici, j'aimerais bien savoir... si on est d'accord sur le fait que $num contient ton pilot_id, je vois plus ça comme ça :
		// (en virant l'affectation de $num plus haut dans ton code... d'ailleur j'aimerais bien voir toute ta page car j'ai du
		// mal a appréhender le problème de façon globale...)
		$num = $resline['pilot_id'];
		$name = $resline['nom_pilote'];
		$time = $resline['duration_sum'];
		$distance = $resline['distance_sum'];
		$poids = $resline['poids_sum'];
		$fuel = $resline['fuel_sum'];
		$ca = (($poids*4.9) + ($distance*300) - ($fuel*63)); 
	
		echo "<tr>
				 <td width=70 height=12 align=center><font face=Arial size=3 color=#FFFFFF> <a href=\"index.php?page=carnet$num\"> $num </a> </font></td>
				 <td width=90 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$name</font></td>
				 <td width=110 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$time</font></td>
				 <td width=70 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$poids</font></td>
				 <td width=70 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$dist</font></td>
				 <td width=80 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$fuel</font></td>
				 <td width=110 height=12 align=right><font face=Arial size=2 color=#FFFFFF>$ca</font></td>
			</tr>" ;
	}
} else echo "<tr>
				 <td width=70 height=12 align=center colspan=7>La requête n'a retourné aucune ligne !</td>
			</tr>"
echo "</table>";
?>

Eléphanteau du PHP | 32 Messages

13 oct. 2009, 22:57

Voila l'erreur :

Parse error: syntax error, unexpected T_ECHO, expecting ',' or ';' in /homez.62/gcplans/www/siberia/cargo/test-roster.php on line 58


Voila le lien :

http://www.siberiavirtual.fr/cargo/test-roster.php

Oui tout a fait j'ouvre bien la base et je ferme bien la base

Le mieux si tu veux je peux te transmettre tous le fichier PHP

Merci encore

Kran
Invité n'ayant pas de compte PHPfrance

13 oct. 2009, 23:12

wé bon... la ça veut dire que j'ai oublié un ; vers la fin de la page.
} else echo "<tr>
				 <td width=70 height=12 align=center colspan=7>La requête n'a retourné aucune ligne !</td>
			</tr>"; // <== là
echo "</table>";
Mais bon tu m'fais peur la... faudrait voir à essayer d'interpretter un peu quand-meme... essaye encore ^^

Eléphanteau du PHP | 32 Messages

13 oct. 2009, 23:29

Oui , j'avais vu la qu'il manquais, enfin je présumais

mais j'ai mis ton fichier brut de pomme ( mais sans connexion a la base )

voila le message :

Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /homez.62/gcplans/www/siberia/cargo/retest.php on line 27

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /homez.62/gcplans/www/siberia/cargo/retest.php on line 27
mysql_query returns : Err2002 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
PILOTE NOM TVD POIDS MN FUEL CA

Bon maintenant je vais mettre l'ouverture de la base ainsi que la fermeture
Bon Toujours le Bazard,

Je crois que je suis vraiment pas doué avec le PHP
Tu m'en vois désolé
Mais encore mille fois merci à toi
Jacky

Eléphanteau du PHP | 32 Messages

14 oct. 2009, 07:31

Bonjour Khan,

Voici la totalité de mon fichier php original :
<style type="text/css">
<!--
a:link {
	text-decoration: none;
}
a:visited {
	text-decoration: none;
}
a:hover {
	text-decoration: none;
}
a:active {
	text-decoration: none;
}
-->
</style>

<body bgcolor="#418FCD">
	<p align="left"><strong><u>Tableau pilotes</u></strong></p>
	<p align="justify">&nbsp;</p>
	<p align="justify">Cliquez sur le callsign d'un pilote pour acc&eacute;der &agrave; son carnet de vol. </p>
	<p align="justify">&nbsp;</p>
	<div align="center">
		<!-- begin FSACARS Reports --><?php

/* Constants */
@define ("MYSQL_CONNECT_INCLUDE", "fsacars/connect_db.php");   // MySQL database connection 

/* Database connection */
include(MYSQL_CONNECT_INCLUDE);

/* Select all pilots */
$query = "SELECT * FROM pilots ORDER BY pilot_id ASC";
$result = mysql_query($query);

/* Determine the number of pilots */
$number = mysql_numrows($result);

if ($number > 0) {
   
  	/* Print roster header 
	   Change this HTML to fit your webpage layout */
	print "<table>";
	print "<tr>";
	print "<td bgcolor=#87B5E2 width=70 height=12 align=center><font face=Arial color=#FFFFFF size=2><b>PILOTE</b></font></td>";
	print "<td bgcolor=#87B5E2 width=90 height=12 align=center><font face=Arial color=#FFFFFF size=2><b>NOM</b></font></td>";
	print "<td bgcolor=#87B5E2 width=110 height=12 align=center><font face=Arial color=#FFFFFF size=2><b>TDV</b></font></td>";
	print "<td bgcolor=#87B5E2 width=70 height=12 align=center><font face=Arial color=#FFFFFF size=2><b>POIDS</b></font></td>";
	print "<td bgcolor=#87B5E2 width=70 height=12 align=center><font face=Arial color=#FFFFFF size=2><b>MN</b></font></td>";
	print "<td bgcolor=#87B5E2 width=80 height=12 align=center><font face=Arial color=#FFFFFF size=2><b>FUEL</b></font></td>";
	print "<td bgcolor=#87B5E2 width=110 height=12 align=center><font face=Arial color=#FFFFFF size=2><b>CA</b></font></td>";
	print "</tr>";
	
	/* Get pilots info */
	for ($i=0; $i<$number; $i++) {
     		$num = mysql_result($result,$i,"pilot_num");
     		$name = mysql_result($result,$i, "name");
		$city = mysql_result($result,$i, "city");
     		$country = mysql_result($result,$i, "country");
     		$status_fr = mysql_result($result,$i, "status_fr");
		$ca= mysql_result($result,$i, "ca");
		$id = mysql_result($result,$i, "pilot_id");
		
         	/* Calculate flight hours */ 
		$query_hours = "SELECT sec_to_time(sum(time_to_sec(t2.duration))) AS duration_sum FROM pilots t1, reports t2 WHERE t1.pilot_id=$id AND t1.pilot_id=t2.pilot_id";
          	$result_hours = mysql_query($query_hours);
       
          	if (mysql_numrows($result_hours) > 0) {
         	$time = mysql_result($result_hours,0,"duration_sum");
      	}

	/* Calculate distance */ 
		$query_dist = "SELECT (sum(t2.distance)) AS distance_sum FROM pilots t1, reports t2 WHERE t1.pilot_id=$id AND t1.pilot_id=t2.pilot_id";
          	$result_dist = mysql_query($query_dist);
       
          	if (mysql_numrows($result_dist) > 0) {
         	$dist = mysql_result($result_dist,"distance_sum");
      	}	

	/* Calculate poids */ 
		$query_poids = "SELECT (sum(t2.registration)) AS registration_sum FROM pilots t1, reports t2 WHERE t1.pilot_id=$id AND t1.pilot_id=t2.pilot_id";
          	$result_poids = mysql_query($query_poids);
       
          	if (mysql_numrows($result_poids) > 0) {
         	$poids = mysql_result($result_poids,"registration_sum");
      	}	
         	
	/* Calculate fuel */ 
		$query_fuel = "SELECT (sum(t2.fuel)) AS fuel_sum FROM pilots t1, reports t2 WHERE t1.pilot_id=$id AND t1.pilot_id=t2.pilot_id";
          	$result_fuel= mysql_query($query_fuel);
       
          	if (mysql_numrows($result_fuel) > 0) {
         	$fuel = mysql_result($result_fuel,"fuel_sum");
      	

	/* Calculate CA */ 
		
		
	}	

     		/* Display roster entries */
     		print "<tr>";
     		print "<td width=70 height=12 align=center><font face=Arial size=3 color=#FFFFFF> <a href=\"index.php?page=carnet$num\"> $num </a> </font></td>";
		print "<td width=90 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$name</font></td>";
     		print "<td width=110 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$time</font></td>";
     		print "<td width=70 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$poids</font></td>";
		print "<td width=70 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$dist</font></td>";
		print "<td width=80 height=12 align=center><font face=Arial size=2 color=#FFFFFF>$fuel</font></td>";
		print "<td width=110 height=12 align=right><font face=Arial size=2 color=#FFFFFF>$ca</font></td>" ;
		  
		print "</tr>";
			
		
	}
	
	print "</table>";
}


$query = "SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(reports.duration))) AS SUM_OF_duration FROM reports"; 

$result = mysql_query($query) or die('0');

$data = mysql_fetch_row($result);

$sum = $data[0];

print "<td bgcolor=#FFFFFF width=73 height=12 align=left><font face=Arial color=#FFFFFF size=3><b>TEMPS DE VOL TOTAL DE LA VA: </b></font></td>";
print "</tr>";
print "<td bgcolor=#FFFFFF width=73 height=12 align=right><font face=Arial size=4 color=#FFFFFF>$sum</font></td>";
print "</tr>";



/* Print table footer */
print "<table>";
print "<tr><td><font face=Arial size=2 color=#0000ff></font></td></tr>";
print "</table>";

/* Close the database connection */
mysql_close();
?><!-- end FSACARS Reports --></div>
	<br>

</body>


Et en voila le résultat escompté, en sachant que $ca ( est actuellement saisi manuellement dans la table avec phpmyadmin )

http://www.siberiavirtual.fr/cargo/inde ... age=roster
Cordialement

Kran
Invité n'ayant pas de compte PHPfrance

14 oct. 2009, 19:22

Rerere

Bon... dans le but de ne pas refaire n fois le boulot... pourrais tu me filer ta page qui tourne actuellement sur le site stp ?

Sinon, d'un manière générale, est-ce que tu comprends le principe des modifs que j'essaye de te faire introduire ou pas du tout (toutes les infos retournées par une seule requête, navigation dans les différents enregistrements retournés par la requête, etc...) ?

D'ailleur, soit dit en passant, ce n'est pas tellement un problème de PHP... tes principaux problèmes se situent au niveau de la compréhension de l'étendue des possibilités offertes par le SQL (plus quelques problèmes au niveau du HTML... mais bon, passons cela pour le moment...)