Aller au menu - Aller au contenu

Problème de variables

elles sont déclarées, mais PHP les trouves pas.

Pour accéder à cette section
Connectez-vous !
connexion_rpx

Offre d'emploi : Développeur Web PHP/Drupal (H/F)

Page 1 
Auteur Message
2 visiteurs sur ce sujet (2 anonymes)
Page 1 
Hors ligne mat' # Posté le 08/02/2012 à 20:43:34
vie veu l'pé ache pé
Avatar

Bonjour, bonsoir.

J'ai entrepris de créer un système de combats pour le jeu par navigateur que je suis entrain de développer.

Mais au moment d'essayer de lancer une attaque vers un autre "membre" inscrit, il me renvoie plein d’erreurs, comme quoi mes variables ne sont pas définies. Pourtant, il me met ces erreurs en indiquant qui ne sont pas les premières ligne dans les quelles le code est utilisé --' C'est pour le moins... étrange, à mon avis. Il doit y avoir une erreur de ma part (PHP ne se trompe jamais), mais j'ai beau relire le code, je ne trouve pas.
Je vais donc poster ce code, que j'ai commenté... peut être un peut trop, mais bon....

voici donc ce pas fameux code:

Secret (cliquez pour afficher)

Code : PHP
  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
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<!--By baby dragon-->
 <!-- Désolé si l'orthographe laisse beaucoup à désirer... mais bon... je fais ce que je peux. Je précise que certaines erreurs d'orthographe sont faites par commodité.-->
  
  <?php session_start();?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" />
<html>
 <head>
	
	<link rel = "stylesheet" href = "style.css"/>
	<title>Gestion de l'armée</title>
 
 </head>
 <body>
 	<div id="contenant_menu_haut">
		<?php  include("hautArmée.php"); ?>
		<?php include("resourcesHaut.php");?>
	</div>
	<?php include("menuLateral.php");?>

	<div id="corps">
	<?php
	if(isset($_SESSION['userid']))
	{?>
		<div  class="bloc">
			<h1> Lancer une ataque </h1>
				<?php
				if(isset($_POST['OK']))
				{
						//On récupére les données du post, si il existe, et on les met dans des variables
						//on sécurise le tout (c'est vraiment utile ou pas le htmlspecialchars et le trim?)
						$cible = htmlspecialchars(trim($_POST['cible']));//cible = personne à attaquer
						$unit1 = htmlspecialchars(trim($_POST['unite1']));//le nombre d'unité de chaque type. Pas encore donné de nom precis --'
						$unit2 = htmlspecialchars(trim($_POST['unite2']));
						$unit3 = htmlspecialchars(trim($_POST['unite3']));
						$unit4 = htmlspecialchars(trim($_POST['unite4']));
						$unit5 = htmlspecialchars(trim($_POST['unite5']));
						$unit6 = htmlspecialchars(trim($_POST['unite6']));
						
					try//connexion à la base de donnée
					{
						$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
						$bdd = new PDO('mysql:host=localhost;dbname=aorde', 'root', '',
						$pdo_options);
					}
					
					catch (Exception $e)
					{
						echo $e;
					}
					
					//On récupère l'armée de l’ennemi
					$req = $bdd->prepare('SELECT * FROM armée WHERE pseudo = :cible');
					$req->execute(array('cible'=>$cible));
					
					//et on la met dans des variables
					while($donnees = $req->fetch())
					{
						$unit1adv = $donnees['unite1'];//adv = adversaire
						$unit2adv = $donnees['unite2'];
						$unit3adv = $donnees['unite3'];
						$unit4adv = $donnees['unite4'];
						$unit5adv = $donnees['unite5'];
						$unit6adv = $donnees['unite6'];
						
					}
					
					/*
						On définit les caractéristiques de chaque usitées.
						J'ai hésité à les mettre dans un table, mais aurait demandé une table d'une de ces taille.......
					*/
					//on définit les carac des 6 usitées
					$unit1carac = array (
					'PV' => '5',
					'FR' => '3',
					'DF' => '1',
					'IN' => '1');
					
					$unit2carac = array (
					'PV' => '10',
					'FR' => '7',
					'DF' => '4',
					'IN' => '1');
					
					$unit3carac = array (
					'PV' => '15',
					'FR' => '12',
					'DF' => '9',
					'IN' => '1');
					
					$unit4carac = array (
					'PV' => '20',
					'FR' => '16',
					'DF' => '13',
					'IN' => '1');
					
					$unit5carac = array (
					'PV' => '25',
					'FR' => '22',
					'DF' => '19',
					'IN' => '1');
					
					$unit6carac = array (
					'PV' => '30',
					'FR' => '26',
					'DF' => '24',
					'IN' => '1');
					
					//je crée les variables qui serviront dans le "do{}while"
					$combat = 1;//la variable de condition pour la boucle
					$tour = 0;//un simple compteur
					
					do
					{
						$nbAtakants = $unit1 + $unit2 + $unit3 + $unit4 + $unit5 + $unit6;//on calcul le nombre d’unités en attaque à chaque round
						
						
						$nbDefenseurs = $unit1adv + $unit2adv + $unit3adv + $unit4adv + $unit5adv + $unit6adv;//idem pour la défense. Sur le test, seul l'armée du défenseur subis des dommages, ça permet de simplifier
						
						
						if($nbDefenseurs <= 0 || $nbAtakants <= 0)//si une des deux armée n'a plus de soldats, je casse la boucle
						{
							$combat = 0;
						}
						else//si non, j'affiche les unitées restantes dans chaque armée 
						{
							echo 'nombre d\'atakants restants: ' .$nbAtakants. '<br />nombre de defenseurs restants: ' .$nbDefenseurs. '<br />';
						}
						
						/*pour les combats, j'ai choisit de simplifier au maximum pour les tests, on cumule le total des points d’attaque de l'armée, on y enlève la défense et ensuit on soustrait la vie des défenseurs avec ce qu'il reste.*/
						//Fr = force
						$FrTtAtak = ($unite1 * $unit1carac['FR']) + ($unite2 * $unit2carac['FR']) + ($unite3 * $unit3carac['FR']) + ($unite4 * $unit4carac['FR']) + ($unite5 * $unit5carac['FR']) + ($unite6 * $unit6carac['FR']);
						
						$DefTtDef = ($unite1adv * $unit1Carac['DF']) + ($unite2adv * $unit2Carac['DF']) + ($unite3adv * $unit3Carac['DF']) + ($unite4adv * $unit4Carac['DF']) + ($unite5adv * $unit5Carac['DF']) + ($unite6adv * $unit6Carac['DF']);
						
						$VieTtDef = ($unite1adv * $unit1Carac['PV']) + ($unite2adv * $unit2Carac['PV']) + ($unite3adv * $unit3Carac['PV']) + ($unite4adv * $unit4Carac['PV']) + ($unite5adv * $unit5Carac['PV']) + ($unite6adv * $unit6Carac['PV']);
						
						//on affiche les valeurs de l’attaque, défense et vie des armées, histoire de vérifier leur valeurs (qui ne devrais pas être à zero.....)
						echo 'FRtt: ' .$FrTtAtak. '<br />DFtt: ' .$DefTtDef. '<br />PVtt: ' .$VieTtDef. '<br />';
						
						//on fait le calcul sur la vie
						$VieTtDef -= $FrTtAtak - $DefTtDef;
						
						echo 'VieTtDef: ' .$VieTtDef. '<br />';
						
						$tour++;
						
						echo 'Nombre de tours: ' .$tour. '';
						
						if($tour > 6)//si on à fait plus de 6 tours on arete le combat. C'est parceque j'ai pas encore fait que les unitées en defense peuvent mourrir donc ca ferait une boucle infinie --'
						{
							$combat = 0;
						}
						
					}while($combat != 0);
				/* une fois que le combat est terminé, on sors du while */
				}
				else
				{
				?>
			<p>
				<form method="post" action="#">
					<table>
						<tr>
							<td>
								Veuillez rentrer le pseudo de la personne à ataquer
							</td>
							<td>
								<input type="text" name="cible" />
							</td>
						</tr>
						<tr>
							<td>
								Le nombre d'unitée de type 1
							</td>
							<td>
								<input type="text" name="unite1" />
							</td>
						</tr>
						<tr>
							<td>
								Le nombre d'unitée de type 2
							</td>
							<td>
								<input type="text" name="unite2" />
							</td>
						</tr>
						<tr>
							<td>
								Le nombre d'unitée de type 3
							</td>
							<td>
								<input type="text" name="unite3" />
							</td>
						</tr>
						<tr>
							<td>
								Le nombre d'unitée de type 4
							</td>
							<td>
								<input type="text" name="unite4" />
							</td>
						</tr>
						<tr>
							<td>
								Le nombre d'unitée de type 5
							</td>
							<td>
								<input type="text" name="unite5" />
							</td>
						</tr>
						<tr>
							<td>
								Le nombre d'unitée de type 6
							</td>
							<td>
								<input type="text" name="unite6" />
							</td>
						</tr>
						<tr>
							<td>
								<input type="submit" name="OK" />
							<td>
						</tr>
					</table>
				</form>
			</p>
		</div>
	<?php	
		}
	}
	
	else
	{
		echo '<p class="bloc">Vous devez être connecté(e) pour pouvoir acceder à cette partie du site.</p>';
	}?>
	</div>

 </body>
</html>



maintenant, je vais vous donner un petit screen shoot de ma page:

Image utilisateur

dans cet exemple, il n'a fait qu'un tour, car je n'avait envoyé aucune unitée au combat....
Les deux seules opérations qui marchent sont l’incrémentation ($tour) et le nombre d’unités dans chaque camp.

Bien entendu, toute remarque (apars d'aller relire le cours) et la bien venue.

Merci de m’accorder un peu de votre temps (même si vous ne savez pas, laissez un petit message que je vois que quelqu'un est passé sioûplé)

edit: Euuuu je comprend pas comment on fait pour afficher une image --' je vais fouiller dans le site pour trouver^^
Édité le 08/02/2012 à 20:44:44 par mat'
Publicité # Posté le 08/02/2012 à 20:43:34

Hors ligne Belzebuth119 # Posté le 08/02/2012 à 21:19:24
Je suis un chat !
Avatar

Tu utilises des index du tableaux $_POST tel que $_POST['cible'] sans vérifier qu'elles sont bien été envoyer par le formulaire.

htmlspecialchars() seulement lors de l'affichage.

Change la valeur de l'attribut action de ton formulaire pour le nom de la page en cours.

Évite les accents dans les noms de tables/champs en SQL.

Tu dis a ton instance PDO d'envoyer une exception en cas d'erreur mais tu l'interceptes(catch) pas, c'est sur c'est pas nécessairement grave lors du débugage car elle vas arrêté le script et dire exception non attraper mais pense a modifier ton code pareil.

Ta aussi un problème quand tu boucles pour fetcher ta requêtes si elle retourne aucun enregistrement tes variables $unit*adv seront non définis.
Édité le 08/02/2012 à 21:25:41 par Belzebuth119
 
Hors ligne mat' # Posté le 09/02/2012 à 09:22:41
vie veu l'pé ache pé
Avatar

Merci pour ta réponse, j'ai corrigé toutes les erreurs dont tu m'a parlé, mais le problème persiste.... Je pense que je vais réécrire tout le code, en changeant deux trois trucs.... on sais jamais --'

Merci de m'avoir accordé de ton temps, ça fait plaisir d'avoir une réponse.
Hors ligne Infoxp # Posté le 09/02/2012 à 09:31:00
Infoxp à votre écoute :D
Avatar

Salut, ta boucle while ligne 57 ne sert à rien tans donné que l'utilisation de where pseudo devrai retourner qu'un seul résultat dans ton contexte (j'imagine)

Supprime la boucle en mettant seulement $donnees=$req->fetch();

Car tes variables sont déclarées seulement dans la boucle et non à l'extérieur (portée des variables)

vérifie également si un résultat est disponible avec $req->rowCount()
;)
Édité le 09/02/2012 à 09:38:41 par Infoxp

Nom d'un chien , les règles sa existe , aller les lire ... hop ... maintenant :lol:
Image utilisateur
 
Hors ligne mat' # Posté le 11/02/2012 à 14:13:30
vie veu l'pé ache pé
Avatar

héhéh, merci de prendre du temps, mais j'ai tout suprimé et tout réecrit. Ca marche.... enfin.... je ne sais pas comment faire les combats. Je fais des tests dans touts les sens mais j'arrive pas à faire autre chose que:

soit toutes les unitées de type 1 crèvent, ensuite les unitées de type 2, etc...
Soit une unitée de chaque type crève, jusqu'a ce que touts les degats aient étés absorbés.

J'ai pensé à une fonction de probabilitée, plus le typoe est élevé, plus elle est basse, mais je sais pas comment faire.

Si quelqu'un connait un tuto pour faire un algorythme de combat, je susi preuneur.

cordialement, merci de m'avoir accordé de votre temps.

Retour au forum "PHP" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx