Page 1 sur 2

Probleme de requete

Posté : 03 juil. 2005, 19:13
par sebf
Bjs a tous :wink:

Voilà, je vais chercher dans une table toutes les infos d'un pilote, puis je les affiches.
Ce que je voudrais, c'est avoir l'ecart du temps de ce pilote par rapport au record sur le même circuit.

Voici mon code :
$requete = "SELECT date, user, circuit, auto, min, sec, mil, tot_mil, style, console, pays, valid FROM a_gt4 WHERE 'true' = 'true'";
if ($user2 != "all") {
   $requete .= " AND user='$user2' "; 
}
$requete .= " ORDER BY circuit ASC";
$result = $db->sql_query($requete);

if (mysql_num_rows($result) == 0)
    {
        //rien ds la base
    }
    else
    {
OpenTable();   // GT4
echo '<table border="0"><tr><td VALIGN=top><a href="modules.php?name=GT4"><img src="modules/Home/images/gt4.gif" border=0></a></td>';
echo '<td VALIGN=top><table CELLPADDING="1" CELLSPACING="1">';
echo '<tr><td></td><td></td><td><B>Pilote (circuit)</B></td><td><b>Voiture</b></td><td><B>Temps</B></td><td></td><tr>';
$a = 1;

// on fait une boucle qui va faire un tour pour chaque enregistrements
while($data = mysql_fetch_array($result))
    { 
// on affiche les informations de l'enregistrements en cours 
$data['valid'] = str_replace("0","<img src=\"modules/Home/images/non.gif\">",$data['valid']);
$data['valid'] = str_replace("1","<img src=\"modules/Home/images/ok.gif\">",$data['valid']);
$data['pays'] = str_replace("France","<img src=\"images/championnat/fra.gif\" width=13>",$data['pays']);
$data['pays'] = str_replace("Belgique","<img src=\"images/championnat/bel.gif\" width=13>",$data['pays']);
$data['pays'] = str_replace("Canada","<img src=\"images/championnat/can.gif\" width=13>",$data['pays']);
$data['pays'] = str_replace("Suisse","<img src=\"images/championnat/sui.gif\" width=13>",$data['pays']);
$data['console'] = str_replace("PS2","<img src=\"images/championnat/icon_ps2.gif\">",$data['console']);
$b = $a++;
    echo "<tr><td><B>$b</B>. </td>";
$resultb = $db->sql_query("SELECT tot_mil FROM a_gt4 WHERE circuit=$data['circuit'] order BY tot_mil ASC LIMIT 1");
$datab = mysql_fetch_array($resultb);

    echo '<td></td><td>'.$data['user'].' '.$data['pays'].' ( '.$data['circuit'].' )</td><td>'.$data['auto'].'</td><td>'.$data['min'].'\''.$data['sec'].'"'.$data['mil'].'</td>';
    echo '<td>'.$data['valid'].'</td><td>'.$data['console'].'</td>';
$ecart = sprintf("%1.3f", ((($data['tot_mil'] - $datab['tot_mil'])/1000)));
$ecart = str_replace(".", "\"", $ecart);

	echo "<td><b>+ $ecart</b></td><tr>";
    }

echo '</table></td></tr></table>';
le probleme vient de :
$resultb = $db->sql_query("SELECT tot_mil FROM a_gt4 WHERE circuit=$data['circuit'] order BY tot_mil ASC LIMIT 1");
car sans cette requette, tout marche bien (sauf que j'ai pas l'eccart de temps)

QQ a une idée :wink:
Merci d'avance :)

Posté : 03 juil. 2005, 19:31
par ouckileou
déjà, sépare les variables de la chaine :
$requete = "SELECT tot_mil FROM a_gt4 WHERE circuit=".$data['circuit']." order BY tot_mil ASC LIMIT 1";
$resultb = $db->sql_query($requete);
ensuite, fais afficher les erreurs SQL avec mysql_error() ou fais afficher ta requête et exécute la directement dans phpMyAdmin par exemple

ça te donnera une idée sur le problème

Posté : 03 juil. 2005, 20:01
par sebf
Merci de ton aide

J'ai séparé comme tu me l'as dit

Ensuite, j'ai lancé ma requete sur phpmyadmin, mais là, ca bug

Code : Tout sélectionner

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '$requete = "SELECT tot_mil FROM a_gt4 WHERE circuit=".$data['ci

Posté : 03 juil. 2005, 20:16
par ouckileou
là tu as pris le code de ta requête dans ton script PHP, donc il y a le code la variable, et non sa valeur

je te disais moi de faire afficher ta requête générée par PHP, comme ceci :
$requete = "SELECT tot_mil FROM a_gt4 WHERE circuit=".$data['circuit']." order BY tot_mil ASC LIMIT 1"; 
echo "requête qui va être exécutée : ".$requete;
et tu envoies dans phpMyAdmin le code SQL qui sera affiché dans ta page
tu auras donc l'erreur SQL générée qui te mettra sur la voie, a priori une erreur de syntaxe vu ce que je vois ;)

Posté : 03 juil. 2005, 20:22
par sebf
Dès fois, je suis vraimant un boulet ....... :oops:

Ok, j'ai fais comme tu m'as dis
La requette me donne ca :
SELECT tot_mil FROM a_gt4 WHERE circuit= order BY tot_mil ASC LIMIT 1
Donc, c'est bien ce qui me s'emblait, ca vient de la recuperation du circuit.
Mais par contre, je ne vois vraiment pas comment faire .......
:?

Posté : 03 juil. 2005, 20:41
par pjl
Ceci
$data['pays'] = str_replace("France","<img src=\"images/championnat/fra.gif\" width=13>",$data['pays']);
$data['pays'] = str_replace("Belgique","<img src=\"images/championnat/bel.gif\" width=13>",$data['pays']);
$data['pays'] = str_replace("Canada","<img src=\"images/championnat/can.gif\" width=13>",$data['pays']);
$data['pays'] = str_replace("Suisse","<img src=\"images/championnat/sui.gif\" width=13>",$data['pays']); 
devrait être géré par la base de données.
Si demain tu dois rajouter un pays, tu n'es pas censé devoir retoucher à ton code.

Ensuite, pour ton pb, tu dois pouvoir faire celà avec une seule requete en utilisant les jointures.

Posté : 03 juil. 2005, 21:12
par sebf
Ensuite, pour ton pb, tu dois pouvoir faire celà avec une seule requete en utilisant les jointures.
Alors là, j'sais pas faire ca moi en une requette.

Posté : 03 juil. 2005, 21:15
par ouckileou
Voilà, je vais chercher dans une table toutes les infos d'un pilote, puis je les affiches.
Ce que je voudrais, c'est avoir l'ecart du temps de ce pilote par rapport au record sur le même circuit.
je ne sais pas où est stocké le record du circuit, mais il te suffit de faire une jointure entre la table avec les infos du pilote et les infos du circuit, et de faire un petit calcul

par contre j'aimerais bien voir ta structure de base (pour les tables concernées) pour pouvoir t'aider, et car il semble y avoir des trucs bizarres

Posté : 03 juil. 2005, 21:20
par sebf
CREATE TABLE `a_gt4` (
  `id` int(11) NOT NULL auto_increment,
  `date` datetime NOT NULL default '0000-00-00 00:00:00',
  `user` varchar(30) NOT NULL default '',
  `circuit` varchar(40) NOT NULL default '',
  `auto` varchar(40) NOT NULL default '',
  `min` int(1) NOT NULL default '0',
  `sec` char(2) NOT NULL default '',
  `mil` char(3) NOT NULL default '',
  `tot_mil` int(10) NOT NULL default '0',
  `style` varchar(15) NOT NULL default '',
  `console` varchar(4) NOT NULL default '',
  `pays` varchar(20) NOT NULL default '',
  `valid` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=102 ;
INSERT INTO `a_gt4` VALUES (1, '2005-03-31 18:54:49', 'sebf', 'Fuji Speedway 90', 'Mitsubishi FTO GPX 97', 1, '47', '701', 107701, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (2, '2005-03-31 21:20:23', 'o0_sapaya_0o', 'Fuji Speedway 90', 'Mitsubishi FTO GPX 97', 1, '46', '915', 106915, 'Pad', 'PS2', 'Belgique', 1);
INSERT INTO `a_gt4` VALUES (33, '2005-04-20 14:07:23', 'centurio62', 'Monteigi Super Speedway', 'Mitsubishi 3000GT VR4 Turbo 95', 0, '42', '722', 42722, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (4, '2005-03-23 18:01:05', 'seatracing', 'Fuji Speedway 90', 'Mitsubishi FTO GPX 97', 1, '46', '54', 106054, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (5, '2005-03-23 08:21:44', 'Vroooum', 'Fuji Speedway 90', 'Mitsubishi FTO GPX 97', 1, '48', '644', 108644, 'Volant', 'PS2', 'Suisse', 1);
INSERT INTO `a_gt4` VALUES (6, '2005-03-29 22:43:56', 'bruce', 'Fuji Speedway 90', 'Mitsubishi FTO GPX 97', 1, '47', '722', 107722, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (7, '2005-03-22 16:07:41', 'drgg77', 'Fuji Speedway 90', 'Mitsubishi FTO GPX 97', 1, '50', '868', 110868, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (8, '2005-03-29 15:44:15', 'dup', 'Fuji Speedway 90', 'Mitsubishi FTO GPX 97', 1, '47', '9', 107009, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (9, '2005-04-06 11:49:44', 'sebf', 'Autumn Ring Mini inv', 'Nissan Skylin GTR 93', 0, '33', '869', 33869, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (10, '2005-04-07 22:58:14', 'drgg77', 'Autumn Ring Mini inv', 'Nissan Skylin GTR 93', 0, '33', '90', 33090, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (11, '2005-04-08 18:10:29', 'seatracing', 'Autumn Ring Mini inv', 'Nissan Skylin GTR 93', 0, '32', '553', 32553, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (12, '2005-04-09 22:44:12', 'dup', 'Autumn Ring Mini inv', 'Nissan Skylin GTR 93', 0, '32', '538', 32538, 'Pad', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (13, '2005-04-05 20:23:01', 'o0_sapaya_0o', 'Autumn Ring Mini inv', 'Nissan Skylin GTR 93', 0, '33', '28', 33028, 'Pad', 'PS2', 'Belgique', 1);
INSERT INTO `a_gt4` VALUES (14, '2005-04-06 11:22:18', 'KINGBOUCHOUM', 'Autumn Ring Mini inv', 'Nissan Skylin GTR 93', 0, '32', '444', 32444, 'Volant', 'PS2', 'France', 1);
INSERT INTO `a_gt4` VALUES (15, '2005-04-03 14:15:13', 'mad1723', 'Autumn Ring Mini inv', 'Nissan Skylin GTR 93', 0, '33', '008', 33008, 'Pad', 'PS2', 'Canada', 1);
INSERT INTO `a_gt4` VALUES (16, '2005-04-04 23:05:44', 'bruce', 'Autumn Ring Mini inv', 'Nissan Skylin GTR 93', 0, '33', '31', 33031, 'Pad', 'PS2', 'France', 1);

.......................................;;
Voilà, donc, j'affiche les temps du pilote mad1723 et je voudrais savoir a combien il est du record sur ce circuit.

Posté : 03 juil. 2005, 21:22
par ouckileou
et le record du circuit il est où ?

je trouve déjà peu pratique le fait que tu ais stocké dans cette table le nom du circuit

tu devrais plutôt avoir un table "Circuits" avec "id_circuit" et "nom_circuit"
et chaque ligne de "a_gt4" (ça correspond à quoi ce nom ??) contiendrai seulement l'identifiant du circuit

Posté : 03 juil. 2005, 21:29
par sebf
Alors, j'ai tous mis dans une seule table (qui se nomme a_gt4) car j'ai plus de 30 jeux et donc, je ne voulais pas avoir trop de table dans ma DB ...

Le record est le temps le plus bas de tel circuit
Je le prends comme ca :
$result1 = $db->sql_query("SELECT tot_mil, valid FROM a_gt4 WHERE circuit='$circuit' order BY tot_mil ASC LIMIT 1");

Posté : 03 juil. 2005, 21:34
par ouckileou
Alors, j'ai tous mis dans une seule table (qui se nomme a_gt4) car j'ai plus de 30 jeux et donc, je ne voulais pas avoir trop de table dans ma DB ...
sans vouloir critiquer c'est pas très malin ;)

pour avoir ton record :
- soit tu fais une premire reqiête pour récupérer ce record tu le stockes et tu fais un calcul en PHP ensuite (ce que tu as du faire)
- soit tu fais une sous-requête si tu as MySQL 4

car je crois que ce à quoi pensait pjl va être difficilement réalisable vu que tout est dans une seule table

Posté : 03 juil. 2005, 23:08
par sebf
pour avoir ton record :
- soit tu fais une premire reqiête pour récupérer ce record tu le stockes et tu fais un calcul en PHP ensuite (ce que tu as du faire)
- soit tu fais une sous-requête si tu as MySQL 4

car je crois que ce à quoi pensait pjl va être difficilement réalisable vu que tout est dans une seule table
C'est pas ce que je fais ?
Regarde le code sur mon 1er message
Je recupere le meilleur tps puis je fais le calcul
$ecart = sprintf("%1.3f", ((($data['tot_mil'] - $datab['tot_mil'])/1000)));
$ecart = str_replace(".", """, $ecart);

    echo "<td><b>+ $ecart</b></td><tr>";
Le probleme est de recupere le bon tps du bon circuit, et c'est là que je n'y arrive pas ....

Posté : 03 juil. 2005, 23:22
par ouckileou
j'avais écris "ce que tu as du faire"

tu aurais une table circuit, dans laquelle tu stockerai le record, ce serait beaucoup plus simple

maintenant avec ce que tu as...
je ne vois que ça effectivement,
pour chaque ligne de résultat renvoyée par la première requête, tu récupères le circuit, et tu exécutes la deuxième avec ce circuit

donc si j'ai bien compris c'est ce que tu fais
quand tu as affiché ta requête, tu as vu que la variable n'était pas présente dans la requête
est-ce que tu es sûr que ta requête 1 s'exécute bien ?
est-ce que tu récupères les autres valeurs ?
teste la comme pour la deuxième, en affichant le code et tout

Posté : 04 juil. 2005, 00:01
par sebf
oui, ma 1er requette marche bien

le seul probleme , c'est de recuperer le circuit pour la requette 2
J'ai beau tout essayer, j'y arrive pas ..... et j'en perd mon latin là :oops: :cry:

Pour ma 1er requette, j'obtient bien un truc comme ca par pilote :

Code : Tout sélectionner

1. KINGBOUCHOUM ( Autumn Ring Mini inv ) Nissan Skylin GTR 93 0'32"444 + 32"444 2. KINGBOUCHOUM ( Clubman Stage Route 5 ) ASL Garaiya 02 0'54"012 + 54"012 3. KINGBOUCHOUM ( Deep Forest Raceway ) Holden Monaro CV8 04 1'17"587 + 77"587 4. KINGBOUCHOUM ( Grand Valley est ) Honda City Turbo II 83 1'21"616 + 81"616 5. KINGBOUCHOUM ( Monteigi Super Speedway ) Mitsubishi 3000GT VR4 Turbo 95 0'39"597 + 39"597 6. KINGBOUCHOUM ( Opera de Paris ) Toyota Celica XX 2800GT 81 1'33"346 + 93"346 7. KINGBOUCHOUM ( Suzuka ) TVR T350C 03 2'08"696 + 128"696
Le seul hic, comme on le voit en fin, c'est l'ecard
Il est calculé avec un tps de reference de 0 car il ne la trouve pas .....

pfffffffffffffffffffffff :cry: :cry: :cry: :cry: