IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

SQLSTATE[23000]: Integrity constraint violation: 1048 [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2020
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2020
    Messages : 27
    Points : 17
    Points
    17
    Par défaut SQLSTATE[23000]: Integrity constraint violation: 1048
    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

  2. #2
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Salut,

    Remplacez $this->hydrate($donnees=array()); par $this->hydrate($donnees); car vous écrasez le tableau que vous envoyez au constructeur L29 avec array()

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2020
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2020
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    Ah yes ! c'était bien ça.
    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 04/02/2019, 08h19
  2. Réponses: 6
    Dernier message: 13/08/2017, 23h02
  3. Réponses: 2
    Dernier message: 16/03/2013, 18h06
  4. Réponses: 2
    Dernier message: 14/08/2011, 14h25
  5. Réponses: 7
    Dernier message: 29/11/2010, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo