IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requete SQL donne resultat inatendu [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut Requete SQL donne resultat inatendu
    Bonjour les zamis

    pour les besoins d'un petit jeu que je cree, j'utilise 2 tables missions et unites_missions que voilà :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    CREATE TABLE `missions` (
     `id_mission` int(10) unsigned NOT NULL AUTO_INCREMENT,
     `id_joueur` int(10) unsigned NOT NULL,
     `lock1` mediumint(8) NOT NULL DEFAULT '0',
     `lock2` mediumint(8) NOT NULL DEFAULT '0',
     `type_mission` tinyint(3) unsigned NOT NULL,
     `id_joueur_mission` int(10) unsigned NOT NULL DEFAULT '0',
     `fantassin_masse_arme` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `fantassin_vouge` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `fantassin_fleau` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `fantassin_pique` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `fantassin_hallebarde` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `archer` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `archer_long` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `arbaletrier` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `cavalier_epee` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `arquebusier` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `date_attaque_start` int(10) unsigned NOT NULL DEFAULT '0',
     `date_attaque_arrivee` int(10) unsigned NOT NULL DEFAULT '0',
     `date_attaque_end` int(10) unsigned NOT NULL DEFAULT '0',
     `butin` varchar(500) DEFAULT NULL,
     PRIMARY KEY (`id_mission`),
     KEY `missions_ibfk_1` (`id_joueur`),
     CONSTRAINT `missions_ibfk_1` FOREIGN KEY (`id_joueur`) REFERENCES `joueurs` (`id_joueur`) ON DELETE CASCADE
    ) 
     
    CREATE TABLE `unites_mission` (
     `id_unite_mission` int(10) unsigned NOT NULL AUTO_INCREMENT,
     `id_joueur` int(10) unsigned NOT NULL,
     `fantassin_masse_arme` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `fantassin_vouge` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `fantassin_fleau` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `fantassin_pique` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `fantassin_hallebarde` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `archer` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `archer_long` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `arbaletrier` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `cavalier_epee` mediumint(8) unsigned NOT NULL DEFAULT '0',
     `arquebusier` mediumint(8) unsigned NOT NULL DEFAULT '0',
     PRIMARY KEY (`id_unite_mission`),
     KEY `id_joueur` (`id_joueur`),
     CONSTRAINT `unites_mission_ibfk_1` FOREIGN KEY (`id_joueur`) REFERENCES `joueurs` (`id_joueur`) ON DELETE CASCADE
    )


    Ces tables sont utilisées de la manière suivante : lorsque qu'un joueur attaque un autre joueur, un enregistrement est cree dans la table mission référencant le nombre d'unites que le joueur A (id_joueur) envoi sur le joueur B (id_joueur_mission). La table unites_mission est elle incrementées avec les valeurs des lignes de missions. Ainsi nous pouvons avoir n enregistrements pour un joueur dans mission mais 1 uniquement dans unites_missions.

    Exemple : je lance un archer sur un joueur ( ) missions.archer = 1 et unites_mission.archer=1 (si aucune autre mission en cours)
    Bref jusque là tout va bien mes tables se remplissent correctement.

    Lors du retour( time() > missions.date_attaque_end) une fonction php retour_missions est lancée afin de decrementer unites_missions et de supprimer la ligne dans missions correspondante.

    Voici le bout de fonction posant problème :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    function retour_missions($id_mission){
     
    //On recupère le butin eventuel
    $tableau_butin = $this->cree_butin($id_mission);
     
    //On recupère les infos de la mission
    $resultat = mysql_query('SELECT * FROM missions WHERE id_mission='.$id_mission);
     
    while($ligne = mysql_fetch_assoc($resultat))
    	foreach($ligne as $cle=>$valeur)
    		$missions[$cle] = $valeur;
     
    //On recupère les infos des unites en mission
    $resultat = mysql_query('SELECT * FROM unites_mission WHERE id_joueur='.$missions['id_joueur']);
     
    while($ligne = mysql_fetch_assoc($resultat))
    	foreach($ligne as $cle=>$valeur)
    		$unites_missions[$cle] = $valeur;
     
    //On enleve les unites rescapees de la bataille de la table unites_mission et on les rajoute a unites
    $requete = 'UPDATE unites_mission SET ';
     
    foreach($missions as $cle=>$valeur){
    	if(isset($unites_missions[$cle]) && $cle != 'id_joueur' && $valeur > 0)
    	$requete .= $cle.'='.$cle.'-'.$valeur.',';
    }
     
    $requete = substr($requete, 0,  -1).' ';
    $requete .= 'WHERE id_joueur='.$missions['id_joueur'];
    //echo $requete;
    mysql_query($requete);
     
    }

    Dans le cas evoqué ci dessus, cette fonction devrait décrémenter unites_mission d'1 archer or apres execution je ne me retrouve pas a 0 mais a 16 millions

    Pourtant echo $requete me donne

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE unites_mission SET archer=archer-1 WHERE id_joueur=17

    Donc la requete est bonne mais provoque un resultat inatendu et c'est bien elle qui est en cause car si je la commente je reste bien a 1 dans la table et si j'exécute cette requete sous phpmyadmin, je me retrouve bien a 0 et non pas a 16M...

    J'avoue que là je séche...

    Merci de m'aider si vous m'avez suivi jusque là

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Elle doit être appelée deux fois (séparément ou non, en concurrence ou non) et avec un champ unsigned, après 0, en décrémentant, on reprend à 16777216.

  3. #3
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Ouep c'est exactement ca je m'en suis aperçu tout à l'heure

    En fait, j'ai 3 div dont 2 rafraîchi automatiquement ou lors d'un clic sur un bouton de menu. Ces div appelle le meme constructeur qui appelle ma fonction d'ou le problème que tu as evoqué.

    Pas grave, je vais sortir l'appel de la fonction du constructeur et l'appeler manuellement.

    Merci à toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete sql données triées par mois
    Par italiano1360 dans le forum Zend_Db
    Réponses: 2
    Dernier message: 24/07/2012, 16h07
  2. [MySQL] requete sql gouper resultats par mois
    Par italiano1360 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/05/2012, 16h53
  3. Requete sql donnant un resultat croisé dynamique
    Par Brice Yao dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/07/2005, 10h38
  4. resultat requete SQL d'un select dans variable vb
    Par seb_06 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 11/10/2004, 16h29
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo