[RESOLU] Programation orienté objet, nom qui ne s'insère pas dans la database

noobprog
Invité n'ayant pas de compte PHPfrance

08 août 2019, 00:41

Salut
je suis en train de réaliser un petit exercice qui consiste à simplement rentrer un nom et un objet dnas une base de données mysql.

j'ai deux fichiers, un manager et une class character.

"Tout se passe bien" je n'ai pas de message d'érreur à ceci prêt que le champ nom dans la base de données reste à 0 si ne rentre pas une variable numérique.
J'avoue ne jamais avoir rencontré se type d'érreus

voici mes différents codes;
le manager

Code : Tout sélectionner

<?php class charManager { private $_db; // SETTER public function __construct($db) { $this->setDb($db); } public function setDb(PDO $db) { $this->_db = $db; } public function addChar(character $char) { $q=$this->_db->prepare('INSERT INTO personnages (name,damage) VALUES (:name,:damage)'); $q->bindValue(':name',$char->getName(),PDO::PARAM_INT); $q->bindValue(':damage',$char->getDamage(),PDO::PARAM_INT); $q->execute(); } public function delChar(character $char) { $q->prepare('DELETE FROM personnages WHERE id =' . $char->getId()); } public function uptChar(character $char) { $q=$this->_db->prepare('UPDATE personnages SET name=:name,damage=:damage WHERE id = :id'); $q ->bindValue(':name', $char->getStrength(),PDO::PARAM_INT); $q ->bindValue(':damage', $char->getName(),PDO::PARAM_INT); $q ->execute(); } public function readChar($id) { $id = (int) $id; $q = $this->query('SELECT * FROM personnages WHERE id =' . $id); $data = $q->fetch(PDO::FETCH_ASSOC); return new char($data); } }

la classe character

Code : Tout sélectionner

<?php include 'manager.php'; class character { private $_damage; private $_name; //fonctions public function __construct($data) { $this->hydrate($data); } public function hydrate(array $data) { foreach ($data as $key => $value) { $method = 'set'.ucfirst($key); if (method_exists($this, $method)) { $this->$method($value); } } } public function hit($char) { $char->setDamage(5); } //getter public function getName() { return $this->_name; } public function getDamage() { return $this->_damage; } //setter public function setDamage($damage) { if(!is_int($damage) OR $damage > 100 OR $damage < 1) { trigger_error('Critical Error damage value is not a correct value'); } $this->_damage = $damage; } public function setName($name) { $name = (string) $name; $this->_name = $name; } } $char = new Character([ 'name' => "salur", 'damage' => 5 ]); $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $db = new PDO('mysql:host=localhost;dbname=poo;charset=utf8', 'root', '',$pdo_options); $manager = new charManager($db); $manager -> addChar($char);
Un grand merci à ceux qui prendront le temps de m'aider ...
Cordialement

Mammouth du PHP | 2703 Messages

08 août 2019, 01:00

$q->bindValue(':name',$char->getName(),PDO::PARAM_INT);
vouloir un entier comme nom et passer le nom "salur", c'est incohérent.

noobprog
Invité n'ayant pas de compte PHPfrance

08 août 2019, 13:55

SAlut,
Tu veux dire que bindVAlue n'accepte que les int ?

Avatar du membre
Mammouth du PHP | 1609 Messages

08 août 2019, 14:04

Salut, avec un PDO::PARAM_INT en troisième paramètre, oui la fonction s'attend à recevoir un int.
https://www.php.net/manual/fr/pdostatem ... dvalue.php paramètre data_type
https://www.php.net/manual/fr/pdo.constants.php liste des constantes pour le paramètre data_type

Je vois aussi que lors de l'update tu bind la force sur le nom et le nom sur les dégâts et avec toujours le même paramètre PDO::PARAM_INT ce qui va surement te poser des problèmes également.
Développeur web depuis + de 20 ans

noobprog
Invité n'ayant pas de compte PHPfrance

08 août 2019, 14:30

Merci beaucoup pour tout ces éclaircissements

SAns toi j'y serai resté un sacré paquet de temps, Encore merci !!!