Merci lovcode, j'ai corrigé. à force de tester, effacer, recopier les copié collé se mélangent. Pour le root, je suis sur mac, et en général pc -> 'root', '' et mac 'root', 'root' (du moins il me semble que c'est ainsi)
bon, j'ai fait ma page connexion.php avec une variable qui me dit si je suis connecté ou pas, et une petite phrase en fin de page pour voir si le programme s’exécute jusqu'au bout.
Si je ne met pas de php dans mon index, seulement l'appel de connexion.php et l'appel de variable de connexion, je vois que je suis connecté et je vois ma fin de programme.
si je fais un appel à un nouveau manager, j'ai plus ma fin de fichier. C'est donc cette connexion qui pose problème.
je continue de chercher pourquoi.
Pas trop compris là. J'ai tout commenté dans mon personnagesManager, refait ma page externe pour la connection bdd, fait une function bonjour() dans pagesManager (qui affiche juste bonjour, pour voir si j’accède à la classe) -> mon $manager -> bonjour() fonctionne.
De là, j'ai tout décommenté et refait la fonction add en mettant les variables une à une. j’arrive au même code qu'avant .... et ça marche. l
Je suis le cours sur le livre programmez en orienté objet en PHP. J'en suis aux annotations et j'ai un gros soucis de compréhension avec la fonction checkContraints() page 237. Je ne sais pas si d'autre personnes ont eu le même souci que moi car je n'ai rien trouvé sur le forum et j'ai déjà posé ma question plusieurs fois sur le forum PHP mais sans succès.Donc là, c'est ma dernière tentative.
Le problème est le suivant je n'arrive pas à tester la vérification des attributs de ClassInfos et j'ai toujours une belle fatal error en ligne 22 et Exception en ligne 22 j'ai bien fait comme dans le livre (j'ai fais trois fichier index.php, Personnage.class.php et MyAnnotations.php) voici les codes des fichiers (je n'ai mis que l’essentiel ).
class Table extends Annotation{}
class Type extends Annotation{}
class Type2 extends Annotation{}
class UneAnnotation extends Annotation{}
class ClassInfos extends Annotation
{
public $author;
public $version;
public function checkConstraints($target)
{
if(!is_string($this -> author))
{
throw new Exception('L\'auteur doit être une chaine de caractères <br />') //Fatal error !!!
}
if(!is_numeric($this -> version))
{
throw new Exception('Le numéro de version doit être un nombre valide <br />');
}
}
}
j'ai mis les instructions dans un bloc try/catch, ce qui me semblait logique mais ça ne fonctionne pas. Je pense que checkConstraints() est appelé automatiquement lors de l'assignation des valeurs aux attributs de l'instance ClassInfos (je n'en suis pas sûr) mais je ne comprends pas pourquoi j'ai des erreurs. quelqu'un aurait il une idée car là je sèche ? j'ai essayé d'autres test plus ou moins farfelus et rien ne marche je tourne en rond et ça m’énerve un peu surtout que ce n'est pas super bien expliqué et pas très logique. merci pour votre aide
Je débute en PHP OO et j'ai une question toute bête sur le cours. J'en suis à la manipulation des données et je teste les différentes méthodes : insertion, mise à jour et suppression.
J'ai réussi à faire des insertions. Pour la mise à jour et le delete est-ce qu'il y'a un autre moyen de récupérer l'id du perso ou il faut le mettre obligatoirement dans l'hydratation ?
Voici mon code :
gestion_bdd.php
<?php
function chargerClasse($classe)
{
require $classe . '.php'; // On inclut la classe correspondante au paramètre passé
}
spl_autoload_register('chargerClasse'); // On enregistre la fonction en autoload pour qu'elle soit appelée dès qu'on instanciera une classe non déclarée.
$perso = new Personnage();
$perso->hydrate(array(
'id' => 2,
'nom' => 'Toto',
'forcePerso' => 5,
'degats' => 5,
'niveau' => 1,
'experience' => 0
));
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$manager = new PersonnagesManager($db);
//$manager->add($perso);
foreach ($manager->getList() as $persos)
{
// echo $persos->id();
}
// var_dump($perso);
$manager->update($perso);
?>
PersonnagesManager.php
<?php
class PersonnagesManager
{
private $_db; // Instance de PDO
public function __construct($db)
{
$this->setDb($db);
}
public function add(Personnage $perso)
{
$q = $this->_db->prepare('INSERT INTO personnages(nom, forcePerso, degats, niveau, experience) VALUES(:nom, :forcePerso, :degats, :niveau, :experience)');
$q->bindValue(':nom', $perso->nom());
$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->execute();
}
public function delete(Personnage $perso)
{
$this->_db->exec('DELETE FROM personnages WHERE id = '.$perso->id());
}
public function get($id)
{
$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()
{
$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)
{
$q = $this->_db->prepare('UPDATE personnages SET forcePerso = :forcePerso, degats = :degats, niveau = :niveau, experience = :experience WHERE id = :id');
$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();
}
public function setDb(PDO $db)
{
$this->_db = $db;
}
}
?>
Personnage.php
<?php
class Personnage
{
private $_id;
private $_nom;
private $_forcePerso;
private $_degats;
private $_niveau;
private $_experience;
// 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 récupère le nom du setter correspondant à l'attribut.
$method = 'set'.ucfirst($key);
// Si le setter correspondant existe.
if (method_exists($this, $method))
{
// On appelle le setter.
$this->$method($value);
}
}
}
public function __construct($donnees = []) {
$this->hydrate($donnees);
}
// 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 nombre entier.
// Si c'en était déjà un, rien ne changera.
// Sinon, la conversion donnera le nombre 0 (à quelques exceptions près, mais rien d'important ici).
$id = (int) $id;
// On vérifie ensuite si ce nombre est bien strictement positif.
if ($id > 0)
{
// Si c'est le cas, c'est tout bon, on assigne la valeur à l'attribut correspondant.
$this->_id = $id;
}
}
public function setNom($nom)
{
// On vérifie qu'il s'agit bien d'une chaîne de caractères.
if (is_string($nom))
{
$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 >= 0 && $niveau <= 100)
{
$this->_niveau = $niveau;
}
}
public function setExperience($experience)
{
$experience = (int) $experience;
if ($experience >= 0 && $experience <= 100)
{
$this->_experience = $experience;
}
}
}
?>
de sorte a ce que quand tu vas créer tes objets, aussitôt les classes seront incluses automatiquement dans ton fichier. si tu as 40 classes, tu vas pas faire des require 'maclasse34.php' ; et de plus ça sera plus clair dans la compréhension de ton code.
DONC LA JE TIENS A SIGNALER pour tous ceux qui vont chercher comme des perdus pourquoi ça marche pas dans
Manipulation de données stockées du cours PROGRAMMEZ EN ORIENTÉ OBJET EN PHP : dans la classe de personnage , a la place de:
public fonction hydrate(array $donnees) , il y a en théorie normalement une public fonction __construct(array $donnees) . pour que cela fonctionne car dans le cas présent la méthode hydrate est appelée donc si la méthode hydrate est appelée vous devez hydratez cette méthode par :
soit vous utilisez __construct et vous hydratez directement votre classe personnage sans définir la méthode public fonction hydrate(array $donnees): sinon vous aurez une belle erreur SQLSTATE[23000]: Integrity constraint violation: 1048
$perso = new Personnage([
'nom'=>'Magucien',
'forcePerso'=>1,
'degats'=>100,
'niveau'=>2,
'experience'=>100
]);
Bonjour, De mémoire, car j'ai mis ce cours de côté: Le ?frapper= est né de l'url générée par un clic sur 'frapper' dans votre page... Le script php va l'interpréter en récupérant l'action ('frapper') et le personnage (son id) à frapper. Sans l'id du personnage à frapper on ne saurait 'qui' frapper... C'est aussi là que repose "l’intérêt de mettre les perso en lien".
moi j'ai un problème concernant la manipulation des données stockées chap 4 (je crois bien parce que moi je lis en ligne et je pense que c'est le chapitre 4) il construit bien les setteurs et getteurs il ne montre pas la connexion a la base de donnée mais j'ai déjà suivi le cour de Mateo je les faits sans problème mais la ou je me suis arrache les cheveux c'est au niveau d'ici https://openclassrooms.com/courses/programmez-en-oriente-objet-en-php/manipulation-de-donnees-stockees#/id/r-1669516 (j’espère que ça va tombe pile sur cette partie) il fait une requête la il n’y a pas de problème on entre dans la boucle il créer un nouvel objet qui a pour paramètre un tableau je cherche ou il a créer le constructeur dans cette partie je ne voie pas je conclu qu'il faut que je cherche moi même a créer ça (pas cool du tout) j'ai passe mon temps a cherche comment créer un nouveau personnage de façons dynamique je n'ai pas put je n'ai eut le choix que d’écrire ça manuellement pour que ça me donne un résultat attendue mais ça craint
(ne me demande pas pourquoi j'ai pas de autolodear quand PHP vous sort des erreur terrible au point ou vous doute de tout je reviens souvent a la méthode archaïque pour être sur que ce n'est pas un autre pb que celui auquel je fais fasse )
voici ce que j'ai fait et aide moi a écrire ça dynamiquement merci
class bdd {
//put your code here
private $_id;
private $_nom;
private $_forcePerso;
private $_degats;
private $_niveau;
private $_experience;
function __construct($id, $nom, $forcePerso, $degats, $niveau, $experience) {
$this->setId($id);
$this->setNom($nom);
$this->setForcePerso($forcePerso);
$this->setDegats($degats);
$this->setNiveau($niveau);
$this->setExperience($experience);
}
function getId() {
return $this->_id;
}
function getNom() {
return $this->_nom;
}
function getForcePerso() {
return $this->_forcePerso;
}
function getDegats() {
return $this->_degats;
}
function getNiveau() {
return $this->_niveau;
}
function getExperience() {
return $this->_experience;
}
function setId($id) {
$id = (int)$id;
if($id > 0){
$this->_id = $id;
}
}
function setNom($nom) {
if(is_string($nom)){
$this->_nom = $nom;
}
}
function setForcePerso($forcePerso) {
$forcePerso = (int) $forcePerso;
if($forcePerso >= 1 && $forcePerso <= 100){
$this->_forcePerso = $forcePerso;
}
}
function setDegats($degats) {
$degats = (int) $degats;
if($degats >= 0 && $degats <= 100){
$this->_degats = $degats;
}
}
function setNiveau($niveau) {
$niveau = (int) $niveau;
if($niveau >=1 && $niveau <= 100){
$this->_niveau = $niveau;
}
}
function setExperience($experience) {
$experience = (int) $experience;
if($experience >= 1 && $experience <= 100){
$this->_experience = $experience;
}
}
}
try {
$bdd= new PDO('mysql:host=localhost;dbname=poo', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch (Exception $e) {
die('Erreur : ' .$e->getMessage());
}
$requete = $bdd->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnage');
while ($donnees = $requete->fetch(PDO::FETCH_ASSOC)){
$perso = new bdd($donnees['id'], $donnees['nom'], $donnees['forcePerso'], $donnees['degats'],
$donnees['niveau'], $donnees['experience'], $donnees['experience']);
echo $perso->getNom(), ' a ' , $perso->getForcePerso(), ' de force ' , $perso->getDegats(),
' de degats, ' ,$perso->getExperience(), ' d\'experience et est au niveau ' , $perso->getNiveau() .'</br> ';
}
pour besoin le code a été réduit a certains endroit
la patience et la perseverence son les meilleurs armes de la programmation
merci nanart, je ne connaissait pas cette façon de créer les url a partir d'un liens (d'alleiur je connaissait pas nom plus le <> dans "WHERE nom<>:nom" dans la requette.
maradja92, si j'ai bien compris où tu en es, la méthode dynamique viendra après. pour le moment, on se contente de créer des persos en prenant ce qui est dans la base de données, et ce cera plus simple avec l'hydratation.
Quand tu crée ton nouveau perso, tu n'a pas besoin de lui redéfinir les attributs car ils sont déjà dans $données :
$perso = new bdd($donnees['id'], $donnees['nom'], $donnees['forcePerso'], $donnees['degats'], $donnees['niveau'], $donnees['experience'], $donnees['experience']);
J'ai un petit problème et je n'arrive pas à trouver la solution je suis des cours sur le POO sur Openclassrooms ainsi qu'un autre site pour pouvoir coder en même temps et apprendre!
Cependant dans un exercices sur le POO pour l'héritage, l'exercice est simple mai j'ai un message lorsque je demande de verifier mon code qui affiche " Oups, merci de réessayer. Il semble que votre code n'affiche pas 'J'ai des côtés !'.'!
Pourriez-vous m'orientez que le point qu'il me manque SVP!
Voici l'exercices demander =
Vérifiez le code dans l'éditeur de la droite. Nous avons créé deux classes,Shape(une forme géométrique) etSquare(un carré), avecSquarequi hérite deShape.
Nous n'avons pas de précisé que Square possède une propriété $hasSides (possède des côtés), mais, en fait, il hérite de cette propriété de la classe Shape.
Remplissez l'instruction if sur la ligne 18 en utilisant la méthode property_exists() pour vérifier si l'objet $square possède la propriété"hasSides".
<!DOCTYPE html>
<html>
<head>
<title>La forme des choses</title>
</head>
<body>
<p>
<?php
class Shape {
public $hasSides = true;
}
class Square extends Shape {
}
$square = new Square();
// Ajoutez votre code ici !
if (property_exists($square, "hasSides" )); {
echo "J'ai des côtés !";
}
?>
</p>
</body>
</html>
Je débute en PHP OO et j'ai une question toute bête sur le cours. J'en suis à la manipulation des données et je teste les différentes méthodes : insertion, mise à jour et suppression.
J'ai réussi à faire des insertions. Pour la mise à jour et le delete est-ce qu'il y'a un autre moyen de récupérer l'id du perso ou il faut le mettre obligatoirement dans l'hydratation ?
Voici mon code :
gestion_bdd.php
<?php
function chargerClasse($classe)
{
require $classe . '.php'; // On inclut la classe correspondante au paramètre passé
}
spl_autoload_register('chargerClasse'); // On enregistre la fonction en autoload pour qu'elle soit appelée dès qu'on instanciera une classe non déclarée.
$perso = new Personnage();
$perso->hydrate(array(
'id' => 2,
'nom' => 'Toto',
'forcePerso' => 5,
'degats' => 5,
'niveau' => 1,
'experience' => 0
));
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$manager = new PersonnagesManager($db);
//$manager->add($perso);
foreach ($manager->getList() as $persos)
{
// echo $persos->id();
}
// var_dump($perso);
$manager->update($perso);
?>
PersonnagesManager.php
<?php
class PersonnagesManager
{
private $_db; // Instance de PDO
public function __construct($db)
{
$this->setDb($db);
}
public function add(Personnage $perso)
{
$q = $this->_db->prepare('INSERT INTO personnages(nom, forcePerso, degats, niveau, experience) VALUES(:nom, :forcePerso, :degats, :niveau, :experience)');
$q->bindValue(':nom', $perso->nom());
$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->execute();
}
public function delete(Personnage $perso)
{
$this->_db->exec('DELETE FROM personnages WHERE id = '.$perso->id());
}
public function get($id)
{
$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()
{
$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)
{
$q = $this->_db->prepare('UPDATE personnages SET forcePerso = :forcePerso, degats = :degats, niveau = :niveau, experience = :experience WHERE id = :id');
$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();
}
public function setDb(PDO $db)
{
$this->_db = $db;
}
}
?>
Personnage.php
<?php
class Personnage
{
private $_id;
private $_nom;
private $_forcePerso;
private $_degats;
private $_niveau;
private $_experience;
// 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 récupère le nom du setter correspondant à l'attribut.
$method = 'set'.ucfirst($key);
// Si le setter correspondant existe.
if (method_exists($this, $method))
{
// On appelle le setter.
$this->$method($value);
}
}
}
public function __construct($donnees = []) {
$this->hydrate($donnees);
}
// 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 nombre entier.
// Si c'en était déjà un, rien ne changera.
// Sinon, la conversion donnera le nombre 0 (à quelques exceptions près, mais rien d'important ici).
$id = (int) $id;
// On vérifie ensuite si ce nombre est bien strictement positif.
if ($id > 0)
{
// Si c'est le cas, c'est tout bon, on assigne la valeur à l'attribut correspondant.
$this->_id = $id;
}
}
public function setNom($nom)
{
// On vérifie qu'il s'agit bien d'une chaîne de caractères.
if (is_string($nom))
{
$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 >= 0 && $niveau <= 100)
{
$this->_niveau = $niveau;
}
}
public function setExperience($experience)
{
$experience = (int) $experience;
if ($experience >= 0 && $experience <= 100)
{
$this->_experience = $experience;
}
}
}
?>
Merci
- Edité par Mokhona 27 juin 2017 à 19:55:02
Salut , pour le delete j'ai procédé comme ça, en rajoutant une ligne "id" a mon tableau, effectivement la méthode delete attend un id.... qu'il n'y a pas dans le cours....... :
function chargerClasse($classe){
require $classe . '.php';
}
spl_autoload_register('chargerClasse');
$perso = new Personnage();
$perso->hydrate([
'id'=> 6,
'nom'=>'Choukize',
'forcePerso'=>23,
'degats'=>45,
'niveau'=>10,
'experience'=>99
]);
$db=new PDO('mysql:host=localhost;dbname=TPOC','root','root');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//Initialisation de la connexion
$manager = new PersonnagesManager($db);
//
$manager->delete($perso);
et pour récupérer l'ID d'un perso j'ai eu du mal mais j'ai réussit :
-j'ai modifié ma classe personnage en remplaçant hydrate par __construct pourquoi? parce que quand on veut charger un personnage avec
$guerrier = $manager->get(4);
$guerrier est directement un objet et il n'est pas hydraté (ou mal).
donc :
<?php
function chargerClasse($classe){
require $classe . '.php';
}
spl_autoload_register('chargerClasse');
$db=new PDO('mysql:host=localhost;dbname=TPOC','root','root');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//Initialisation de la connexion
$manager = new PersonnagesManager($db);
//
$perso = $manager->get(5);
echo 'Le personnage avec l\'id n°',$perso->id(),'a ete chargé. Il correspond a :
<br/> Nom :',$perso->nom(),'<BR/>','Force : ',$perso->forcePerso(),'<br/> Degats subits : ',$perso->degats();
la méthode du PersonnagesManager get($id) renvoi un nouvel objet Personnage directement hydraté donc plus qu'a aller choisir sa donnée avec $perso->id(), $perso->nom(); a condition de faire un __construct et non plus un hydrate , sur la classe Personnage.
Autrement possible, avec hydrate($donnees) ça pourrait marché mais a ce moment la , la méthode du manager->get(4) ne doit pas retourné d'objet mais simplement un tableau comme ceci : (a ce moment la remettre la fonction hydrate(array $donnees) a la place de __construct(array $donnees)
coté PersonnagesManager:
public function get($id){
$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 $donnees;
}
et du coté exécution :
$manager = new PersonnagesManager($db);
$tableau = $manager->get(4);
$perso4= new Personnage;
$perso4->hydrate($tableau);
echo 'Le personnage avec l\'id n°',$perso4->id(),'a ete chargé. Il correspond a :
<br/> Nom :',$perso4->nom(),'<BR/>','Force : ',$perso4->forcePerso(),'<br/> Degats subits : ',$perso4->degats();
J'espère avoir été clair, c'est quand même chaud pour expliquer. il faut tout tester simplement.
merci nanart, je ne connaissait pas cette façon de créer les url a partir d'un liens (d'alleiur je connaissait pas nom plus le <> dans "WHERE nom<>:nom" dans la requette.
maradja92, si j'ai bien compris où tu en es, la méthode dynamique viendra après. pour le moment, on se contente de créer des persos en prenant ce qui est dans la base de données, et ce cera plus simple avec l'hydratation.
Quand tu crée ton nouveau perso, tu n'a pas besoin de lui redéfinir les attributs car ils sont déjà dans $données :
$perso = new bdd($donnees['id'], $donnees['nom'], $donnees['forcePerso'], $donnees['degats'], $donnees['niveau'], $donnees['experience'], $donnees['experience']);
est la même chose que
$perso = new bdd($donnees)
justement $donnees contient les informations brut quant ça arrive au niveau du constructeur lui a sont tour doit organise les données la pour les assignés a chaque setter si on fait comme toi tu prétend il ne va qu'affiche une seul valeur de chaque personnage hors mais après avoir lu la suite du cour l'hydration viens résoudre ce problème de la plus belle des manières
la patience et la perseverence son les meilleurs armes de la programmation
Dans AdvertRepository, la méthode getAdverts pose problème; le paginator enclenche une erreur avec le orderby. Si je retire de la requete le orderBy, les annonces sont bien affichées dans ma page.
J'ai une question qui peux être un peu bête, mais qui m'intrigue beaucoup je suis en train de réaliser le cours de PDO je suis au Setter et Getter et c'est à propos des conditions est ce qu'il est préférable de les placer dans les Setters ou les Getters ou aucune importance ? Par ce que j'ai réalisé un petit exercice avec des articles et j'ai imposé une condition à la référence du produit qui ne doit pas dépasser 10 caractères mais quand je place ma condition dans le Setter j'ai tout le temps le retour de "La référence du produit :" Qui s'affiche en permanence !
Je vais vous montrer le résultat de mon code pour que vous comprenez un peu plus en détail
index.php
<?php
// inclusion du fichier
require_once '../src/App/Entity/Article.php';
use App\Entity\Article;
//Création d'un objet : INSTANCIATION
// INSTANCE = objet !!
$article_1 = new Article();
//$article_2 = new Article();
//
$article_1->setReference('rfrdgfgfgrf');
$article_1->setNomProduit('Mon article A');
$article_1->setDescription('Ici une description');
echo $article_1->getReference().'<br>';
echo 'Le nom du produit : <b>'.$article_1->getNomProduit().'</b><br>';
echo 'La déscription du produit : <b>'.$article_1->getDescription().'</b><br>';
Article.php
class Article
{
/**
* @var string $_reference référence du produit
*/
private $_reference;
/**
* @var string $_nomProduit Le nom du produit
*/
private $_nomProduit;
/**
* @var string $_description La déscription du produit
*/
private $_description;
/**
* @param string $reference
*/
// MUTATEUR / SETTER DE LA REFERENCE
public function setReference($reference)
{
$this->_reference = $reference;
}
/**
* @param string $nomProduit
*/
public function setNomProduit($nomProduit)
{
$this->_nomProduit = $nomProduit;
}
/**
* @param string $description
*/
public function setDescription($description)
{
$this->_description = $description;
}
// ACCESEUR / GETTER DE LA REFERENCE
/**
* @return string
*/
public function getReference()
{
if (strlen($this->_reference) > 10) {
echo 'La référence ' . $this->_reference . ' ne peut pas comporter plus de 10 caractères !';
} else {
return 'La référence du produit : <b>'.$this->_reference.'</b>';
}
}
/**
* @return string
*/
public function getNomProduit()
{
return $this->_nomProduit;
}
/**
* @return string
*/
public function getDescription()
{
return $this->_description;
}
}
Quand je mets la condition dans le Getter tout se passe bien comme je le veux, par compte si jamais je place la condition dans le Setter j'obtiens la référence du produit en plus que je vous montre ci-dessous
public function setReference($reference)
{
if (strlen($reference) > 10) {
echo 'La référence ' . $reference . ' ne peut pas comporter plus de 10 caractères !';
}else{
$this->_reference = $reference;
}
}
Comme je le disais j'obtiens la phrase que j'ai soulignée en noir sur la capture d'écran ci-dessous
Merci d'avance de m'éclairer sur ce point que je ne comprends pas !
À bientôt sur le forum.
- Edité par webcode 3 juillet 2017 à 0:01:43
Tester le code Premium Solo et gagner un mois gratuit sans engagement, Voici le code promotionnel : WEBCODE-9F7H
Dans ta requête sql, à quoi sert "Where billet" ? Ta requête devrait plutôt ressembler à :
$requete=$bdd->query('SELECT id, titre, nom, prenom, contenu, DATE_FORMAT(date, \'%d/%m/%Y à %Hh%i\') AS date_creation_fr FROM auteur ORDER BY date DESC LIMIT 0,5');
J'ai une question qui peux être un peu bête, mais qui m'intrigue beaucoup je suis en train de réaliser le cours de PDO je suis au Setter et Getter et c'est à propos des conditions est ce qu'il est préférable de les placer dans les Setters ou les Getters ou aucune importance ? Par ce que j'ai réalisé un petit exercice avec des articles et j'ai imposé une condition à la référence du produit qui ne doit pas dépasser 10 caractères mais quand je place ma condition dans le Setter j'ai tout le temps le retour de "La référence du produit :" Qui s'affiche en permanence !
Je vais vous montrer le résultat de mon code pour que vous comprenez un peu plus en détail
index.php
<?php
// inclusion du fichier
require_once '../src/App/Entity/Article.php';
use App\Entity\Article;
//Création d'un objet : INSTANCIATION
// INSTANCE = objet !!
$article_1 = new Article();
//$article_2 = new Article();
//
$article_1->setReference('rfrdgfgfgrf');
$article_1->setNomProduit('Mon article A');
$article_1->setDescription('Ici une description');
echo $article_1->getReference().'<br>';
echo 'Le nom du produit : <b>'.$article_1->getNomProduit().'</b><br>';
echo 'La déscription du produit : <b>'.$article_1->getDescription().'</b><br>';
Article.php
class Article
{
/**
* @var string $_reference référence du produit
*/
private $_reference;
/**
* @var string $_nomProduit Le nom du produit
*/
private $_nomProduit;
/**
* @var string $_description La déscription du produit
*/
private $_description;
/**
* @param string $reference
*/
// MUTATEUR / SETTER DE LA REFERENCE
public function setReference($reference)
{
$this->_reference = $reference;
}
/**
* @param string $nomProduit
*/
public function setNomProduit($nomProduit)
{
$this->_nomProduit = $nomProduit;
}
/**
* @param string $description
*/
public function setDescription($description)
{
$this->_description = $description;
}
// ACCESEUR / GETTER DE LA REFERENCE
/**
* @return string
*/
public function getReference()
{
if (strlen($this->_reference) > 10) {
echo 'La référence ' . $this->_reference . ' ne peut pas comporter plus de 10 caractères !';
} else {
return 'La référence du produit : <b>'.$this->_reference.'</b>';
}
}
/**
* @return string
*/
public function getNomProduit()
{
return $this->_nomProduit;
}
/**
* @return string
*/
public function getDescription()
{
return $this->_description;
}
}
Quand je mets la condition dans le Getter tout se passe bien comme je le veux, par compte si jamais je place la condition dans le Setter j'obtiens la référence du produit en plus que je vous montre ci-dessous
public function setReference($reference)
{
if (strlen($reference) > 10) {
echo 'La référence ' . $reference . ' ne peut pas comporter plus de 10 caractères !';
}else{
$this->_reference = $reference;
}
}
Comme je le disais j'obtiens la phrase que j'ai soulignée en noir sur la capture d'écran ci-dessous
Merci d'avance de m'éclairer sur ce point que je ne comprends pas !
À bientôt sur le forum.
- Edité par webcode hier à 0:01
Petit Up svp Je ne trouve pas de précision pour les conditions dans les Setters et Getters
je suis en train de réaliser le cours de PDO je suis au Setter et Getter et c'est à propos des conditions est ce qu'il est préférable de les placer dans les Setters ou les Getters ou aucune importance ?
PS : Je chercher vraiment a comprendre la meilleur solution !
Au faite comme je comprend il est préférable de mettre les conditions directement dans l'objet comme ceci ?
//Création d'un objet : INSTANCIATION
// INSTANCE = objet !!
$article_1 = new Article();
$article_1->setReference('Geu8FR');
if (strlen($article_1->getReference()) > 4) {
echo 'La référence '.$article_1->getReference().' ne doit pas depasser 4 caractères';
} else {
echo 'La référence '.$article_1->getReference();
}
Et non dans le Setter et Getter ?
A bientôt sur le forum.
- Edité par webcode 4 juillet 2017 à 20:34:07
Tester le code Premium Solo et gagner un mois gratuit sans engagement, Voici le code promotionnel : WEBCODE-9F7H
Si ca peut aider d'autres personnes, le code fonctionne les loulous !!!
Et merci vos aides.
<?php echo dirname(__FILE__); ?>
<?php include(dirname(__FILE__).'/config/connexion.php'); ?>
<?php include(dirname(__FILE__).'/inc/header.php'); ?>
<h1>Découvrez les 5 derniers billets : </h1><hr>
<?php
$requete=$bdd->query('SELECT id_bil, nom, prenom, titre, contenu, DATE_FORMAT(date, \'%d/%m/%Y à %Hh%i\') AS date_creation_fr
FROM billet AS a, auteur AS b WHERE a.id_aut = b.id_aut ORDER BY date DESC LIMIT 0,5');
//SELECT * FROM news AS n, auteur AS a WHERE n.id_auteur = a.id_auteur AND nom="DUPONT" AND prenom="Marchel"
//var_dump($bdd);
while ($donnees = $requete->fetch()):
/*$i=0;
while ($i < 5):
$i++;*/
?>
<div class="blog-post">
<h2 class="blog-post-title">
<?php echo htmlspecialchars($donnees->titre); ?>
</h2>
<p class="blog-post-meta">
<?php echo ($donnees->date_creation_fr);?> par <a href="#"><?php echo htmlspecialchars($donnees->nom." ".$donnees->prenom);?></a>
</p>
<p>
<?php echo htmlspecialchars($donnees->contenu); ?>
</p>
</div><!-- /.blog-post -->
<?php
endwhile;
$requete->closeCursor();
?>
<?php include(dirname(__FILE__).'/inc/footer.php'); ?>
J'en suis à l'activité finale du cours POO. J'ai besoin de votre aide pour comprendre le critère d'évaluation ci-après :
"La suppression automatique des ressources en cache : si une ressource périmée est lue dans le cache, alors celle-ci doit automatiquement être supprimée".
Ma question est la suivante : est-ce que cette phrase signifie que la suppression automatique du fichier périmé doit obligatoirement se faire dans la classe Cache, ou est-ce que l'important est que la suppression soit automatique à la lecture d'un fichier périmé (et que l'on peut la faire en dehors de la classe Cache qui gère les mise en cache : lecture, écriture ... des ressources)
J'espère que mes propos sont suffisamment clair pour obtenir une réponse !!
Merci
J'ai finalement fait le choix de tester les dates d'expiration des fichiers de mise en cache en dehors de la classe Cache. Et maintenant que je suis allée au bout de l'activité, je pense que c'est le bon choix. En effet, la date d'expiration étant une donnée écrite dans le fichier, on doit la lire : une méthode de la classe Cache renvoie les deux informations contenues dans le fichier. La date d'expiration est alors traitée par la méthode qui a demandé le fichier de mise en cache.
J'espère que cela pourra t'aider.
Bon courage
- Edité par Squirrel Jo 25 juillet 2017 à 16:40:43
je n'arrive pas à trouver de la documentation suffisante en français sur ceci, pouvez-vous m'aider (parce que je me retrouve avec des "doublons" de mes attributs)? :$ merci
je n'arrive pas à trouver de la documentation suffisante en français sur ceci, pouvez-vous m'aider (parce que je me retrouve avec des "doublons" de mes attributs)? :$ merci
- Edité par Karolyn il y a environ 22 heures
Salut
Je ne vais pas réponde a ta question, mes je sais avec l'expérience d'avoir fait des demande a mes question, tu aura plus vite une réponse dans le forum PHP que sur le sujet en question !
A bientôt sur le forum.
Tester le code Premium Solo et gagner un mois gratuit sans engagement, Voici le code promotionnel : WEBCODE-9F7H
je pense aussi si tu veut une réponse qu'il faut que tu indique le code utilisé qui te renvoie un doublon de tes attributs.
Pour ma part, j'ai une question d'écriture que je ne comprends pas :
j'en suis au 2eme TP (créer les classes magiciens et guerrier), et je ne comprends pas une écriture :
return $this->timeEndormi > time();
c'est une condition qui renvoie l'heure de reveil (enfin l'heure à laquelle se réveille le perso si elle est plus grande que l'heure actuelle) ? j'ai jamais vu pour le moment timeEndormi > time()
Christophe Vallot
Christophe Vallot