Ajout d'un objet dans une base de données

Petit nouveau ! | 2 Messages

23 janv. 2013, 00:15

Bonjour à tous,

alors voilà mon problème, j'ai une classe Personnage comprenant les attributs privés suivants: $_id;$_nom;$_force;$_degats;$_niveau;$_experience;
j'y ai mis les getters et les setters correspondant, une méthode hydrate modifiant les attributs selon un array, un constructeur appelant la méthode hydrate.

Cet objet fonctionne parfaitement.

j'ai une table personnages dans ma base de données comprenant id(int, auto increment),nom(varchar 255), force(int),degats(int),niveau(int),experience(int).

J'ai voulu créer un objet PersonnagesManager gérant la table personnages. Et c'est là où ça coince, je n'arrive pas à ajouter un personnage dans la base de données.

voici les codes correspondants :
Personnage.class.php
<?php
class Personnage
{
	private $_id;
	private $_nom;
	private $_force;
	private $_degats;
	private $_niveau;
	private $_experience;
	
	public function __construct(array $donnees)
	{
		$this->hydrate($donnees);
	}
	
	public function hydrate(array $donnees)
	{
		foreach($donnees as $key => $value)
		{
			$method = 'set'.ucfirst($key);
			if(method_exists($this,$method))
			{
				$this->$method($value);
			}
		}
	}
	
	public function getId(){return $this->_id;}
	public function getNom(){return $this->_nom;}
	public function getForce(){return $this->_force;}
	public function getDegats(){return $this->_degats;}
	public function getNiveau(){return $this->_niveau;}
	public function getExperience(){return $this->_experience;}
	
	public function setId($id)
	{
		$this->_id = (int) $id;
	}
	
	public function setNom($nom)
	{
		if(is_string($nom) && strlen($nom) <= 30)
		{
			$this->_nom = $nom;
		}
	}
	
	public function setForce($force)
	{
		$force = (int) $force;
		if($force >= 0 && $force <= 100)
		{
			$this->_force = $force;
		}
	}
	public function setNiveau($niveau)
	{
		$niveau = (int) $niveau;
		if($niveau >= 0)
		{
			$this->_niveau = $niveau;
		}
	}
	public function setExperience($exp)
	{
		$exp = (int) $exp;
		if($exp >= 0 && $exp <= 100)
		{
			$this->_experience = $exp;
		}
	}
}
PersonnagesManager.class.php
<?php
class PersonnagesManager
{
	private $_db;
	
	public function __construct($db)
	{
		$this->setDb($db);
	}
	
	public function add(Personnage $perso)
	{
		echo 'ajout d\'un personnage dans la bdd';
		$q = $this->_db->prepare('INSERT INTO personnages(`nom`,`force`,`degats`,`niveau`,`experience`) VALUES(:nom,:force,:degats,:niveau,:experience)');
		$q->bindValue(':nom',$perso->getNom());
		$q->bindValue(':force',$perso->getForce(),PDO::PARAM_INT);
		$q->bindValue(':degats',$perso->getDegats(),PDO::PARAM_INT);
		$q->bindValue(':niveau',$perso->getNiveau(),PDO::PARAM_INT);
		$q->bindValue(':experience',$perso->getExperience(),PDO::PARAM_INT);
		$q->execute();
	}
	
	public function update(Personnage $perso)
	{
		$q = $this->_db->prepare('UPDATE personnages SET nom = :nom, `force` = :force, degats = :degats, niveau = :niveau, experience = :experience WHERE id=:id');
		$q->bindValue(':nom',$perso->getNom());
		$q->bindValue(':force',$perso->getForce(),PDO::PARAM_INT);
		$q->bindValue(':degats',$perso->getDegats(),PDO::PARAM_INT);
		$q->bindValue(':niveau',$perso->getNiveau(),PDO::PARAM_INT);
		$q->bindValue(':experience',$perso->getExperience(),PDO::PARAM_INT);
		$q->bindValue(':id',$perso->getId(),PDO::PARAM_INT);
		
		$q->execute();
	}
	
	public function delete(Personnage $perso)
	{
		$this->_db->exec('DELETE FROM personnages WHERE id = '.$perso->getID());
	}
	
	public function get($id)
	{
		$id = (int) $id;
		$q = $this->_db->query('SELECT * FROM personnages WHERE id ='.$id);
		$donnees = $q->fetch(PDO::FETCH_ASSOC);
		return new Personnage($donnees);
	}
	
	public function getList()
	{
		$q = $this->_db->query('SELECT * FROM personnages ORDER BY nom');
		$persos = array();
		while($donnees = $q->fetch(PDO::FETCH_ASSOC))
		{
			$persos[] = new Personnage($donnees);
		}
		return $persos;
	}
	
	public function setDb(PDO $db)
	{
		$this->_db = $db;
	}
}
index.php
<?php
	function chargerClasse($classe)
	{
		require $classe . '.class.php';
	}
	
	spl_autoload_register('chargerClasse');
	$perso = new Personnage(array(
		'nom' => 'Vyse',
		'force' => 6,
		'degats' => 60,
		'niveau' => 5,
		'experience' => 20
	));
    
	$db = new PDO('mysql:host=localhost;dbname=test','root','');
	echo $perso->getForce();
	$manager = new PersonnagesManager($db);
	$manager->add($perso);
?>
6 et ajout d\'un personnage dans la bdd sont bien indiqués, mais rien ne se passe au niveau de ma table personnage. Je travaille sur wamp, avez-vous une solution?

ViPHP
xTG
ViPHP | 7331 Messages

23 janv. 2013, 11:48

Actives les erreurs PDO. ;)

Petit nouveau ! | 2 Messages

23 janv. 2013, 13:30

Pour moi c'est quelque chose de nouveau, et j'ai encore du mal à utiliser les exception, surtout avec PDO, as-tu un code qui expliquerai comment faire? merci d'avance !

ViPHP
xTG
ViPHP | 7331 Messages

23 janv. 2013, 13:55

Il y a de magnifiques exemples dans la documentation : http://fr2.php.net/manual/en/pdo.error-handling.php