[RESOLU] Afficher une liste d'article

Avatar de l’utilisateur
Eléphanteau du PHP | 28 Messages

17 févr. 2017, 11:40

Bonjour tout le monde,

Je rencontre un problème, je souhaite afficher une liste d'article et le tout en POO ( je ne sais pas si je dois poser ça ici ou dans la rubrique POO, étant donné que je suis vraiment débutant )

Voici mon code afficher sur la page index.php
<h1>Dahsboard</h1>

        <?php

        $db = new PDO('mysql:host=localhost;dbname=BlogTest', 'root', 'root');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

        $manager = new EpisodeManager($db);
        ?>

        <h4>Listes des épisodes</h4>
        <?php

        $episodes = $manager->getList();

        foreach ($episodes as $episodes){
            echo $episodes->id(), ' ' . $episodes->contenu();
        }

        ?>
Lorsque je lance ma page j'ai une message d'erreur m'indiquant :
Uncaught Error: Call to a member function query() on null on line 29

Donc voici le code de ma classe EpisodeManager l'erreur est au niveau du getList :
public function setDb(PDO $db){
        $this->_db = $db;
    }

    public function __construct($db){
        $this->_db = $this->setDb($db);
    }

    public function getList(){

        $g = $this->_db->query('SELECT id, titre FROM articles ORDER BY dateAjout DESC');
        $donnees = $g->fetch(PDO::FETCH_ASSOC);
        return $donnees;

    }
Merci par avance pour votre aide.

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8728 Messages

17 févr. 2017, 11:49

salut,

_db n'est pas un objet :-)

et le problème est du à la ligne alambiquée dans le constructeur
public function __construct($db){
        $this->_db = $this->setDb($db);
    }
les action sont faite de droite à gauche donc tu utilise la méthode setDb qui va affecter $db à _db => ok
mais ensuite tu affectes le retour de la méthode à _db et setDb retourne rien donc $this->_db est null :-)

donc simplement
<?php
public function __construct($db){
    $this->setDb($db);
}
pour le reste vire le _ dans la propriété db c'est inutile, et il me semble, contraire à PSR-2 (et cela n'apporte rien, c'est une syntaxe "de vieux" utilisé quand les IDE ne pouvais indiquer la portée du memebre. Et même avec un éditeur de texte du peux retourner au début de ta classe pour chercher l'info. sinon tu va finir par coller le type de l'objet dans le nom (du genre _PDO_DB ? ou _intId ?) :mrgreen:

En fait c'est bien "interdit" par PSR2
Property names SHOULD NOT be prefixed with a single underscore to indicate protected or private visibility.

tu as oublié le saut de ligne (<br />) dans ton foreach, ça va être moche ;)

@+
Il en faut peu pour être heureux ......

Avatar de l’utilisateur
Eléphanteau du PHP | 28 Messages

17 févr. 2017, 12:02

Ouuuff effectivement je sais pas ce que j'ai fait à ce moment là, merci à toi, le problème n'est toujours pas résolue je passe mon temps à corriger les erreurs plutôt qu'à vraiment coder :p

Uncaught Error: Call to a member function id() on string in line 90

cela correspond à cette ligne ->
foreach ($episodes as $episodes){
            echo $episodes->id(), ' ' . $episodes->contenu();
        }
Je ne vois pas pourquoi il me parle de String alors que l'id est un Int... sur le papier ça paraissait plus simple...

En ce qui concerne le _db oui tu as raison je trouve ça moche, mais dans le bouquin que je lis il faisait comme ça soit disant pour respecter je ne sais plus quoi content de voir que ce n'est pas obligatoire :)

Effectivement sans le <br/> ça risque d'être moche, je mettais comme ça pour déjà voir s'il m'affichait quelque chose ^^ visiblement non pas encore.

Mammouth du PHP | 1207 Messages

17 févr. 2017, 12:11

enleve un s à episodes mais pas à tous.

je ne sais pas comment réagit php quand la même variable est utilisé 2 fois dans un foreach.

Avatar de l’utilisateur
Eléphanteau du PHP | 28 Messages

17 févr. 2017, 12:15

Merci de ta réponse, du coup j'ai fais :
<?php

        $episodes = $manager->getList();

        foreach ($episodes as $epi){
            echo $epi->id(), ' ' . $epi->contenu();
        }

        ?>
Pour le moment rien ne change, je n'arrive pas à comprendre

Mammouth du PHP | 1207 Messages

17 févr. 2017, 12:24

il faut voir le contenu de tes variables, et comment fonctionne ->getList();

l'erreur indique que $epi est un string alors que tu le traite comme un objet

Avatar de l’utilisateur
Eléphanteau du PHP | 28 Messages

17 févr. 2017, 12:28

Hmm je vois, en faisant echo $episodes['titre'] il me il affiche correctement le titre de l'épisode, mais ce n'est pas le but, je veux pouvoir le traiter comme un objet.

Merci de m'avoir éclairer il va falloir que je règle ça.

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8728 Messages

17 févr. 2017, 17:40

yop,

$g->fetchAll(PDO::FETCH_OBJ); :mrgreen:
Si tu veux utiliser une classe existante c'est aussi possible, utilise le style PDO::FETCH_CLASS : $g->fetchAll(PDO::FETCH_CLASS ,'le nom de la classe'); (pense à l'autoload)

c'est fetchAll qu'il faut utiliser car avec fetch tu n'auras pas un tableau mais juste une ligne.
la doc => http://php.net/manual/fr/pdostatement.fetchall.php

par contre ce sera $epi->id et pas $epi->id() (sinon ce serait $epi->getId() ;) )


@+
Il en faut peu pour être heureux ......

Avatar de l’utilisateur
Eléphanteau du PHP | 28 Messages

17 févr. 2017, 17:43

Ouuufff pas encore les bons réflexes :p

Merci à toi encore un peu flou tout ça ^^