Bonjour, je suis un cours sur OC sur de la POO php, inutile de vous préciser que je suis un novice.
Celà fait 2 jours que je me prends la tête à essayer de passer mes valeurs sur un objet Personnage mais celles-ci ne passent pas...
J'ai l'impression que le problème vient de mon DAO : la fonction add (mal codée?) ou ma fonction hydrate ? J'ai l'impression de ne pas avoir fait de fautes du moins je ne la vois pas
Voici mon DAO :Voici ma classe Personnage :
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 <?php class PersonnagesManager { private $_db; // Instance de PDO. public function __construct($db) { $this->setDb($db); } public function add(Personnage $perso) { //Préparation de la requête d'insertion. $q = $this->_db->prepare('INSERT INTO personnages( nom, forcePerso, degats, niveau, experience) VALUES(:nom, :forcePerso, :degats, :niveau, :experience)'); //Assignation des valeurs pour le nom, la force, les dégats, l'expérience et le niveau du personnage. $q->bindValue(':nom', $perso->nom(), PDO::PARAM_STR); $q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT); $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT); $q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT); $q->bindValue(':experience', $perso->experience(), PDO::PARAM_INT); //Exécution de la requête. $q->execute(); } public function delete(Personnage $perso) { //Exécute une requête de type DELETE. $this->_db->exec('DELETE FROM personnages WHERE id ='.$perso->id()); } public function get($id) { //Exécute une requête de type SELECT avec une clause WHERE, et retourne un objet Personnage. $id = (int) $id; $q = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages WHERE id = '.$id); $donnees = $q->fetch(PDO::FETCH_ASSOC); return new Personnage($donnees); } public function getList() { //Retourne la liste de tous les personnages. $persos = []; $q = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages ORDER BY nom'); while($donnees = $q->fetch(PDO::FETCH_ASSOC)) { $persos[] = new Personnage($donnees); } return $persos; } public function update(Personnage $perso) { //Prépare une requête de type UPDATE. $q = $this->_db->prepare('UPDATE personnages SET forcePerso = :forcePerso, degats = :degats, niveau= :niveau, experience= :experience WHERE id= :id'); //Assignation des vlauers à la requête. $q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT); $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT); $q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT); $q->bindValue(':experience', $perso->experience(), PDO::PARAM_INT); $q->bindvalue(':id', $perso->id(), PDO::PARAM_INT); $q->execute(); //Exécution de la requête. } public function setDB(PDO $db) { $this->_db = $db; } }et voici mon code avec mon autoloader et mes valeurs que j'essaye de passer :
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 <?php class Personnage { private $_id; private $_nom; private $_forcePerso; private $_degats; private $_niveau; private $_experience; // Mise ne place de la fonction hydrater : un tableau de données doit être passé à la fonction (d'où le préfixe array) public function hydrate(array $donnees) { foreach ($donnees as $key => $value) { //on recupere le nom du setter correspondant à l'attribut $method = 'set'.ucfirst($key); //Si le setter correspondant existe... if (method_exists($this, $method)) { //On récupère le setter $this->$method($value); } } } function __construct($donnees=array()) { $this->hydrate($donnees=array()); } //Liste des getters public function id() { return $this->_id; } public function nom() { return $this->_nom; } public function forcePerso() { return $this->_forcePerso; } public function degats() { return $this->_degats; } public function niveau() { return $this->_niveau; } public function experience() { return $this->_experience; } //Liste des setters public function setId($id){ // L'identifiant du personnage sera, quoi qu'il arrive, un nombre entier. $id = (int) $id; } public function setNom($nom) { // On vérifie qu'il s'agit bien d'une chaîne de caractères. // Dont la longueur est inférieure à 50 caractères. if (is_string($nom) && strlen($nom) <= 50) { $this->_nom = $nom; } } public function setForcePerso($forcePerso) { $forcePerso = (int) $forcePerso; if ($forcePerso >= 1 && $forcePerso <=100) { $this->_forcePerso = $forcePerso; } } public function setDegats($degats) { $degats = (int) $degats; if ($degats >= 0 && $degats <=100) { $this->_degats = $degats; } } public function setNiveau($niveau) { $niveau = (int) $niveau; if ($niveau >= 1 && $niveau <= 100) { $this->_niveau = $niveau; } } public function setExperience($experience) { $experience = (int) $experience; if ($experience >= 1 && $experience <=100) { $this->_experience = $experience; } } }Je précise que j'effectue un var_dump de ma variable $perso mais que celui-ci me retourne que des valeurs nulles :
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 <?php /** * Class Autoloader */ class Autoloader{ /** * Enregistre notre autoloader */ static function register(){ spl_autoload_register(array(__CLASS__, 'autoload')); } /** * Inclue le fichier correspondant à notre classe * @param $class string Le nom de la classe à charger */ static function autoload($class){ require 'class/'. $class . '.php'; } } Autoloader::register(); //Creation $perso = new Personnage([ 'nom' => 'Noel', 'forcePerso' => 5, 'degats' => 1, 'niveau' => 1, 'experience' => 1 ]); var_dump($perso); //Connexion à la BDD $db = new PDO('mysql:host=localhost;dbname=kumbat','root','', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); $manager = new PersonnagesManager($db); $manager->add($perso);
C:\wamp64\www\poophp\10final.php:36:
object(Personnage)[1]
private '_id' => null
private '_nom' => null
private '_forcePerso' => null
private '_degats' => null
private '_niveau' => null
private '_experience' => null
et pour terminer voici l'erreur en question :
Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'nom' ne peut être vide (null) in C:\wamp64\www\poophp\class\PersonnagesManager.php on line 26
Partager