Problème de requête sql
le 08/03/2007 à 17:06
sparh
Salut,
j'essai de mettre au point un système qui ajoute et retire des points à mes membres quand ils entrent des scores à des jeux.
<?php
//(...)
//on récupere le pseudo de tous ceux qui on soit record, soit le 2nd, soit le 3ème score
$pseudos=mysql_query("SELECT pseudo,jeu,score FROM Record WHERE ( ((score='$scoreA')
OR (score='$scoreB') OR (score='$scoreC')) AND (jeu='$Jeu') )")or die("erreur points en moins");
//on me les resultat en boucle
//et on enleve un point à ceux qui ont perdu le record
print("Vous êtes premier Vous avez été crédité de 3 points<br>
Mais surtout vous enlevez un point à <br>au moins 3 personnes<br>
Sauf si vous entrez le 1er score du jeu ;) ...<br>
on enlève des points à");
while($res=mysql_fetch_array($pseudos))
{
print("$res[pseudo] - $res[score] ");
// j'ai ajouté cette ligne pour vérifier que la requète $pseudos a bien fonctionné
//ensuite si dessous je retire les points
$recordM2= 'UPDATE membre SET record=record-1 WHERE pseudo="'.$res['pseudo'].'"';
mysql_query($recordM2) or die('Erreur SQL !'.$recordM2.''.mysql_error());
}
//(...)
?>
Les variables $scoreA (B et C) sont des nombres pouvant aller jusqu'à 3 décimales ( float(14,3) )
Voilà mon problème: parfois ca marche, parfois pas! A priori ca bug quand $scoreA (ou B ou C) à plus de une décimale.
Sauriez vous m'aider à résoudre le problème??
Merci d'avance
ps: les 3 variables $score (A, B et C) correspondent aux 3 meilleurs scores atteints sur un jeu précis et que je récupère un plus haut dans le script (j'ai vérifié, il n'y a pas de problème à ce niveau là)
si c'est un pb de décimal je pencherai poru le fait que ta variable PHP contient par ex 3 decimale et ton champ MYSQL n'en contient que 2, dc c'est pas égale.
Essaie déjà de voir ça.
++
le 08/03/2007 à 18:50
sparh
Salut et merci ;)
je viens de vérifier et non ca ne vien pas de ca!
La valeur de score est enregistrée dans une colonne de type float(14,3) donc tous les chiffres enregistrés ont 3 décimales.
J'ai galéré pour trouver quand le bug arrivait. C'est très bisarre ca n'arrive que pour les chiffres à 2 ou 3 décimales (en fait ils sont tous à 3 décimales: ex: ca marche pour 3.000 jusqu'à 3.900 mais à partir de 3.110 et jusqu'à 3.999 la requête ne s'arrète!?!
le 09/03/2007 à 12:20
sparh
Salut,
j'ai fait de nombreux, test, recherches, notamment dans la documentation de mysql 5...
Et rien à faire je ne trouve pas la source du problème.
J'ai essayé:
<?php
//on récupere le pseudo de tous ceux qui on le record
$pseudos=mysql_query("SELECT pseudo,jeu,score FROM Record WHERE jeu='$Jeu' AND score<='$score'");
//ou encore
$pseudos=mysql_query("SELECT pseudo,jeu,score FROM Record WHERE jeu='$Jeu' AND score='$score'");
?>
Dans les 2 cas c'est pareil si score est un chiffre à 2 ou 3 décimales rien ne sort
(enfin dans le 1er cas tous les chiffre inférieurs à la valeur de $score sorte sauf celui qui est égal à score!)
(dans le second cas rien ne sort)
Si score est un chiffre à une décimale --> parfois ça marche parfois pas!!! (apparemment ça marche une fois et après ça bloque)
Si score est un chiffre sans décimale --> ok
Le champ score est de type FLOAT(14,3) donc tous mes chiffres sont de type X.000 quand je dit sans décimale c'est XX.000 avec une décimale c'est XX.X00 avec deux décimales c'est XX.XX0 et trois XX.XXX
(de toute façon dans le manuel mysql 5 ils disent que 5.1=5.100=5.10 ou 5.=5=5.0=5.00=5.00 )
Voilà je pense vous avoir donné tous les éléments pour que vous puissiez m'aider
Merci d'avance
le 09/03/2007 à 13:31
i M@N
Hello.
Essaye comme ça pour voir :
<?php
/*(...)*/
/*on récupere le pseudo de tous ceux qui on soit record, soit le 2nd, soit le 3ème score*/
/*préparation de la requête*/
$sql = 'SELECT pseudo,jeu,score FROM Record WHERE ( ((score='$scoreA') OR (score='$scoreB') OR (score='$scoreC')) AND (jeu='$Jeu') )';
/*on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)*/
$res = mysql_query($sql) or die('erreur points en moins'.$sql.''.mysql_error());
/*on me les resultat en boucle
et on enleve un point à ceux qui ont perdu le record*/
echo 'Vous êtes premier Vous avez été crédité de 3 points
Mais surtout vous enlevez un point à au moins 3 personnes
Sauf si vous entrez le 1er score du jeu ;) ...
on enlève des points à';
while ($res = mysql_fetch_array($req)) {
/*on récupère les valeurs qui nous intéressent*/
$pseudo = $res['pseudo'];
$score = $res['score'];
echo $pseudo.' - '.$score.' ';
/*j'ai ajouté cette ligne pour vérifier que la requète $pseudos a bien fonctionné
ensuite si dessous je retire les points*/
$recordM2= 'UPDATE membre SET record=record-1.000 WHERE pseudo="'.$pseudo.'"';
mysql_query($recordM2) or die('Erreur SQL !'.$recordM2.''.mysql_error());
}
/*(...)*/
?>
@+...
One Love, One Heart, One Unity.
le 09/03/2007 à 15:45
sparh
Ok merci c'est déjà plu propre...
En fait mon 1er script et celui que tu propose marchent... mais pas tous le temps! Ce qui pose problème c'est la 1ère requête:
voici une plus simple mais qui pose le même problème:
<?php
$sql="SELECT pseudo,jeu,score FROM Record WHERE jeu='$Jeu' AND score='$scoreC'";
?>
Ca marche pour tous les nombres de type XXXX.000 (X= n'importe quel chiffre), mais des que l'on passe à des chiffres de type XXX.X00 ou XXX.XX0 ou XXX.XXX ca pose problème (de façon aléatoire)???
J'ai fait un echo $scoreC ; juste avant la requête et j'ai comparé à l'enregistrement dans la table, ils sont bien identiques??
Voilà, merci d'avance pour votre aide.
le 09/03/2007 à 17:08
i M@N
Reuh ...
Sbizarre ton truc quand même ... p'tet que tu en demandes trop à la fois et que tu devrais essayer de faire la même chose en plusieurs étapes. Mais bon ché pas c'est assez étrange en effet ...
@+...
One Love, One Heart, One Unity.
le 09/03/2007 à 17:46
sparh
c bon (1 semaine que je galère) en fait j'ai changé le type de champs de FLOAT(14,3) à DECIMAL(14,3) (je savais pas qu'on pouvais mettre des trucs derrière DECIMAL)
Merci en tous cas
++
ah oui j'avais lu un truc là dessus des diff entre decimal et float, j'y avais pensé mais je voyais pas le rapport avec ton truc. Le problème m'était arrivé mais c'était sur des fonction de moyenne de valeurs.
le problème vient du fait de l'architecture du PC si je me souviens bien, c'était un truc comme ça. Ce qui fait que le float est "arrondi" et qu'il n'affiche pas exactement sa valeur.
je vais essayer de retrouver l'article pour le mettre ici.
++
voilà retrouvé un truc qui était intéressant,
http://dev.mysql.com/doc/refman/5.0/fr/problems-with-float.html
++