Problèmes avec l'extension PDO

J'obtiens une erreur PDO exception lorsque je teste l'utilisation de mes classes Personnage et PersonnagesManager

a marqué ce sujet comme résolu.

Bonjour les amis. J’ai un souci dans le chapitre 4 sur la manipulation des données stockées. J’ai monté les fichiers des classes Personnage et PersonnagesManager. Puis dans mon fichier TestPersonnage j’ai écrit le code pour appeler la fonction add() pour test, Mais je n’ai aucun résultat dans la base de données. Je souhaiterais comprendre ce qui se passe, car le code me semble très clair pourtant..

Quelqu’un peut m’aider? Je ne peux pas avancer sans résoudre ce problème..

Voici ma classe Personnage.class.php

 <?php
    class Personnage
    {
        private $_id;
        private $_nom;
        private $_forcePerso;
        private $_degats;
        private $_niveau;
        private $_experience;
        
            // Un tableau de donnees doit etre passe a la fonction -- d'ou le prefixe << array >>
        public function hydrate(array $donnees)
        {
            foreach($donnees as $key => $val)
            {
                $method = 'set'. ucfirst($key); //uppercase first..
                if(method_exists($this, $method)) // verifie si la methode existe..
                {
                    $this->$method($val);
                }
            }
        }
        
        // Constructeur de la classe Personnage..
        public function __construct(array $donnees)
        {
            $this->hydrate($donnees); // On hydrate notre objet ici..
        }
        
        // 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)
        {
            // On convertit l'argument en entier..
            $id = (int) $id;
            // On verifie ensuite si ce nombre est positif..
            if($id > 0)
            {
                $this->_id = $id;
            }
        }
        
        public function setNom($nom)
        {
            // On verifie qu'il s'agit bien d'une chaine de caracteres..
            if(is_string($nom) && strlen($nom) <= 30)
            {
                $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;
            }
        }
        
    }//fin classe

Voici ma classe PersonnagesManager.class.php

<?php
    class PersonnagesManager
    {
        private $_db; // Attribut contenant l'instance de PDO.
        
        public function __construct($db)
        {
            $this->setDb($db);
        }
        
        public function add(Personnage $perso)
        {
            // Preparation de la requete d'insertion
            // Assignation des valeurs pour le nom, la force, les degats, l'experience
            // et le niveau du personnage
            // Execution de la requete.
            $req = $this->_db->prepare('INSERT INTO personnage(nom, forcePerso, degats, niveau, experience) 
                                        VALUES (:nom, :forcePerso, :degats, :niveau, :experience)');
                
            $req->execute(array(
                    'nom' => $perso->nom(),
                    'forcePerso' => $perso->forcePerso(),
                    'degats'     => $perso->degats(),
                    'niveau'     => $perso->niveau(),
                    'experience' => $perso->experience()
            ));
            echo 'Ajout effectue avec succes !';
        }
        
        
        public function delete(Personnage $perso)
        {
            // Execute une requete de type DELETE.
            $this->_db->exec('DELETE FROM personnage WHERE id = '. $perso->id());
        }
        
        public function get($id)
        {
            //  Execute une requete de type SELECT avec une clause WHERE, et retourne un objet personnage.
            $id = (int)$id;
            
            $req = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnage
                                WHERE id = '. $id);
            // Je stocke le resultat de la requete dans une varIABLE.. un tableau
            $donnees = $req->fetch(PDO::FETCH_ASSOC);
                
            return new Personnage($donnees);
        
        }
        
        public function getList()
        {
            // Reoturne la liste de tous les personnages.
            $persos = array(); // tableau vide
            
            $req = $this->_db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnage
                                ORDER BY nom');
            
                while($donnees = $req->fetch(PDO::FETCH_ASSOC))
                {
                    $persos[] = new Personnage($donnees);
                }
                
            return $persos;
        }
        
        public function update(Personnage $perso)
        {
            // Prepare une requete de type UPDATE.
            // Assignation des valeurs a la requete
            // Execution de la requete.
            $req = $this->_db->prepare('UPDATE FROM personnage SET forcePerso = :forcePerso, degats = :degats,
                        niveau = :niveau, experience = :experience WHERE id = :id');
        $req->execute(array(
                            'forcePerso' => $perso->forcePerso(),
                            'degats'     => $perso->degats(),
                            'niveau'     => $perso->niveau(),
                            'experience' => $perso->experience()
                            )
                    );
        }
        
        public function setDb(PDO $db)
        {
            $this->_db = $db;
        }
    }

Et voici mon fichier TestPersonnage.php

<?php

function chargerClasse($classe)
{
    require $classe.'.class.php';   // inlcure la classe correspondant au parametre passe..
}   

spl_autoload_register('chargerClasse'); // on enregistre la fonction en autoload pour qu'elle
    // soit appelee des qu'on instanciera une classe non declaree..
    

        $perso = new Personnage([
          'nom' => 'Victor',
          'forcePerso' => 5,
          'degats' => 0,
          'niveau' => 1,
          'experience' => 0
        ]);

            // connexion a la BDD..
        $db = new PDO('mysql:host=localhost;dbname=personnages', 'root', '');
    
        $manager = new PersonnagesManager($db);
            
        $manager->add($perso);
?>

HELP PLEASE!!

+0 -0

Bonjour,

pour faciliter le debug, tu peux déjà, après avoir fait new PDO dans TestPersonnage.php choisir comment les erreurs doivent être remontées.

Par exemple : $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);.

Cela nous permettra de savoir quoi faire.

PS: dans la méthode update tu as une petite erreur : en effet tu oublies de mettre le id dans le execute

Salut @artragis. j’ai complété l’id comme tu l’as dit. Mais j’obtiens toujours un message d’erreur. Voici le message d’erreur: ( ! ) Fatal error: in C:\wamp\www\tests\PersonnagesManager.class.php on line 26 ( ! ) PDOException: in C:\wamp\www\tests\PersonnagesManager.class.php on line 26 vois.

Que dois-je donc faire ici?

+0 -0

pour le update, oui car c’est dans le where. Pour le add, non si c’est en Auto Increment tu n’as pas besoin de mettre l’identifiant.

Pour débugger le add, il faut que tu fasses ce que j’ai mis dans mon précédent message. ça t’aidera à voir quelles sont les erreurs.

Tu mets l’expérience à 0 ligne 17 de TestPersonnage.php or ton setter ligne 88 de Personnage.class.php "définit" le minimum à 1 donc la requête doit probablement échouer car l’expérience s’en retrouve null. Je n’ai jamais compris pourquoi les if de ce code n’ont pas de else de façon à ne pas silencieusement ignorer les valeurs refusées, ce qui ne peut que planter derrière. Dans l’idéal, une exception devrait être levée.

Ton message d’erreur, l’exception PDOException non gérée et transformée en erreur fatale, est vraisemblablement tronquée par xdebug à cause d’un bug. Dans cette situation (et à moins qu’une mise à jour ne le corrige), il faut la récupérer autrement (try/catch, le journal d’erreur d’Apache, les méthodes errorInfo, etc).

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte