update (mise à jour problème)

Eléphant du PHP | 254 Messages

21 déc. 2008, 15:26

mmmmmm oui ok j'ai relu le post depuis le début j'avais zappé :)

Et bien pour gérer ca tu peux le faire en PHP, il te faut de toute facon comparer la nouvelle valeur avec l'ancienne, et en fonction du résultat, tu mets les valeurs qui vont bien

ancienne < nouvelle : tu mets la nouvelle
ancienne > nouvelle : tu mets lancienne

Ainsi ta requete INSERT UPDATE a toujours la meme gueule (plus facile a maintenir)

Bon ca implique effectivement de faire un select pour avoir les anciennes valeurs, et les comparer avec les nouvelles, venant des variables $_POST

Eléphant du PHP | 129 Messages

21 déc. 2008, 15:47

Ok, mais je voi pas comment ecrire ça.... :roll:

Eléphant du PHP | 254 Messages

21 déc. 2008, 17:24

Eh bien quelque chose comme ca pourrait faire l'affaire, c'est pas testé donc il y a peut etre (surement meme) des petites erreurs mais en gros ca devrait aller.
<?php
if (isset($user['id']) && $user['id']!="")
{
	// init des variables
	$game_name = "";
	$score=0;
	$bonu=0;
	$bonu2=0;
	$bonu3=0;
	$bonu4=0;
	$bonu5=0;
	
	// on cherche si ce user a deja quelque chose dans la base
	$Query = sprintf('SELECT Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3, Bonus4, Bonus5 
							FROM spouk_scores 
							WHERE Utilisateur='%s' ;'
							, $user['id']);
							
	$result = mysql_query($Query) or die (mysql_error()); 
	if ($OldScore = mysql_fetch_array($result) )
	{
		// Un enregistrement a ete trouve on est donc dans le cas d'un update
		if (!empty($_POST['game_name'])) 
		{ 
			$game_name =$_POST['game_name']; 
		} 
		if (!empty($_POST['score']) ) 
		{ 
			$score = ($_POST['score'] >= $OldScore["Score"] ? $_POST['score'] : $OldScore["Score"]) ;
		} 
		if (!empty($_POST['bonu']))   
		{   
			$bonu = ($_POST['bonu'] >= $OldScore["Bonus"] ? $_POST['bonu'] : $OldScore["Bonus"]) ;
		}   
		
		if (!empty($_POST['bonu2']))   
		{   
			$bonu2 = ($_POST['bonu2'] >= $OldScore["Bonus2"] ? $_POST['bonu2'] : $OldScore["Bonus2"]) ;
		}   
		
		if (!empty($_POST['bonu3']))   
		{   
			$bonu3 = ($_POST['bonu3'] >= $OldScore["Bonus3"] ? $_POST['bonu3'] : $OldScore["Bonus3"]) ;
		}   
	}
	else
	{
		// on est dans le cas d'un insert
		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'];
		}   
	}

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

} // End IF $user['id']

?> 
PS:
$score = ($_POST['score'] >= $OldScore["Score"] ? $_POST['score'] : $OldScore["Score"]) ;
Est équivalente en plus court a
if ($_POST['score'] >= $OldScore["Score"] )
{
	$score = $_POST['score'] ;
}
else
{
	$score = $OldScore["Score"];
}

Eléphant du PHP | 129 Messages

21 déc. 2008, 17:40

Je te remerci Furiouslol
Vais de suite essayer de comprendre tout le code, mais la a premiere vu y a un truc que je comprend pas.
Utilisateur='%s'

Je pense n'avoir jamais utliser de %s, du coup %s je voi pas à quoi cela correspond.
Merci en tout cas de ta patience et du temps que tu prend pour me venir en aide, super sympas, merci :wink:

Eléphant du PHP | 254 Messages

21 déc. 2008, 18:21

Pas de soucis pis je t'ai peut etre un peu embrouillé avec mes histoire de requete alors j'assume ^^

Oui le % c'est la syntaxe de sprintf(), que j'utilise de préférence quand je veux construire des chaine de caracteres qui comportent beaucoup de variables, ici une requete SQL, ca rend le code plus lisible je trouve, et donc plus facilement maintenable (et compréhensible)

Un exemple de sprintf
$mot = "world";
$chaine = sprintf ("Le mot contenu dans ma variable est : %s", $mot);
echo $chaine;

// ceci affiche "Le mot contenu dans ma variable est : world" a l'écran
il existe plusieurs sortes de %, ce sont des indication sur le formatage qu'on veut donner a la variable, en général on se sert de %s (s comme string), mais parfois on a besoi de formatter différement nos variables, comme par exemple pour un float qui contient beaucoup de chiffres apres la virgules, le %f permet par exemple de n'en afficher que 2 (mais la doc explique ca mieux que moi ^^)

D'ailleurs je viens de remarquer une erreur a ce sujet dans le code que je t'ai filé (je l'avais dit hein ^^)

remplace
    // requete fonctionnant dans tous les cas 
    $sql_insert = "INSERT INTO spouk_scores (Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3, Bonus4, Bonus5)   
                    VALUES ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) 
                    ON DUPLICATE KEY UPDATE  
                    Score = '%s',   
                    Bonus = '%s',   
                    Bonus2 = '%s',   
                    Bonus3 = '%s',   
                    Bonus4 = '%s',   
                    Bonus5 = '%s' " 
                    , mysql_escape_string($game_name) 
                    , mysql_escape_string($user['id']) 
                    , intval($score) 
                    , intval($bonu) 
                    , intval($bonu2) 
                    , intval($bonu3) 
                    , intval($bonu4) 
                    , intval($bonu5) 
                    , intval($score) 
                    , intval($bonu) 
                    , intval($bonu2) 
                    , intval($bonu3) 
                    , intval($bonu4) 
                    , intval($bonu5) 
                    ); 
par
	// requete fonctionnant dans tous les cas
	$sql_insert = sprintf ("INSERT INTO spouk_scores (Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3, Bonus4, Bonus5)  
							VALUES ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )
							ON DUPLICATE KEY UPDATE 
							Score = '%s',  
							Bonus = '%s',  
							Bonus2 = '%s',  
							Bonus3 = '%s',  
							Bonus4 = '%s',  
							Bonus5 = '%s' ;"
							, mysql_escape_string($game_name)
							, mysql_escape_string($user['id'])
							, intval($score)
							, intval($bonu)
							, intval($bonu2)
							, intval($bonu3)
							, intval($bonu4)
							, intval($bonu5)
							, intval($score)
							, intval($bonu)
							, intval($bonu2)
							, intval($bonu3)
							, intval($bonu4)
							, intval($bonu5)
							);
	
:roll:

Eléphant du PHP | 129 Messages

21 déc. 2008, 18:45

Ok je comprend mieux maintenant cette histoire de %s, merci :wink:
Vais faire des tests sur mes autres script avec le %s, il va mettre utile.

Sinon apres un test rapide et justement j'ai l'impression que le %s fait une erreur ou alors il est mal implanter.
 // on cherche si ce user a deja quelque chose dans la base 
    $Query = sprintf('SELECT Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3, Bonus4, Bonus5  
                            FROM spouk_scores  
                            WHERE Utilisateur='%s' ;' 
                            , $user['id']); 
L'erreur est au niveau : WHERE Utilisateur='%s' ;'

Erreur :
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in D:\wamp\www\bizarrestudio\sjspouk.php on line 22

Je les remplacer par :
WHERE Utilisateur="%s" ;'
Je test....

Edit:
Donc la, ça enregistre tout sans probleme.
Par contre ça na garde pas mes bonus.
Sa garde bien mon score, par exemple 52, ça enregistre bien mes bonus, par exemple : bonus de 2.
Et quand j'en refait un autre, si je fait un score plus haut, ça supp l'autre et le remplace, donc parfait, et si mon score est plus bas, ça ne touche plus a mon score, encore mieux.
De la sa le fait.
Mais des qu'il faut mettre a jour les bonus, ben ça enleve ceux qui son enregistrer, j'essai de trouver l'erreur....

Eléphant du PHP | 254 Messages

21 déc. 2008, 20:02

Euh en fait si j'ai du mal a te suivre c'est que j'ai lu
si mon score est plus bas que le presendent, alors on garde le score plus haut, idem pour bonus, bonus2
Et donc j'ai pensé que score et bonus suivaient la meme regle a savoir garder le plus grand mais quand je lis ca
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.
Tu additionne les bonus, tu ne garde pas le plus grand

Qu'en est il ?

Eléphant du PHP | 129 Messages

21 déc. 2008, 20:06

Oula ouai je me suis mal exprimer :oops:
Et donc j'ai pensé que score et bonus suivaient la meme regle a savoir garder le plus grand
C'est bien cela !
En faite se qui se passe, est que le score réagi bien à cette régle, mais les bonus non.
Si je fait un nouveau bonus, il va supprimer mes autres bonus.
Et mes le reste à 0, donc tout les autres bonus, sauf le score qui reste au score plus haut.

Petit exemple :

Score
50

Bonus
1

Bonus2
0

Bonus3
4

------------------------

Nouveau enregistrement
Dans cette parti j'ai fait par exemple que 45 en score et au niveau bonus3 par exemple que 2

Score
50
La il touche pas au score, donc parfait.

Bonus
0
Donc la il supprimer directement mon bonus que j'avais avant qui était : 1

Bonus2
0
Il laisse à zero, ok c'est bon vu qu'il n'y avais pas d'enregistrement.

Bonus3
2
Il enleve mon 4 que j'avais avant, et place le nouveau bonus 2, au lieu de mettre 6

Eléphant du PHP | 254 Messages

21 déc. 2008, 20:22

Tiens rajoute ceci aux endroits qui vont bien
        if (!empty($_POST['bonu4']))    
        {    
            $bonu4= $_POST['bonu4']; 
        }    

        if (!empty($_POST['bonu5']))    
        {    
            $bonu5 = $_POST['bonu5']; 
        }    
et
        if (!empty($_POST['bonu4']))    
        {    
            $bonu4 = ($_POST['bonu4'] >= $OldScore["Bonus4"] ? $_POST['bonu4'] : $OldScore["Bonus4"]) ; 
        }    
         
        if (!empty($_POST['bonu5']))    
        {    
            $bonu5 = ($_POST['bonu5] >= $OldScore["Bonus5"] ? $_POST['bonu5'] : $OldScore["Bonus5"]) ; 
        }    
Ensuite rajoute ceci apres la requete, et poste moi le résultat quand tu fais un update
echo "<br>POST";
print_r($_POST);
echo "<br>REQUETE : $sql_insert <br>";

Eléphant du PHP | 129 Messages

21 déc. 2008, 20:29

C'est se que j'avais mis depuis que tu avais mis ton code, j'y est donc penser lol :D

POSTArray ( [ropeArray] => NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN => 7 [platformspeed] => 0 [JUMPKEY] => 38 [CROUCHKEY] => 40 [RUNLEFTKEY] => 37 [RUNRIGHTKEY] => 39 [newArea] => [type Function] [onEnterFrame] => [type Function] [a] => 21 [orbs_onstage] => 16 [orbs_eaten] => 9 [orb_count] => 9 [orb_bonuP] => 1 [orb_bonuL] => 1 [ropeXPOS] => NaN [ropeYPOS] => NaN [nohit] => true [score] => 9 [bonu] => 1 [bonu2] => 1 [bonu3] => 0 [bonu4] => 0 [bonu5] => 0 [game_name] => spouk )
REQUETE : 1

Eléphant du PHP | 254 Messages

21 déc. 2008, 20:38

tu utilise deux fois la variable $sql_insert c'est pour ca que ca met REQUETE : 1, alors que ce que je veux c'est la requete elle meme

Change
	$sql_insert = mysql_query($sql_insert) or die (mysql_error()); 
par
	$sql= mysql_query($sql_insert) or die (mysql_error()); 
et recommence stp :)

Eléphant du PHP | 129 Messages

21 déc. 2008, 20:43

Zut Ok !! :D

Voila :

REQUETE : INSERT INTO spouk_scores (Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3, Bonus4, Bonus5) VALUES ( 'spouk', 'TesMan', '5', '0', '1', '0', '0', '0' ) ON DUPLICATE KEY UPDATE Score = '5', Bonus = '0', Bonus2 = '1', Bonus3 = '0', Bonus4 = '0', Bonus5 = '0' ;

Eléphant du PHP | 254 Messages

21 déc. 2008, 21:31

Ok je pense que c'est les tests avec empty qui clochent, genre lorsque tu update le bonus d'un user avec 0, ca passe pas le test, et donc la requete est exécutée avec un 0 la ou il y avait une valeur

Essaye de remplacer tes "!empty" par des "isset"

Pour info empty renvoie FALSE pour ces valeurs :
Retourne FALSE si var a une valeur non-vide et différente de zéro.
Ce qui suit est considéré comme étant vide :

* "" (une chaîne vide)
* 0 (0 en tant qu'entier)
* "0" (0 en tant que chaîne de caractères)
* NULL
* FALSE
* array() (un tableau vide)
* var $var; (une variable déclarée, mais sans valeur dans une classe)
Donc tu vois ton $_POST["bonu2"] par exemple, si tu l'as saisis comme égal a zéro, il sera considéré par le "empty" comme une valeur non-viable, et donc l'affectation de la variable $bonu2 n'est pas faite, ce qui fait qu'on reste avec bonu2=0 alors que l'ancienne valeur valait plus

Le isset quand a lui considere que 0 est bien valide

Plus de détail sur le empty ici : http://www.phpsources.org/function.empty.php

Eléphant du PHP | 129 Messages

21 déc. 2008, 22:03

Ok, j'ai fait un test, mais la ça enregistre plus les bonus.

Code :

if (isset($user["id"]) && $user["id"]!="") 
{ 
    // init des variables 
    $game_name = ""; 
    $score=0; 
    $bonu=0; 
    $bonu2=0; 
    $bonu3=0; 
    $bonu4=0; 
    $bonu5=0; 
     
    // on cherche si ce user a deja quelque chose dans la base 
    $Query = sprintf('SELECT Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3, Bonus4, Bonus5  
                            FROM spouk_scores  
                           WHERE Utilisateur="%s" ;'
                            , $user['id']); 
                             
    $result = mysql_query($Query) or die (mysql_error());  
    if ($OldScore = mysql_fetch_array($result) ) 
    { 
        // Un enregistrement a ete trouve on est donc dans le cas d'un update 
        if (!isset($_POST['game_name']))  
        {  
            $game_name =$_POST['game_name'];  
        }  
        if (!isset($_POST['score']) )  
        {  
            $score = ($_POST['score'] >= $OldScore["Score"] ? $_POST['score'] : $OldScore["Score"]) ; 
        }  
        if (!isset($_POST['bonu']) )    
        {    
            $bonu = ($_POST['bonu'] >= $OldScore["Bonus"] ? $_POST['bonu'] : $OldScore["Bonus"]) ; 
        }    
         
        if (!isset($_POST['bonu2']) )    
        {    
            $bonu2 = ($_POST['bonu2'] >= $OldScore["Bonus2"] ? $_POST['bonu2'] : $OldScore["Bonus2"]) ; 
        }    
         
        if (!isset($_POST['bonu3']) )    
        {    
            $bonu3 = ($_POST['bonu3'] >= $OldScore["Bonus3"] ? $_POST['bonu3'] : $OldScore["Bonus3"]) ; 
        }   
		 
		if (!isset($_POST['bonu4']))     
        {     
            $bonu4 = ($_POST['bonu4'] >= $OldScore["Bonus4"] ? $_POST['bonu4'] : $OldScore["Bonus4"]) ;  
        }     
          
        if (!isset($_POST['bonu5']))     
        {     
            $bonu5 = ($_POST['bonu5'] >= $OldScore["Bonus5"] ? $_POST['bonu5'] : $OldScore["Bonus5"]) ;  
        } 

    } 
    else 
    { 
        // on est dans le cas d'un insert 
        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']; 
        }  
		
		 if (!empty($_POST['bonu4']))     
        {     
            $bonu4= $_POST['bonu4'];  
        }     

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

    } 

   // requete fonctionnant dans tous les cas 
    $sql_insert = sprintf ("INSERT INTO spouk_scores (Jeu, Utilisateur, Score, Bonus, Bonus2, Bonus3, Bonus4, Bonus5)   
                            VALUES ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) 
                            ON DUPLICATE KEY UPDATE  
                            Score = '%s',   
                            Bonus = '%s',   
                            Bonus2 = '%s',   
                            Bonus3 = '%s',   
                            Bonus4 = '%s',   
                            Bonus5 = '%s' ;" 
                            , mysql_escape_string($game_name) 
                            , mysql_escape_string($user['id']) 
                            , intval($score) 
                            , intval($bonu) 
                            , intval($bonu2) 
                            , intval($bonu3) 
                            , intval($bonu4) 
                            , intval($bonu5) 
                            , intval($score) 
                            , intval($bonu) 
                            , intval($bonu2) 
                            , intval($bonu3) 
                            , intval($bonu4) 
                            , intval($bonu5) 
                            ); 

     
    $sql= mysql_query($sql_insert) or die (mysql_error()); 

} // End IF $user['id'] 

echo "<br>POST"; 
print_r($_POST); 
echo "<br>REQUETE : $sql_insert <br>"; 
echo "<br>TEST : $result <br>";

J'ai fait l'inverse sinon :
}
else
{
// on est dans le cas d'un insert
if (!isset($_POST['game_name']))
{
$game_name =$_POST['game_name'];
}
if (!isset($_POST['score']) )
{
$score = $_POST['score'];
etc...

Il y a peut être un problème dans les champs de ma table ?
Image

Eléphant du PHP | 254 Messages

21 déc. 2008, 23:28

Essaye de remplacer tes "!empty" par des "isset"
Il faut virer le !, et remplacer tous les empty

exemple :
        if (isset($_POST['bonu4']))