Bonjour, Bonsoir,
Je voudrais une aide sur un code PHP via la méthode POO d'un TP qui s'appelle : Mini Jeu Combat.
(PS : je précise que je suis en Formation d'apprentissage de Développeur Web)
Le problème se situe sur le non-comptage de nombre de personnages créés après avoir écrit
un nom/pseudo créé soi-même PUIS cliqué sur le bouton d'envoi "créer le personnage".
Voici un screen du navigateur web (AVANT création de perso) :
Screen pendant la création du perso :
Et, normalement, la phrase "Nombre de personnages crées : " devrait afficher
(screen différent des deux premiers screens CAR code PHP via la méthode POO DIFFERENT des deux premiers screens) :
Je vous donne la Base De Donnees "poo" avec sa Table "Combattants" (serveur en local)
Plus de precisions de la table "Combattants" (SI vous voulez tester le code php ci-dessous)
(serveur en local)
Voici le code PHP via la méthode POO correspondant aux deux premiers screens
composé de TROIS fichiers php :
Fichier "tp_combat.php" contenant la class "Combattant"
Fichier "tp_combat_manager.php" contenant la class "CombattantsManager"
Code : 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
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
241
242
243
244
245
246
247
248 <?php class Combattant { // ETAPE 01 : Attributs Prives (= Caracteristiques) de Objet Combattant private $_id; private $_nom; private $_force = 1; private $_degats = 0; private $_niveau = 1; private $_experience = 1; private $_coupsPortes = 0; private $_dernierCoup; private $_derniereConnexion; // ETAPE 06 : Le Constructeur public function __construct(array $d) { $this->hydrate($d); } // ETAPE 05 : HYDRATER les Objets public function hydrate(array $donnees) { foreach ($donnees as $key => $value) { $method = 'set'.ucfirst($key); if (method_exists($this, $method)) { $this->$method($value); } } // FIN DE "foreach ($donnees as $key => $value)" } // ETAPE 03 : Constantes const COUPS_MAX = 3; // ETAPE 04.01 : Liste de GETTERS (= Accéder à un attribut : l'accesseur ou getter) public function id() { return $this->_id; } public function nom() { return $this->_nom; } public function force() { return $this->_force; } public function degats() { return $this->_degats; } public function niveau() { return $this->_niveau; } public function experience() { return $this->_experience; } public function coupsPortes() { return $this->_coupsPortes; } public function dernierCoup() { return $this->_dernierCoup; } public function derniereConnexion() { return $this->_derniereConnexion; } // ETAPE 04.02 : Liste des SETTERS (= Modifier la valeur d'un attribut : les mutateurs ou Setters) public function setId($id) { // On convertit l'argument en nombre entier. (= Transtypage) // lire cette instruction de droite à gauche $id = (int) $id; // Verifier que "$id" est SUPERIEUR A 0 if ($id > 0) { $this->_id = $id; } } public function setNom($nom) { if (is_string($nom) && strlen($nom) <= 15) { $this->_nom = $nom; } } public function setForce($force) { // On convertit l'argument en nombre entier. (= Transtypage) // lire cette instruction de droite à gauche $force = (int) $force; if ($force >= 1 && $force <= 100) { $this->_force = $force; } } public function setDegats($degats) { // On convertit l'argument en nombre entier. (= Transtypage) // lire cette instruction de droite à gauche $degats = (int) $degats; if ($degats >= 0 && $degats <= 100) { $this->_degats = $degats; } else { $this->_degats = 0; } } public function setNiveau($niveau) { // On convertit l'argument en nombre entier. (= Transtypage) // lire cette instruction de droite à gauche $niveau = (int) $niveau; if ($niveau >= 1 && $niveau <= 100) { $this->_niveau = $niveau; } } public function setExperience($experience) { // On convertit l'argument en nombre entier. (= Transtypage) // lire cette instruction de droite à gauche $experience = (int) $experience; if ($experience >= 0 && $experience <= 100) { $this->_experience = $experience; } } public function setCoupsportes($coupsportes) { // On convertit l'argument en nombre entier. (= Transtypage) // lire cette instruction de droite à gauche $coupsportes = (int) $coupsportes; if ($coupsportes >= 0 && $coupsportes <= 3) { $this->_coupsPortes = $coupsportes; } } public function setDernierCoup($derniercoup) { $this->_dernierCoup = $derniercoup; } public function setDerniereConnexion($derniereconnexion) { $this->_derniereConnexion = $derniereconnexion; } // ETAPE 02 : Methodes (= Fonctionnalites) Publics de Objet Combattant public function nomValide() { return !empty($this->_nom); } public function Attaquer(Combattant $cible) { // Conditions avec "if" ET "else" if ($this->_id != $cible->id()) { $cible->_degats = $cible->_degats + $this->_force; echo '<p>Attaque réussie ! Votre frappe est de ', $this->_force ,' L\'adversaire a : ', $cible->_degats , ' dégâts.<br>'; $this->GainXP(); $this->GainNiveau(); $this->_coupsPortes += 1; $h = date('Y-m-d H:i:s'); $this->_dernierCoup = $h; // Condition "if" A L'INTERIEUR Des Conditions avec "if" ET "else" if ($cible->_degats == 100) { echo 'Vous avez tué ', $cible->_nom, ' !'; } } else { echo 'Pourquoi s\'attaquer soi-même ?'; } } // FIN DE "public function Attaquer(Combattant $cible) " public function Regenerer() { // Nommage de variables pour la Premiere Condition avec "if" $format = 'Y-m-d H:i:s'; $dCo = $this->_derniereConnexion; $date1 = DateTime::CreateFromFormat($format, $dCo); $date = new DateTime($dCo); $date->add(new DateInterval('P1D')); $heureActuelle = date('Y-m-d H:i:s'); // Premiere Condition AVEC "if" if ($this->_degats >= 10 && strtotime($heureActuelle) >= strtotime($date->format('Y-m-d H:i:s'))) { $this->_degats = $this->_degats - 10; $this->setDerniereConnexion(date('Y-m-d H:i:s')); echo 'Vous avez bénéficier de soins, vos dégâts ont diminué de 10, vous avez en désormais : ', $this->_degats; } // Nommage de variables pour la Deuxieme Condition avec "if" $dCoup = $this->_dernierCoup; $date2 = DateTime::CreateFromFormat($format, $dCoup); $dateobj = new DateTime($dCoup); $dateobj->add(new DateInterval('P1D')); // Deuxieme Condition AVEC "if" if (strtotime($heureActuelle) >= strtotime($dateobj->format('Y-m-d H:i:s'))) { $this->_coupsPortes = 0; $this->setDernierCoup(date('Y-m-d H:i:s')); } } // FIN DE "public function Regenerer() " public function GainXP() { //$this->_experience = $this->_experience + 1; if ($this->_experience < 100) { $this->_experience = $this->_experience + 1; echo 'Vous gagnez 1 point d\'expérience, vous en avez : ', $this->_experience ,' <br></p>'; } } public function GainNiveau() { if ($this->_experience == 100) { if ($this->_niveau < 100) { $this->_niveau = $this->_niveau + 1; echo '<p>Félicitations ! Vous gagnez un niveau grâce à vos 100 points d\'expérience, vous êtes désormais au niveau : ', $this->_niveau; $this->_experience -= 100; echo '<br>Votre expérience a été remise à : ', $this->_experience, '</p>'; $this->_force = $this->_niveau; echo 'Votre nouvelle force est de : ', $this->_force; } else { echo '<p>Vous avez déjà atteint le niveau 100 qui est le niveau maximum.</p>'; } } } // FIN DE "public function GainNiveau() " } // FIN DE "class Combattant"
Fichier index "tp_combat_index.php" (= celui qui fait fonctionner le site php)
Code : 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
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 <?php require 'tp_combat.php'; /* /// *** Stockage Base de Donnees (= la class PersonnagesManager) *** /// */ class CombattantsManager { // ETAPE 01 : Attributs Prives (= Caracteristiques) de Objet CombattantsManager private $_db; // ETAPE 03 : Le Constructeur public function __construct(PDO $db) { $this->setDb($db); } // ETAPE 02 : Setters public function setDb(PDO $db) { $this->_db = $db; } // ETAPE 04 : Methodes (= Fonctionnalites) Publics de Objet CombattantsManager public function create(Combattant $perso) { // Préparation de la requête d'insertion. $req = $this->_db->prepare('INSERT INTO combattants (nom, force, degats, niveau, experience, coupsPortes, dernierCoup, derniereConnexion) VALUES(:nom, :force, :degats, :niveau, :experience, :coupsPortes, :dernierCoup, :derniereConnexion)'); // Assignation des valeurs pour le nom du personnage. $req->bindValue(':nom', $perso->nom()); $req->bindValue(':force', $perso->force(), PDO::PARAM_INT); $req->bindValue(':degats', $perso->degats(), PDO::PARAM_INT); $req->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT); $req->bindValue(':experience', $perso->experience(), PDO::PARAM_INT); $req->bindValue(':coupsPortes', $perso->coupsPortes(), PDO::PARAM_INT); $req->bindValue(':dernierCoup', $perso->dernierCoup()); $req->bindValue(':derniereConnexion', $perso->derniereConnexion()); // Exécution de la requête. $req->execute(); } public function count() { // Exécute une requête COUNT() et retourne le nombre de résultats retourné. return $this->_db->query('SELECT COUNT(*) FROM combattants')->fetchColumn(); } public function read(Combattant $perso) { $req = $this->_db->query('SELECT id, nom, force, degats, niveau, experience, coupsPortes, dernierCoup, derniereConnexion FROM combattants WHERE id = ' .$perso->id()); $donnees = $req->fetch(PDO::FETCH_ASSOC); return new Combattant($donnees); } public function readId($id) { $req = $this->_db->query('SELECT id, nom, force, degats, niveau, experience, coupsPortes, dernierCoup, derniereConnexion FROM combattants WHERE id = ' .$id); $donnees = $req->fetch(PDO::FETCH_ASSOC); return new Combattant($donnees); } public function readPerso(Combattant $perso) { $req = $this->_db->prepare('SELECT id, nom, force, degats, niveau, experience, coupsPortes, dernierCoup, derniereConnexion FROM combattants WHERE nom = :nom'); $req->bindValue(':nom', $perso->nom()); $req->execute(); $donnees = $req->fetch(PDO::FETCH_ASSOC); return new Combattant($donnees); } public function readNom($nom) { $req = $this->_db->prepare('SELECT COUNT(*) FROM combattants WHERE nom = :nom'); $req->execute(array(':nom' => $nom)); return (bool) $req->fetchColumn(); } public function readAll($nom) { $retour= []; $req = $this->_db->prepare('SELECT id, nom, force, degats, niveau, experience, coupsPortes, dernierCoup, derniereConnexion FROM combattants WHERE nom <> :nom ORDER BY nom'); $req->execute([':nom' => $nom]); while ($donnees = $req->fetch(PDO::FETCH_ASSOC)) { $retour[] = new Combattant($donnees); } return $retour; } public function update(Combattant $perso) { $req = $this->_db->prepare('UPDATE combattants SET nom = :nom, force = :force, degats = :degats, niveau = :niveau, experience = :experience, coupsPortes = :coupsPortes, dernierCoup = :dernierCoup, derniereConnexion = :derniereConnexion WHERE id = ' .$perso->id()); $req->bindValue(':nom', $perso->nom()); $req->bindValue(':force', $perso->force(), PDO::PARAM_INT); $req->bindValue(':degats', $perso->degats(), PDO::PARAM_INT); $req->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT); $req->bindValue(':experience', $perso->experience(), PDO::PARAM_INT); $req->bindValue(':coupsPortes', $perso->coupsPortes(), PDO::PARAM_INT); $req->bindValue(':dernierCoup', $perso->dernierCoup()); $req->bindValue(':derniereConnexion', $perso->derniereConnexion()); $req->execute(); } public function delete(Combattant $perso) { $this->_db->exec('DELETE FROM combattants WHERE id = ' .$perso->id()); } }
Code html : 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
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 <?php require 'tp_combat_manager.php'; session_start(); try { $db = new PDO('mysql:host=localhost;dbname=poo', 'root', ''); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } $manager = new CombattantsManager($db); if (isset($_GET['deconnexion'])) { session_destroy(); header('Location: .'); exit(); } if (isset($_SESSION['perso'])) { $perso = $_SESSION['perso']; } if (isset($_POST['creer']) && isset($_POST['nom'])) { $perso = new Combattant(array('nom' => $_POST['nom'])); if (!$perso->nomValide()) { $message = 'Le nom choisi est invalide.'; unset($perso); } elseif ($manager->readNom($_POST['nom'])) { $message = 'Le nom du personnage est déjà pris.'; unset($perso); } else { $manager->create($perso); } } elseif (isset($_POST['utiliser']) && isset($_POST['nom'])) { if ($manager->readNom($_POST['nom'])) { $perso = new Combattant(array('nom' => $_POST['nom'])); $perso = $manager->readPerso($perso); $perso->Regenerer(); $manager->update($perso); } else { $message = 'Ce personnage n\'existe pas !'; } } elseif (isset($_GET['frapper'])) { // Premieres Conditions "if" ET "else" if (!isset($perso)) { $message = 'Merci de créer un personnage ou de vous identifier.'; } else { // Deuxiemes Conditions "if" ET "else" // A L'INTERIEUR DE Premieres Conditions "if" ET "else" if (!$manager->readId((int) $_GET['frapper'])) { $message = 'Le personnage que vous voulez frapper n\'existe pas !'; } else { $persoCible = $manager->readId((int) $_GET['frapper']); $format = 'Y-m-d H:i:s'; $dc = $perso->dernierCoup(); $date1 = DateTime::CreateFromFormat($format, $dc); $date = new DateTime($dc); $date->add(new DateInterval('P1D')); $heureActuelle = date('Y-m-d H:i:s'); // Troisiemes Conditions "if" ET "else" // A L'INTERIEUR DE Deuxiemes Conditions "if" ET "else" if ($perso->coupsPortes() >= Combattant::COUPS_MAX && strtotime($heureActuelle) <= strtotime($date->format('Y-m-d H:i:s'))) { echo '<br> Vous avez déjà donné 3 coups pendant les dernières 24 heures, vous pourrez à nouveau frapper le : ', $date->format('d-m-Y à H:i:s'); } else { // On stocke dans $retour les éventuelles erreurs ou messages // que renvoie la méthode frapper. $retour = $perso->Attaquer($persoCible); $manager->update($perso); $manager->update($persoCible); try { $db = new PDO('mysql:host=localhost;dbname=poo', 'root', ''); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } $manager = new CombattantsManager($db); $manager->update($perso); } } // FIN DE Deuxieme Condition "else" } // FIN DE Premiere Condition "else" } // FIN DE la Condition "elseif (isset($_GET['frapper'])) " ?> <!DOCTYPE html> <html> <head> <title>TP : Mini jeu de combat</title> <meta charset="utf-8" /> </head> <body> <!-- Acceder a la fonction "count()" --> <p>Nombre de personnages créés : <?= $manager->count() ?></p> <?php if (isset($message)) { echo '<p>', $message, '</p>'; } if (isset($perso)) { ?> <p><a href="?deconnexion=1">Déconnexion</a></p> <fieldset> <legend>Mes informations</legend> <p> Nom : <?php echo htmlspecialchars($perso->nom()); ?><br /> Force : <?php echo htmlspecialchars($perso->force()); ?> <br/> Dégâts : <?php echo htmlspecialchars($perso->degats()); ?><br /> Niveau : <?php echo htmlspecialchars($perso->niveau()); ?><br /> Expérience : <?php echo htmlspecialchars($perso->experience()); ?><br /> <hr> <?php $format = 'Y-m-d H:i:s'; $dc = $perso->dernierCoup(); $date1 = DateTime::CreateFromFormat($format, $dc); $date = new DateTime($dc); $date->add(new DateInterval('P1D')); ?> Coups Portés : <?php echo htmlspecialchars($perso->coupsPortes()), '/', Combattant::COUPS_MAX, ' , ils seront remis à zéro le : ', $date->format('d-m-Y à H:i:s'); ?><br /> </p> </fieldset> <fieldset> <legend>Qui frapper ?</legend> <p> <?php $persos = $manager->readAll($perso->nom()); if (empty($persos)) { echo 'Personne à frapper !'; } else { foreach ($persos as $unPerso) { echo '<a href="?frapper=', $unPerso->id(), '">', htmlspecialchars($unPerso->nom()), '</a> (force : ', $unPerso->force(),', dégâts : ', $unPerso->degats(), ', niveau : ', $unPerso->niveau(),' )<br />'; } } ?> </p> </fieldset> <?php } else { ?> <form action="" method="post"> <p> Nom : <input type="text" name="nom" maxlength="50" /> <input type="submit" value="Créer ce personnage" name="creer" /> <input type="submit" value="Utiliser ce personnage" name="utiliser" /> </p> </form> <?php } ?> </body> </html> <?php if (isset($perso)) { $_SESSION['perso'] = $perso; } ?>
Voila voila !!
Oui, c'est LONG MAIS je voulais mettre TOUTES les indications et explications possibles pourque vous voyez où le problème se situerait
au niveau du code php via la méthode POO.
Je précise que c'est en serveur en local.
Je rappelle que mon problème, pour moi, est le non-comptage de personnages créées
(Voir les deux premiers screens) (Le Troisieme screen vient d'un autre code php via la POO qui, lui, fonctionne Bien)
Merci de votre compréhension et Bonne lecture.
ps : pour les codes php via la POO j'ai mis des Commentaires pour vous aidez un peu à Faciliter la lecture du code.
Partager