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à![]()
Partager