update (mise à jour problème)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : update (mise à jour problème)

par furiouslol » 22 déc. 2008, 08:31

:wink:

par Nicost » 21 déc. 2008, 23:54

a oui completement, pfff j'en est encore des sueurs lol :D
J'y croyer plus du tout, je pensez que l'on avais beau chercher l'erreur, rien n'arriverai au résulta final.
Franchement merci, je suis impressionner des gens comme toi qui maitrise le code php a se point.
Encore merci !
Un petit post de remerciement

par furiouslol » 21 déc. 2008, 23:43

Bien battus :D

par Nicost » 21 déc. 2008, 23:40

Et franchement mille merci Furiouslol :wink:
Tout fonctionne, et merci et re merci :D
Trop content, depuis le temps que je me bagare avec se code :?
Enfin le résulta voulu est la :D

MERCI Furiouslol, tu ma fait un super cadeau de Noel :wink:

par furiouslol » 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']))      

par Nicost » 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

par furiouslol » 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

par Nicost » 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' ;

par furiouslol » 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 :)

par Nicost » 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

par furiouslol » 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>";

par Nicost » 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

par furiouslol » 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 ?

par Nicost » 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....

par furiouslol » 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: