Update mysql, petit problème.

Bonjour, je suis en train de créer un jeu en php. Donc avec de la vie, de la mana, etc. Logiquement, quand on s'equipe d'un équipement, les stats sont ajoutés aux stats de base. Par exemple, l'equipement ajoute 5 en vie, la vie de base étant de 10, on doit additionner le tout et l'inscrire dans le champ vie de la DB. J'ai fait une fonction pour ca :
function addition($vie, $mana, $force, $vitesse, $defense)
{
$vie_base = mysql_query('SELECT vie FROM avatars WHERE pseudo=\''.$_SESSION['pseudo'].'\'');
$vie_array = mysql_fetch_array($vie_base);
$vie_update = $vie_array['vie'] + $vie;
mysql_query('UPDATE avatars SET vie='.$vie_update.'');

$mana_base = mysql_query('SELECT mana FROM avatars WHERE pseudo=\''.$_SESSION['pseudo'].'\'');
$mana_array = mysql_fetch_array($mana_base);
$mana_update = $mana_array['mana'] + $mana;
mysql_query('UPDATE avatars SET mana='.$mana_update.'');

$force_base = mysql_query('SELECT force FROM avatars WHERE pseudo=\''.$_SESSION['pseudo'].'\'');
$force_array = mysql_fetch_array($force_base);
$force_update = $force_array['force'] + $force;
mysql_query('UPDATE avatars SET force='.$force_update.'');

$vitesse_base = mysql_query('SELECT vitesse FROM avatars WHERE pseudo=\''.$_SESSION['pseudo'].'\'');
$vitesse_array = mysql_fetch_array($vitesse_base);
$vitesse_update = $vie_array['vitesse'] + $vitesse;
mysql_query('UPDATE avatars SET vitesse='.$vitesse_update.'');

$defense_base = mysql_query('SELECT defense FROM avatars WHERE pseudo=\''.$_SESSION['pseudo'].'\'');
$defense_array = mysql_fetch_array($defense_base);
$defense_update = $defense_array['defense'] + $defense;
mysql_query('UPDATE avatars SET defense='.$defense_update.'');
}

Mais, parce qu'il y en a toujours un, a chaque fois que l'on actualise la page, la fonction fait effet et donc, dans l'exemple précédent, les 5 points de vie sont toujours ajoutés. Donc les petits malins actualiseront toujours la page pour avoir des points de vie élevés.
Ma question c'est : Comment faire pour limiter l'action de la fonction update à une fois par équipement équipé ?

Un grand défi en somme ^^

Merci :)
Configuration: Windows Vista
Firefox 3.5.7

28 réponses

Résumé de la discussion

Le fil expose le problème d'un jeu PHP où l'équipement augmente les statistiques de base et que la mise à jour s'applique à chaque rafraîchissement de page, gonflant artificiellement les valeurs. Plusieurs propositions sont discutées, notamment l'utilisation d'une colonne indicatrice ou d'une table séparée pour tracer si l'effet a déjà été appliqué et éviter les réinjections. Des solutions variées sont évoquées, comme mettre à jour une entrée existante, détruire et recréer l'enregistrement, ou maintenir un champ état 0/1 lié à l'équipement actif. En cas de changement d'équipement, certaines approches préconisent de réinitialiser l'état ou de synchroniser les statistiques via une clé comprenant l'identifiant du personnage et l'ID de l'équipement.

