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 :
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;
    }
}
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
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;
        }
    }
 
 
}
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
 
<?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);
Je précise que j'effectue un var_dump de ma variable $perso mais que celui-ci me retourne que des valeurs nulles :

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