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

Langage PHP Discussion :

Données d'array qui ne remontent pas à partir d'une classe


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 41
    Points : 28
    Points
    28
    Par défaut Données d'array qui ne remontent pas à partir d'une classe
    Bonjour,

    Je me heurte à un petit souci que je n'arrive pas à résoudre !

    J'ai une BDD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    /* Testé sous MySQL 5.x */
     
    drop table if exists T_COMMENTAIRE;
    drop table if exists T_BILLET;
     
    create table T_BILLET (
      BIL_ID integer primary key auto_increment,
      BIL_DATE datetime not null,
      BIL_TITRE varchar(100) not null,
      BIL_CONTENU varchar(400) not null
    ) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
     
    create table T_COMMENTAIRE (
      COM_ID integer primary key auto_increment,
      COM_DATE datetime not null,
      COM_AUTEUR varchar(100) not null,
      COM_CONTENU varchar(200) not null,
      BIL_ID integer not null,
      constraint fk_com_bil foreign key(BIL_ID) references T_BILLET(BIL_ID)
    ) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
     
    insert into T_BILLET(BIL_DATE, BIL_TITRE, BIL_CONTENU) values
    (NOW(), 'Premier billet', 'Bonjour monde ! Ceci est le premier billet sur mon blog.');
    insert into T_BILLET(BIL_DATE, BIL_TITRE, BIL_CONTENU) values
    (NOW(), 'Au travail', 'Il faut enrichir ce blog dès maintenant.');
     
    insert into T_COMMENTAIRE(COM_DATE, COM_AUTEUR, COM_CONTENU, BIL_ID) values
    (NOW(), 'A. Nonyme', 'Bravo pour ce début', 1);
    insert into T_COMMENTAIRE(COM_DATE, COM_AUTEUR, COM_CONTENU, BIL_ID) values
    (NOW(), 'Moi', 'Merci ! Je vais continuer sur ma lancée', 1);
    J'ai créé une classe qui gère notamment la partie billet tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?php
     
     
    class Billet
    {
        protected $id;
        protected $date;
        protected $titre;
        protected $contenu;
     
        public function hydrate($donnees)
        {
            foreach ($donnees as $attribut => $valeur)
            {
                $methode = 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
     
                if (is_callable(array($this, $methode)))
                {
                    $this->$methode($valeur);
                }
            }
        }
     
        public function getId()
        {
            return $this->id;
        }
        public function setId($id)
        {
            $this->id = $id;
        }
     
     
        public function getDate()
        {
            return $this->date;
        }
        public function setDate($date)
        {
            $this->date = $date;
        }
     
     
        public function getTitre()
        {
            return $this->titre;
        }
        public function setTitre($string)
        {
            $this->titre = $string;
            return $this;
        }
     
     
        public function getContenu()
        {
            return $this->contenu;
        }
        public function setContenu($string)
        {
            $this->contenu = $string;
            return $this;
        }
     
        public function save()
        {
            // connect to bdd & save
            $manager = new billetManager();
            $manager->persist($this);
            return $this;
        }
    }
    Ce billet est géré derrière par un manager et une fonction getBillets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
      public function getBillets()
        {
            $bdd = $this->bdd;
            $query = "SELECT * FROM T_BILLET";
            $req = $bdd->prepare($query);
            $req->execute();
            while ($row = $req->fetch(PDO::FETCH_ASSOC)) {
                // instance of a billet object
                $billet = new Billet();
                // hydrate manualy from bdd datas
                $billet->hydrate($row);
                // now you have an array of object (instead of an array of array)
                $billets[] = $billet;
            };
           if(isset($id)) {
               return $billets;
           }
        }
    Mon souci, est que mon id semble null. Enfin, dans ma base de données, il est normalement égal à 1 ou 2, vu que c'est le nombre de billets qui sont intégré à la table, mais sur ma page web, rien n'est retourné...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <?php
     
    include_once('_config.php');
     
    $multiBillet = new billetManager;
    $billets = $multiBillet->getBillets();
     
    include_once(PARTIAL . '_head.php');
    include_once(PARTIAL . '_nav.php');
     
    ?>
     
    <div id="contenu">
    <?php if (is_array($billets))
     foreach ($billets as $billet): ?>
            <article>
                <h1 class="numeroBillet">Extrait de l'Episode <?php echo $billet->getId(); ?></h1>
                <header>
                    <a href="<?= "index.php?action=billet&id=" . $billet->getId(); ?>">
                        <h1 class="titreBillet"><?php echo $billet->getTitre(); ?></h1>
                    </a>
                    <time><?php echo $billet->getDate(); ?></time>
                </header>
                <p><?php echo $billet->getContenu(); ?></p>
            </article>
            <hr />
         }
    Je ne sais plus trop quoi faire, si qqun a une idée ?..

    Merci d'avance !

  2. #2
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    A priori, ta méthode de remplissage cherche des méthodes dans ta classe qui correspondent aux noms dans ta base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $methode = 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
    Donc pour la colonne TRUC_MACHIN, il faut une méthode setTrucMachin et donc un attribut $trucMachin.

    Problème : tes colonnes ont un préfixe qui correspond à la table (BIL_ID, BIL_TITRE) alors que ta classe ne contient pas ces préfixes ($id, $titre)
    Donc deux possibilités : tu configures ta méthode de remplissage pour retirer automatiquement le préfixe (mais attention aux préfixes pour les clés étrangères) ou tu renommes tes attributs en tenant compte du préfixe.
    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]

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Merci pour ta réponse !

    Quelque chose comme ça pour ma classe du coup ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    <?php
     
     
    class Billet
    {
        protected $BIL_ID;
        protected $BIL_DATE;
        protected $BIL_TITRE;
        protected $BIL_CONTENU;
     
        public function hydrate($donnees)
        {
            foreach ($donnees as $attribut => $valeur)
            {
                $methode = 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
     
                if (is_callable(array($this, $methode)))
                {
                    $this->$methode($valeur);
                }
            }
        }
     
        public function getId()
        {
            return $this->BIL_ID;
        }
        public function setId($BIL_ID)
        {
            $this->id = $BIL_ID;
        }
     
     
        public function getDate()
        {
            return $this->BIL_DATE;
        }
        public function setDate($BIL_DATE)
        {
            $this->date = $BIL_DATE;
        }
     
     
        public function getTitre()
        {
            return $this->BIL_TITRE;
        }
        public function setTitre($string)
        {
            $this->titre = $string;
            return $this;
        }
     
     
        public function getContenu()
        {
            return $this->BIL_CONTENU;
        }
        public function setContenu($string)
        {
            $this->contenu = $string;
            return $this;
        }
     
        public function save()
        {
            // connect to bdd & save
            $manager = new billetManager();
            $manager->persist($this);
            return $this;
        }
    }
    Pour le moment ça ne me retourne toujours rien. Quand je fais un var_dump de billets dans ma vue, j'ai ça qui remonte :

    0 =>
    object(Billet)[11]
    protected 'BIL_ID' => null
    protected 'BIL_DATE' => null
    protected 'BIL_TITRE' => null
    protected 'BIL_CONTENU' => null
    1 =>
    object(Billet)[12]
    protected 'BIL_ID' => null
    protected 'BIL_DATE' => null
    protected 'BIL_TITRE' => null
    protected 'BIL_CONTENU' => null

    J'avais le même array qui remontait avant la modif

  4. #4
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par Celira Voir le message
    pour la colonne TRUC_MACHIN, il faut une méthode setTrucMachin et donc un attribut $trucMachin.
    Donc pour BIL_ID, il faut un attribut $bilId et les get/setters correspondants getBilId et setBilId (n'oublie pas de renommer aussi les get-setters)
    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]

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Ok !

    Donc à ce niveau là, j'ai modifié mon code tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    <?php
     
     
    class Billet
    {
        protected $bilId;
        protected $bilDate;
        protected $bilTitre;
        protected $bilContenu;
     
        public function hydrate($donnees)
        {
            foreach ($donnees as $attribut => $valeur)
            {
                $methode = 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
     
                if (is_callable(array($this, $methode)))
                {
                    $this->$methode($valeur);
                }
            }
        }
     
        public function getbilId()
        {
            return $this->bilId;
        }
        public function setbilId($bilId)
        {
            $this->id = $bilId;
        }
     
     
        public function getbilDate()
        {
            return $this->bilDate;
        }
        public function setbilDate($bilDate)
        {
            $this->date = $bilDate;
        }
     
     
        public function getbilTitre()
        {
            return $this->bilTitre;
        }
        public function setbilTitre($bilTitre)
        {
            $this->titre = $bilTitre;
        }
     
     
        public function getbilContenu()
        {
            return $this->bilContenu;
        }
        public function setbilContenu($bilContenu)
        {
            $this->contenu = $bilContenu;
        }
     
        public function save()
        {
            // connect to bdd & save
            $manager = new billetManager();
            $manager->persist($this);
            return $this;
        }
    }
    J'ai une nouvelle valeur de mon var_dump :
    0 =>
    object(Billet)[11]
    protected 'bilId' => null
    protected 'bilDate' => null
    protected 'bilTitre' => null
    protected 'bilContenu' => null
    public 'id' => string '1' (length=1)
    public 'date' => string '2017-10-18 16:35:34' (length=19)
    public 'titre' => string 'Premier billet' (length=14)
    public 'contenu' => string 'Bonjour monde ! Ceci est le premier billet sur mon blog.' (length=56)
    1 =>
    object(Billet)[12]
    protected 'bilId' => null
    protected 'bilDate' => null
    protected 'bilTitre' => null
    protected 'bilContenu' => null
    public 'id' => string '2' (length=1)
    public 'date' => string '2017-10-18 16:35:34' (length=19)
    public 'titre' => string 'Au travail' (length=10)
    public 'contenu' => string 'Il faut enrichir ce blog dès maintenant.' (length=41)

    En revanche, ces données ne redescendent pas dans ma vue alors que j'appelle du coup les bonnes méthodes normalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <?php if (is_array($billets))
        var_dump($billets);
     foreach ($billets as $billet): ?>
            <article>
                <h1 class="numeroBillet">Extrait de l'Episode <?php echo $billet->getbilId(); ?></h1>
                <header>
                    <a href="<?= "index.php?action=billet&id=" . $billet->getbilId(); ?>">
                        <h1 class="titreBillet"><?php echo $billet->getbilTitre(); ?></h1>
                    </a>
                    <time><?php echo $billet->getbilDate(); ?></time>
                </header>
                <p><?php echo $billet->getbilContenu(); ?></p>
            </article>
            <hr />

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Ok j'ai trouvé, il fallait juste que je change ma ligne tel que : <h1 class="numeroBillet">Extrait de l'Episode <?php echo $billet->id; ?></h1> au lieu d'appeler mon getbilId !

    Par contre, décidément, les liens entre BDD me résistent, mais j'aimerais aussi récupérer des commentaires d'une table t_commentaires, à l'aide d'une classe commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    <?php
     
    class Commentaire
    {
        protected $comId;
        protected $comDate;
        protected $comAuteur;
        protected $comContenu;
     
     
        public function hydrate($donnees)
        {
            foreach ($donnees as $attribut => $valeur)
            {
                $methode = 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
     
                if (is_callable(array($this, $methode)))
                {
                    $this->$methode($valeur);
                }
            }
        }
     
        public function getcomId()
        {
            return $this->comId;
        }
        public function setcomId($comId)
        {
            $this->id = $comId;
        }
     
     
        public function getcomDate()
        {
            return $this->comDate;
        }
        public function setDate($comDate)
        {
            $this->date = $comDate;
        }
     
     
        public function getcomAuteur()
        {
            return $this->comAuteur;
        }
        public function setAuteur($comAuteur)
        {
            $this->auteur = $comAuteur;
        }
     
     
        public function getcomContenu()
        {
            return $this->comContenu;
        }
        public function setcomContenu($comContenu)
        {
            $this->contenu = $comContenu;
        }
     
    }
    et de mon manager lié à cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <?php
     
    class commentaireManager extends bddManager
     
     
    {
     
        public function getCommentaires($id = null)
        {
            $bdd = $this->bdd;
            $query = 'SELECT COM_ID AS id, COM_DATE AS date_b, COM_AUTEUR AS auteur, COM_CONTENU AS contenu FROM T_COMMENTAIRE';
            ($id == null) ? $where = '' : $where = ' WHERE BIL_ID= :id ';
            $query .= $where;
            $query .= ' ORDER BY COM_ID desc ';
            ($id == null) ? $limit = 'LIMIT 0,3' : $limit = '';
            $query .= $limit;
            // echo $query; exit;
            $req = $bdd->prepare($query);
            if ($id) $req->bindParam(':id', $id);
            $req->execute();
     
            if ($req->rowCount() > 0) {
                while ($row = $req->fetch(PDO::FETCH_ASSOC)) {
                    // instance of a commentaire object
                    $commentaire = new Commentaire();
                    // hydrate manualy from bdd datas
                    $commentaire->hydrate($row);
     
                    $commentaires[] = $row;
                }
                return $commentaires;
            }
    //        else {
    //            $commentaires[] = null;
    //        }
    //        return $commentaires;
        }
    }
    En retour, j'ai bien mon petit tableau qui ressort :
    'id' => string '2' (length=1)
    'date_b' => string '2017-10-18 16:35:34' (length=19)
    'auteur' => string 'Moi' (length=3)
    'contenu' => string 'Merci ! Je vais continuer sur ma lancée' (length=40)

    Mais j'ai aussi un petit message d'erreur sur chaque champ appelé dans ma vue : Trying to get property of non-object

    Visiblement, il y aurait donc un problème avec ma PDO, mais j'ai beau retourner mon code dans tous les sens, je ne vois pas où... J'instancie pourtant bien ma classe commentaire, donc je ne devrais normalement pas avoir ce problème la...

Discussions similaires

  1. [XL-2010] Créer un onglet qui n'existe pas à partir d'une liste
    Par janakka-horus dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 14/06/2017, 16h26
  2. Problème d'accents qui ne veut pas partir
    Par grabriel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/09/2008, 11h12
  3. Base de données d'exemple qui ne marche pas
    Par kedare dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 29/11/2007, 04h21
  4. Des virgules qui ne veulent pas partir
    Par Swiper dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/08/2007, 14h55
  5. Réponses: 1
    Dernier message: 10/02/2007, 02h09

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