Bobot (l’IA à votre service)
  1. miiiince je crois que j'ai fait "refuser" :x
    essaye de dire un truc
    1. théoriquement je suis connecté donc si tu me vois pas dis le moi
      c'est que j'utilise pas WLM
      1. tu veux bien venir sur msn ?
        tu prends mon pseudo et tu rajoutes hotmail.com
        1. @post 11 : non, c'est pas du tout ce qu'il faut faire...

          qu'est ce que tu ne comprend pas au juste dans ma méthode?
          1. Apparement il y a une erreur de syntaxe dans les requetes UPDATE.
            1. Réglé, j'avais marqué juste SELECT et pas SELECT COUNT

              EDIT : Il ne veut toujours pas Update :s
              1. Ba j'ai commencé mon idée à moi (Je ne comprenais pas trop la tienne, désolé).
                J'ai écris ca
                $test_carac_equip_brut = mysql_query('SELECT * FROM items_equip WHERE pseudo=\''.$_SESSION['pseudo'].'\'');
                $test_carac_equip = mysql_fetch_row($test_carac_equip_brut);
                $test_carac_equip_row = $test_carac_equip[0];
                $zero = 0;
                if ($test_carac_equip_row == 0)
                {
                $query_insert_casque = mysql_query("INSERT INTO items_equip VALUES('', '".$_SESSION['pseudo']."', '".$montre_casque_array['nom']."', '".$montre_casque_array['vie']."', '".$montre_casque_array['mana']."', '".$montre_casque_array['force']."', '".$montre_casque_array['vitesse']."', '".$montre_casque_array['defense']."', '".$zero."')") or die(mysql_error());
                
                $query_insert_torse = mysql_query("INSERT INTO items_equip VALUES('', '".$_SESSION['pseudo']."', '".$montre_torse_array['nom']."', '".$montre_torse_array['vie']."', '".$montre_torse_array['mana']."', '".$montre_torse_array['force']."', '".$montre_torse_array['vitesse']."', '".$montre_torse_array['defense']."', '".$zero."')");
                
                $query_insert_gant = mysql_query("INSERT INTO items_equip VALUES('', '".$_SESSION['pseudo']."', '".$montre_gant_array['nom']."', '".$montre_gant_array['vie']."', '".$montre_gant_array['mana']."', '".$montre_gant_array['force']."', '".$montre_gant_array['vitesse']."', '".$montre_gant_array['defense']."', '".$zero. "')");
                
                $query_insert_botte = mysql_query("INSERT INTO items_equip VALUES('', '".$_SESSION['pseudo']."', '".$montre_botte_array['nom']."', '".$montre_botte_array['vie']."', '".$montre_botte_array['mana']."', '".$montre_botte_array['force']."', '".$montre_botte_array['vitesse']."', '".$montre_botte_array['defense']."', '".$zero. "')");
                
                $query_insert_arme = mysql_query("INSERT INTO items_equip VALUES('', '".$_SESSION['pseudo']."', '".$montre_arme_array['nom']."', '".$montre_arme_array['vie']."', '".$montre_arme_array['mana']."', '".$montre_arme_array['force']."', '".$montre_arme_array['vitesse']."', '".$montre_arme_array['defense']."', '".$zero. "')");
                
                $query_insert_bouclier = mysql_query("INSERT INTO items_equip VALUES('', '".$_SESSION['pseudo']."', '".$montre_bouclier_array['nom']."', '".$montre_bouclier_array['vie']."', '".$montre_bouclier_array['mana']."', '".$montre_bouclier_array['force']."', '".$montre_bouclier_array['vitesse']."', '".$montre_bouclier_array['defense']."', '".$zero. "')");
                }
                else
                {
                $query_update_casque = mysql_query('UPDATE items_equip SET item='.$montre_casque_array['nom'].', vie='.$montre_casque_array['vie'].', mana='.$montre_casque_array['mana'].', force='.$montre_casque_array['force'].', vitesse='.$montre_casque_array['vitesse'].', defense='.$montre_casque_array['defense'].', equip='.$zero. ')');
                
                $query_update_torse = mysql_query('UPDATE items_equip SET item='.$montre_torse_array['nom'].', vie='.$montre_torse_array['vie'].', mana='.$montre_torse_array['mana'].', force='.$montre_torse_array['force'].', vitesse='.$montre_torse_array['vitesse'].', defense='.$montre_torse_array['defense'].', equip=' .$zero.')');
                
                $query_update_gant = mysql_query('UPDATE items_equip SET item='.$montre_gant_array['nom'].', vie='.$montre_gant_array['vie'].', mana='.$montre_gant_array['mana'].', force='.$montre_gant_array['force'].', vitesse='.$montre_gant_array['vitesse'].', defense='.$montre_gant_array['defense'].', equip='.$zero. ')');
                
                $query_update_botte = mysql_query('UPDATE items_equip SET item='.$montre_botte_array['nom'].', vie='.$montre_botte_array['vie'].', mana='.$montre_botte_array['mana'].', force='.$montre_botte_array['force'].', vitesse='.$montre_botte_array['vitesse'].', defense='.$montre_botte_array['defense'].', equip=' .$zero.')');
                
                $query_update_arme = mysql_query('UPDATE items_equip SET item='.$montre_arme_array['nom'].', vie='.$montre_arme_array['vie'].', mana='.$montre_arme_array['mana'].', force='.$montre_arme_array['force'].', vitesse='.$montre_arme_array['vitesse'].', defense='.$montre_arme_array['defense'].', equip=' .$zero.')');
                
                $query_update_bouclier = mysql_query('UPDATE items_equip SET item='.$montre_bouclier_array['nom'].', vie='.$montre_bouclier_array['vie'].', mana='.$montre_bouclier_array['mana'].', force='.$montre_bouclier_array['force'].', vitesse='.$montre_bouclier_array['vitesse'].', defense='.$montre_bouclier_array['defense'].', equip='.$zero. ')');
                }


                Et le problème c'est que ca ne veut pas marcher pour l'update. Ca marche parfaitement pour INSERT INTO mais pas pour Update, ca fait comme si ca n'existait pas :s
                Qu'est-ce qui ne vas pas ?
                1. c'est à toi d'implémenter la gestion de différents équipement
                  comme par exemple tu prend le tableau stocké puis tu le manipules de manière à ne retirer/ajouter que l'equipmt manipulé
                  1. Si on fait ta solution, il faut tout refaire pour les autres caractéristiques ?

                    Sinon j'avais pensé a un autre truc, plus simple :

                    On met dans une table le pseudo de l'utilisateur, le nom de l'arme et ses caractéristiques, on met aussi une colonne fonction qui contiendra 0 au départ (0 pour dire que la fonction n'a pas encore agit).
                    A la fin de la fonction additonne, on update la colonne fonction : 1 à la place de 0 (1 pour dire que la fonction a fait effet).
                    Quand un champ dont la colonne fonction contient 0, la fonction agit, si la colonne fonction vaut 1, la fonction additionne l'ignore.
                    Et quand l'utilisateur change d'équipement, l'ancienne entrée est détruite et une nouvelle apparait. Ca m'a l'air fesable mais je n'arrive pas a trouver comment faire pour dire à mysql "Quand cette variable (l'équipement) change, tu détruis l'entrée correspondant à son nom".
                    • 1
                    • 2