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

PHP & Base de données Discussion :

Affichage non-dynamique dans la view via fetchAll [PDO]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Par défaut Affichage non-dynamique dans la view via fetchAll
    Bonjour tout le monde,

    Je suis actuellement en train de créer un moteur de blog CRUD, sur architecture MVC. J'ai donc crée une class PostManager, où se trouve la méthode getPosts(), permettant d'avoir les 5 posts les plus récents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function getPosts()
        {
            $dbh = $this->dbh;
            $query = 'SELECT * FROM posts ORDER BY creation_date';
            $req = $dbh->prepare($query);
            $req->execute();
     
            $req->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'OC4\Model\Post');
            $data = $req->fetchAll();
     
            return $data;
        }
    Je re-utilise ensuite cette méthode dans ma classe ControllerHome :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     public function showPosts()
        {
            $this->postManager = new PostManager();
            $data = $this->postManager->getPosts();
            var_dump($data);
            require_once('view/frontend/header.php');
            require_once('view/frontend/home.php');
            require_once('view/frontend/footer.php');
        }
    le var_dump($data) me permet de vérifier que je reçois bien toutes les entrées de ma base de donnée. Etant donné que j'utilise fetchAll(), on me retourne directement les éléments récupérés sous forme d'array. A priori, pas besoin de faire de boucle. Ce qui m'embête, c'est qu'au niveau de la view l'affichage n'est pas dynamique, car il faut préciser quel rangée de l'array nous intéresse à chaque fois, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div style="border: 1px solid black;">
                 <h1><?php  echo $data[0]['title']; ?></h1>
           </div>
    Comment faire pour obtenir un affichage dynamique des posts les plus récents ? J'ai donc naturellement pensé à un boucle foreach ($data as $value), mais même après avoir consulté la doc, je ne sais pas de quel manière je pourrais la remplir avec la structure que j'ai

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 119
    Par défaut
    Bonjour,

    Avec fetchAll() tu vas obtenir 2 arrays (un a index numerique et un associatif). Donc il te faudra deux boucles sinon tu vas obtenir tes valeur de retour en double.

    une autre solution est d'utiliser $result = $sth->fetch(PDO::FETCH_ASSOC);, donc dans ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function getPosts()
        {
            $dbh = $this->dbh;
            $query = 'SELECT * FROM posts ORDER BY creation_date';
            $req = $dbh->prepare($query);
            $req->execute();
     
            $req->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'OC4\Model\Post');
            $datas = $req->fetch(PDO::FETCH_ASSOC);
     
            return $datas;
    et tu affiche comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php foreach($datas as $data) { ?>
       <div style="border: 1px solid black;">
                 <h1><?php echo $data['title']; ?></h1>
           </div>
    <?php } ?>
    Si tu veux conserver fetchall(), fait des var_dump(), afin de voir tes différents arrays, et boucle autant de fois que nécessaire (2 fois normalement).

  3. #3
    Membre averti
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Par défaut
    Bonjour,

    Tout d'abord merci de ta réponse.

    J'avais déja fait un système similaire avant je crois, sauf qu'à la place du du <?php } ?> c'était un endforeach. Mais je voulais essayer de ne pas mettre de boucle dans la view, mais apparemment on peut pas passer outre. Du coup j'ai utilisé ta technique, et ça donne ça :

    ( ! ) Warning: Illegal string offset 'title' in C:\wamp64\www\OC-Project-4\view\frontend\home.php on line 12
    Call Stack
    # Time Memory Function Location
    1 0.0005 405112 {main}( ) ...\index.php:0
    2 0.0006 405880 Router->routeReq( ) ...\index.php:6
    3 0.0006 407160 require_once( 'C:\wamp64\www\OC-Project-4\controller\ControllerHome.php' ) ...\Router.php:13
    4 0.0007 408872 ControllerHome->__construct( ) ...\ControllerHome.php:30
    5 0.0007 408872 ControllerHome->showPosts( ) ...\ControllerHome.php:14
    6 0.0034 459408 require_once( 'C:\wamp64\www\OC-Project-4\view\frontend\home.php' ) ...\ControllerHome.php:24

    Je comprends pas d'où vient le pb (surement du fetch()), car avec un endforeach ça s'affichait correctement.

    EDIT : Par contre quand je re-utilise fetchAll(), plus d'erreur et les éléments de la boucle s'affiche.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 119
    Par défaut
    Fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php 
    echo '<pre>';
    echo print_r($datas);
    ?>
    sur $datas en sortie de fectch() et fais voir le résultat

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Tu peux combiner les deux en écrivant $data = $req->fetchAll(PDO::FETCH_ASSOC);.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre averti
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Par défaut
    Merci à vouys deux, le problème est résolu pour le moment.

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

Discussions similaires

  1. [OL-2013] Affichage Non lu dans une BAL Partagée Oulook 2013
    Par ricou77 dans le forum Outlook
    Réponses: 1
    Dernier message: 20/06/2016, 10h22
  2. Réponses: 0
    Dernier message: 25/01/2013, 11h14
  3. Réponses: 9
    Dernier message: 13/12/2009, 13h28
  4. Réponses: 2
    Dernier message: 15/12/2008, 18h04
  5. Affichages non voulu dans l'afficage des JSP
    Par Mathieu.J dans le forum JDeveloper
    Réponses: 1
    Dernier message: 18/06/2007, 14h43

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