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à