Page 1 sur 3

update (mise à jour problème)

Posté : 17 déc. 2008, 16:20
par Nicost
Bonjour tous

J'en reviens à vous pour mon petit problème d'update bonus, score.

Et en effet des que je veux mettre à jour mes bonus et score, les bonus ne s'enregistre pas, le score lui oui.

Quand j'enregistre un nouveau score, bonus dans la table pas de problème.

Mais voila, le problème est au niveau de l'update score bonus.

Si une personne voudrait bien me venir en aide, merci d'avance...

$sql_old_score = 'SELECT Score, Bonus, Bonus2, Bonus3 FROM spouk_scores, users WHERE 
Jeu ="'.mysql_escape_string($game_name).'"  AND Utilisateur ="'.mysql_escape_string($user['id']).'"'; 
$req_old_score = mysql_query($sql_old_score) or die (mysql_error());  
 
if (mysql_num_rows($req_old_score) == 0) { 

   $sql_insert = 'INSERT INTO spouk_scores (Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3)
      VALUES ("'.mysql_escape_string($game_name).'", 
	   "'.mysql_escape_string($user['id']).'", 
	  "'.intval($score).'", 
	  "'.intval($bonu).'", 
	  "'.intval($bonu2).'", 
	  "'.intval($bonu3).'")'; 
   $req_insert = mysql_query($sql_insert) or die (mysql_error());  
}  

else 

{ 
   
   $old_data = mysql_fetch_assoc($req_old_score); 
 
   if ($old_data['Score'] <= $score) $test_score = true; else $test_score = false; 
   if ($old_data['Bonus'] <= $bonu) $test_bonu = true; else $test_bonu = false;
   if ($old_data['Bonus2'] <= $bonu) $test_bonu = true; else $test_bonu = false; 
   if ($old_data['Bonus3'] <= $bonu) $test_bonu = true; else $test_bonu = false; 
 
   if ($test_bonu || $test_score) { 
      $sql_update = 'UPDATE spouk_scores SET '; 
      if ($test_score && $test_bonu) $sql_update .= 'Bonus = "'.intval($bonu).'", 
Bonus2 = "'.intval($bonu2).'",
Bonus3 = "'.intval($bonu3).'",  
Score = "'.intval($score).'" '; 
	  
      elseif ($test_score && !$test_bonu) $sql_update .= 'Score = "'.intval($score).'" '; 
      elseif (!$test_score && $test_bonu) $sql_update .= 'Bonus = "'.intval($bonu).'" '; 
	  elseif (!$test_score && $test_bonu) $sql_update .= 'Bonus2 = "'.intval($bonu).'" ';
	  elseif (!$test_score && $test_bonu) $sql_update .= 'Bonus3 = "'.intval($bonu).'" ';
	  
      $sql_update .= 'WHERE Jeu = "'.mysql_escape_string($game_name).'" AND Utilisateur = "'.mysql_escape_string($user['id']).'"'; 
 
      $req_update = mysql_query($sql_update) or die (mysql_error()); 
   }  
}  

Posté : 17 déc. 2008, 22:47
par AB
Pour débugguer fait afficher tes requêtes, il est probable que tu trouveras le pb. Sinon c'est peut-être aussi que les champs que tu mentionnes sont erronés. http://www.phpfrance.com/forums/voir_sujet-19378.php

Posté : 17 déc. 2008, 23:10
par furiouslol
Salut

Et juste un petit truc pour simplifier ton code, l'instruction INSERT ON DUPLICATE KEY UPDATE convient bien a ce genre de cas

Code : Tout sélectionner

INSERT INTO table (ID,champ1, champ2, etc ... ) VALUES ( valeur1, valeur2, etc ...) ON DUPLICATE KEY UPDATE SET champ1=valeur1, champ2=valeur2, etc ... ;
Ca te permet d'essayer de faire un INSERT, ID représentant la clé primaire de ta table. Si cet ID n'existe pas en base, ca fait l'INSERT, si il existe , la requete va passer toute seule en UPDATE, dans ton cas ca te permettrait de remplacer tes trois requetes par une seule (plus besoin du select non plus)
Ca impose juste de bien manipuler les bons ID par rapport a ta table, je ne connais pas ton conceptuel, mais si ta clé primaire est formée des champs "jeu" et "utilisateur", tu les connais au début de ton scipt donc c'est bon

Posté : 18 déc. 2008, 01:08
par AB
Ca te permet d'essayer de faire un INSERT, ID représentant la clé primaire de ta table. Si cet ID existe deja en base, ca fait l'INSERT, si il existe pas, la requete va passer toute seule en UPDATE
Bonne initiative de mentionner ON DUPLICATE KEY UPDATE mais tu ne te serais pas un peu emmêler les pinceaux dans l'explication ?

Posté : 18 déc. 2008, 01:15
par furiouslol
:oops:
J'ai édité :lol:

Posté : 18 déc. 2008, 01:18
par Nicost
Merci de vos réponse :D je vais regarder tout cela de plus pres... ! Je vous tien au courant :wink:

Edit :

Bon, apres plusieur modification j'y avais cru lol, ça fonctionne si je ne mes pas le SET, enfin pas tout à fait, ça enregistre en double.
Donc j'ai remis le SET, malheureusement j'ai cette erreur :

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 'SET Score = "0", Bonus = "0", Bonus2 = "0", Bonus3 = "0"' at line 10

Et la je voi pas comment résoudre le problème, version du serveur :shock:
Je suis avec wamp 2.

Sinon ben voila le code, j'ai apporter les modification que vous m'avez dit :D
$sql_insert = 'INSERT INTO spouk_scores (Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3) 
VALUES (
"'.mysql_escape_string($game_name).'", 
"'.mysql_escape_string($user['id']).'", 
"'.intval($score).'", 
"'.intval($bonu).'", 
"'.intval($bonu2).'", 
"'.intval($bonu3).'")
ON DUPLICATE KEY UPDATE
SET
Score = "'.intval($score).'", 
Bonus = "'.intval($bonu).'",
Bonus2 = "'.intval($bonu2).'",
Bonus3 = "'.intval($bonu3).'"';
$sql_insert = mysql_query($sql_insert) or die (mysql_error()); 
Sinon dans la table sa commence par Id, Jeu etc.

Merci encore pour votre aide, je suis vraiment surpris du ON DUPLICATE KEY UPDATE c'est énorme :D

Posté : 19 déc. 2008, 02:59
par Nicost
Bonsoir tous !
Juste pour faire remonter mon post, j'ai chercher en même temps, mais je comprend pas l'erreur !
Merci de votre aide :wink:

Posté : 19 déc. 2008, 13:15
par furiouslol
Décidément ilo faut que je sois plus précis :oops:
Effectivemement y a pas de SET a mettre dasn cette requete, concentre toi sur le cas qui fait des doubles en nous precisant l'erreur, en affichant et en nous postant la requete comme AB te l'a suggéré et en nous postant la structure de ta table stp

Posté : 19 déc. 2008, 18:15
par Nicost
J'avais pas compris avec le SET, j'avais pourtant chercher... lol :D

Donc la clé primaire et la clé Id
Mais j'arrive pas a mettre à jour :?
car je ne trouve pas comment l'écrire.
Voila ma table :
Image

Code :
$sql_insert = 'INSERT INTO spouk_scores (as Id, Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3, Bonus4) 
VALUES (
"'.mysql_escape_string($game_name).'", 
"'.mysql_escape_string(user['id']).'", 
"'.intval($score).'", 
"'.intval($bonu).'", 
"'.intval($bonu2).'", 
"'.intval($bonu3).'", 
"'.intval($bonu4).'")
ON DUPLICATE KEY UPDATE
Score = "'.intval($score).'", 
Bonus = "'.intval($bonu).'",
Bonus2 = "'.intval($bonu2).'",
Bonus3 = "'.intval($bonu3).'",
Bonus4 = "'.intval($bonu4).'"';
$sql_insert = mysql_query($sql_insert) or die (mysql_error());   
Merci de votre aide encore une fois :wink:

Edit :
Oupela j'avais oublier mon as Id, mais bon ça n'arrange rien

Re Edit :
Apres une long journée, oui depuis que je suis lever je suis sur ce code lol

J'ai fait plusieur modif, rien a faire, quand cela ne veux pas et bien on peu pas zut !

Voila ma dernier modification (ça enregistre, mais ça ne mes pas a jour)
mysql_query('INSERT INTO spouk_scores (as Id, Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3) VALUES("'.mysql_escape_string($game_name).'", 
"'.mysql_escape_string($user['id']).'", 
"'.intval($score).'", 
"'.intval($bonu).'", 
"'.intval($bonu2).'", 
"'.intval($bonu3).'") ON DUPLICATE KEY UPDATE 
Id=Id,
Jeu = "'.intval($game_name).'", 
Utilisateur = "'.intval($user['id']).'", 
Score = "'.intval($score).'", 
Bonus = "'.intval($bonu).'",
Bonus2 = "'.intval($bonu2).'",
Bonus3 = "'.intval($bonu3).'"');
mysql_query or die (mysql_error());   

Posté : 20 déc. 2008, 11:15
par furiouslol
Alors si ta structure de table ressemble a ce :
CREATE TABLE `spouk_scores` (
`ID`
`champ1` ,
`champ2` ,
`champ3` ,
`champ4`
PRIMARY KEY (`ID`),
)
Le champ ID est donc ta clé primaire, ce qui signifie que la requete va se baser sur ce champ pour savoir si elle doit insérer ou updater, ce qui implique que tu dois connaitre l'ID avant de faire la requete, ce qui n'est peut etre pas ton cas surtout si c'est un auto-incrément

Apres je ne connais pas ton code, mais si c'est un formulaire dans lequel tu fais de l'ajout/Update, dans le cas de l'update tu as chargé l'enregistrement dnas ton formulaire et donc tu connais l'ID de l'enregistrement que tu traite, et donc ca marchera

L'autre solution si ca ne marche pas c'est de définir une clé unique dans ta table a partir d'autres champs, comme peut etre jeu/utilisateur. Si ce doublons d'information est forcément unique dans ta table, alors tu peux les définir comme clé unique et la requete réagira aussi en fonction de ca

Et sinon, encore une fois, affiche ta requete dans ton navigateur pour vérifier ce que tu génere, et poste le nous :)

Posté : 20 déc. 2008, 13:52
par Nicost
Merci de ta réponse et de ton aide furiouslol :wink:

Vu que je ne connais pas la clé d'avance pour l' ID, c'est un auto-incrément.

Donc j'ai refait une table sans le Id.

CREATE TABLE `spouk_scores` (
`Jeu`
`Utilisateur` ,
`Bonus` ,
`etc` ,
`etc`
PRIMARY KEY (`Utilisateur`),
)

J'ai donc mis pour la clé principal : Utilisateur.
Ensuite légere modif sur la requette.
Sa enregistre tout, ça mes à jour, mais en faite maintenant sa enleve se qui était déjà enregistrer, et remplace tout.
Ex :
Score de 148
Bonus, 2
etc

J'en fait une nouvelle :
Score plus bas : 130
Et plus de bonus : 5

Sa va donc donc enregistrer mon premier score 148 + mon bonus de 2.
Et quand je refait un nouveau, ça efface tout c'est donnez, et remplace par :
Score plus bas : 130
Et plus de bonus : 5
Au lieu de garder le 148.
Enfin bref sa me soul :cry:

Mon code :
if (!empty($_POST['game_name']))
{
$game_name =$_POST['game_name'];
}
if (!empty($_POST['score']))
{
$score = $_POST['score'];
}
if (!empty($_POST['bonu']))  
{  
$bonu = $_POST['bonu'];  
}  

if (!empty($_POST['bonu2']))  
{  
$bonu2= $_POST['bonu2'];  
}  

if (!empty($_POST['bonu3']))  
{  
$bonu3= $_POST['bonu3'];  
}  


$sql_insert = 'INSERT INTO spouk_scores (Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3, Bonus4, Bonus5) 
VALUES (
"'.mysql_escape_string($game_name).'", 
"'.mysql_escape_string($user['id']).'", 
"'.intval($score).'", 
"'.intval($bonu).'", 
"'.intval($bonu2).'", 
"'.intval($bonu3).'")
ON DUPLICATE KEY UPDATE
Score = "'.intval($score).'", 
Bonus = "'.intval($bonu).'",
Bonus2 = "'.intval($bonu2).'",
Bonus3 = "'.intval($bonu3).'",
Bonus4 = "'.intval($bonu4).'",
Bonus5 = "'.intval($bonu5).'"';
$sql_insert = mysql_query($sql_insert) or die (mysql_error());   

Posté : 20 déc. 2008, 23:02
par furiouslol
Oui si j'ai bein compris ton conceptuel ,c'est bien exactement ce que cette requete fait, elle prend un utilisateur et elle met a jour ses donnée en écrasant les anciennes. L'utilisateur est la clé primaire de ta table, il ne peut donc y avoir qu'une ligne par utilisateur

Maintenant c'est peut etre pas le comportement que tu veux pour ta base de donnée

Posté : 20 déc. 2008, 23:22
par Nicost
Oui voila le fonctionnement.
Peut importe que cela passe par l'id ou l'utilisateur, tant que cela enregistre correctement, je voi pas de souci.
Donc si ça fonctionne comme sa tant mieux, mais maintenant je suis larguer en faite, perdu dans le code...
Merci de ton aide :roll:

Posté : 21 déc. 2008, 08:49
par furiouslol
Oki la requete écrase bien les donnée ce qui est normal, mais ce n'est pas le comportement que tu voudrais, tu peux préciser ton probleme actuel alors ?

Posté : 21 déc. 2008, 14:05
par Nicost
Ouaip, j'enregistre un nouveau score de 20 et un bonus de 1 + un bonus3 de 2.
Dans mes champs de la table.
score : 20 / Bonus : 1 / Bonus2 : 0 / Bonus3 : 2 etc

J'en refait un nouveau, score de 10 et bonus de 4.
Dans mes champs de la table.
score : 20 / Bonus : 5 / Bonus2 : 0 / Bonus3 : 2 etc.

Les champs qui on déjà un chiffre ne change pas, si mon score est plus bas que le presendent, alors on garde le score plus haut, idem pour bonus, bonus2 etc.
:roll: