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 :

Erreur "Call to a member function getTitle() on string" lors d'un ajout d'article


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 119
    Points : 64
    Points
    64
    Par défaut Erreur "Call to a member function getTitle() on string" lors d'un ajout d'article
    Bonjour,

    comme indiqué dans le titre, je souhaite ajouter un nouvel article sur mon blog. J'utilise le MVC et le CRUD (Create, read, update, delete).

    et içi c'est la méthode CREATE.

    Voila ma fonction newPost :

    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
     
     
    <?php
     
    require_once('model/Manager.php');
    require_once('Entity/Post.php');
     
    class PostManager {   //AJOUTER UN NOUVEL ARTICLE
        public function newPost($post) {
            $connexion = new Manager();
            $db = $connexion->dbConnect();
            $req = $db->prepare('INSERT INTO posts(title, content, creation_date) VALUES(?, ?,  NOW())');
            var_dump($req);
            $req->bindValue(1, $post->getTitle(), \PDO::PARAM_STR);
            $req->bindValue(2, $post->getContent(), \PDO::PARAM_STR);
            $req->execute();
            var_dump($req);
            return $req;
        }


    Le controleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //Ajouter un post 
    function addNewPost($post) {
        $postManager = new PostManager();
        $posts = $postManager->getPosts();
        $req = $postManager->newPost($post);
        header('Location: index.php?action=listPosts'); //Une fois l'article ajouté, renvoi sur la page d'accueil listPosts
    }


    içi mon entité :

    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
     
    <?php
     
    class Post {
     
      //Attributs  
      private $_id; 
      private $_title;
      private $_content;
      private $_creation_date;
     
     
        //SETTERS
        public function setTitle($title) {
            if(is_string($title)) {
                $this->_title = $title;
            }
        }
     
        public function setContent($content) {
            if (is_string($content)) {
                $this->_content = $content;
            }   
        }
     
        public function setDate($creation_date) {
            $this->_creation_date = $creation_date;
        }
     
        //GETTERS
        public function getId($id) {
            return $this->_id;
        }
     
        public function getTitle() {
            return $this->_title;
        }
     
        public function getContent() {
            return $this->_content;
        }
     
        public function getDate() {
            return $this->_creation_date;
        }
    }

    lorsque j'envoi le nouvel article, cela m'affiche cette erreur :

    Nom : erreur.png
Affichages : 270
Taille : 26,1 Ko


    Je peux lire l'erreur mais je ne la comprends pas , car pour moi le code est bon.

    Quelqu'un peut m'aider ?

  2. #2
    Membre habitué Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Points : 158
    Points
    158
    Par défaut
    Salut!

    L'erreur est suffisamment clair pour être comprise: tu fais appelle à une méthode d'objet sur une chaîne de caractère ce qui cause l'erreur. Je constate que ta fonction addNewPost() de ton contrôleur reçoit $postcomme paramètre. Essaye de var_dump() cette valeur pour vérifier que tu as bien un objet Post. Aussi, d'où est appelé cette fonction ? Peut-être que l'erreur est en amont.
    Traverse les rues ...

    Git: https://github.com/BlueSkunka

    Débutant à vie

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    Salut, merci pour ta réponse.

    j'ai placé un var_dump tout en haut de ma fonction addNewPost() et cela me retourne ceci :



    "C:\ProgramFiles\wamp\www\Projet4\Controller\frontend.php:103:string 'Titre' (length=5)"

    Le mot 'Titre' est le mot que j'ai écrit dans le champs title, du coup si je comprends bien ma variable $post retourne une string et non pas un objet.

    Enfait ce n'est pas totalement incohérent, car je dois quand même récupérer les variables $title et $content. Mais comment faire pour retourner un objet du coup ? parce que je dois passer par mon entité et non pas par la bdd....

    j'espère que je suis clair ^^

    Ma fonction addNewPost() est appelé dans l'index içi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      //Ajouter un post
        elseif ($_GET['action'] == 'addPost') {
            if (isset($_POST['title']) && isset($_POST['content'])) {
                if (!empty($_POST['title']) && !empty($_POST['content'])) {
     
                    addNewPost($_POST['title'], $_POST['content']);
                } else {
                    print "Veuillez remplir tout les champs !";
                }
            } else {
                print "Champs titre et contenu inexistant";
            }

  4. #4
    Membre habitué Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Points : 158
    Points
    158
    Par défaut
    Il te faut juste créer l'objet et le remplir à partir des valeurs présentent dont $_POST avant d'appeler ton manager, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        $post = new Post();
        $post->setTitle($_POST['title']);
        $post->setContent($_POST['content']);
        addNewPost($post);
    De cette manière tu envoie directement un objet à ton manager et non plus des chaînes de caractères.
    Traverse les rues ...

    Git: https://github.com/BlueSkunka

    Débutant à vie

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    Ah, je ne savais pas qu'en PHP on pouvait fonctionner comme ça, passer des variables en paramètre aux setters (finalement c'est un peu comme javascript) , vu comme ça ce n'est pas compliqué.

    Je pensais qu'il fallait faire bindValue() pour donner une valeur aux marqueurs nominatif.

    du coup voici mon code mis à jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        public function newPost($newPost) {
            $connexion = new Manager();
            $db = $connexion->dbConnect();
            $post = $db->prepare('INSERT INTO posts(title, content, creation_date) VALUES(?, ?,  NOW())');
            var_dump($post);
            $newPost = new Post();
            $newPost->setTitle($_POST['title']);
            $newPost->setContent($_POST['content']);
            $post->execute($newPost);
            var_dump($newPost);
            return $post;
        }}

    et dans le contrôleur je récupère $post, je crée une nouvelle instance de PostManager() pour pouvoir récupérer la fonction newPost() :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function addNewPost($post) {
        var_dump($post);
        $postManager = new PostManager();
        $postManager->newPost($post);
        header('Location: index.php?action=listPosts');
    }
    et dans mon index je n'ai plus qu'à écrire la fonction addNewPost() avec les 2 paramètres dont j'ai besoin ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      addNewPost($_POST['title'], $_POST['content']);

  6. #6
    Membre habitué Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Points : 158
    Points
    158
    Par défaut
    Je pense que tu t'emmêles un peu les pinceaux là, je vais essayer d'être plus clair.

    Déjà, il y a des notions de base qui me semble incomprise:

    - Ta fonction function addNewPost($post) reçoit un paramètre or tu fais appel à cette fonction en lui passant deux paramètres addNewPost($_POST['title'], $_POST['content']);.
    - Ensuite, dans ta fonction addNewPost($post) tu fais appel à ta fonction newPost($newPost) en lui passant le paramètre $post qui est, selon moi, erroné dans ce contexte suite à la première remarque.
    - Dans ta fonction newPost($newPost), tu redéfinis le paramètre reçu comme étant un nouvel objet $newPost = new Post() et perd donc les données de ce paramètre. De plus, tu fais appel à la variable $_POST qui n'existe plus dans ce contexte, elle n'existe que dans ton index qui traite la requête.

    Pour faire au plus simple, je vais te fournir un code qui me semble correct, avec quelques détails pour que tu comprennes mieux:
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    /**
         * Ta  class POST
         */
        class Post {
     
            //Attributs  
            private $_id; 
            private $_title;
            private $_content;
            private $_creation_date;
     
            // Un constructeur est appelé automatiquement lors de la création d'un objet grâce au mot clef "new"
            public function __construct($title, $content) {
                $this->_title = $title;
                $this->_content = $content;
            }
     
            //SETTERS
            public function setTitle($title) {
                if(is_string($title)) {
                    $this->_title = $title;
                }
            }
     
            public function setContent($content) {
                if (is_string($content)) {
                    $this->_content = $content;
                }   
            }
     
            public function setDate($creation_date) {
                $this->_creation_date = $creation_date;
            }
     
            //GETTERS
            public function getId($id) {
                return $this->_id;
            }
     
            public function getTitle() {
                return $this->_title;
            }
     
            public function getContent() {
                return $this->_content;
            }
     
            public function getDate() {
                return $this->_creation_date;
            }
        }
     
        /**
         * INDEX
         */
        addNewPost($_POST['title'], $_POST['content']); // Tu passes le contenu de ta variable $_POST à ta fonction addNewPost()
     
        /**
         * CONTROLEUR
         */
        function addNewPost($title, $content) {
            // Ici, tu crées ton objet à partir des données écrites par l'utilisateur transmises par ton index grâce au constructeur de ta classe
            $newPost = new Post($title, $content);
     
            $postManager = new PostManager();
            // Tu fais appel au manager en passant comme paramètre ton objet $post qui contient les données nécessaires
            $postManager->newPost($newPost);
     
            header('Location: index.php?action=listPosts');
        }
     
        /**
         * MANAGER
         */
        public function newPost($newPost) {
            // Le paramètre $newPost est donc ton objet POST qui contient un titre et un contenu.
     
            $connexion = new Manager();
            $db = $connexion->dbConnect();
            $req = $db->prepare('INSERT INTO posts(title, content, creation_date) VALUES(?, ?,  NOW())');
     
            // Tu binds les values comme tu le fesais
            $req->bindValue(1, $newPost->getTitle(), \PDO::PARAM_STR);
            $req->bindValue(2, $newPost->getContent(), \PDO::PARAM_STR);
     
            $req->execute($post);
     
            return $post;
        }}
    Lis bien le fonctionnement du code pour que tu assimiles ses principes. Il se peut qu'il ne soit pas 100% fonctionnel, je n'ai plus l'habitude de développement purement en PHP depuis que j'utilise un framework mais dans l'idée c'est ainsi que ça se passe.

    Pour le coup, le fonctionnement est très similaire à Javascript, si tu es habitué à ce langage, demande toi comment tu ferais en javascript et applique cette logique au PHP tout en appliquant la syntaxe de ce langage. Le processus que tu développes est basique et tu devrais pouvoir trouver beaucoup de tutoriel sur la question.

    Je te conseille ces tutoriels qui m'ont beaucoup aidé à mes début: pdo-soupe-lit et comprendre-pdo. Ils sont peut-être un peu âgé mais il y a de bonnes informations à prendre pour améliorer la qualité de ton développement, n'hésite pas à prendre un peu de ton temps pour les lire!

    Skunka.
    Traverse les rues ...

    Git: https://github.com/BlueSkunka

    Débutant à vie

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    Bon, après au moins 2h de travail intensif j'ai enfin trouvé la solution !

    L'erreur venait de l'exécution de ma requête. il fallait retourner un tableau contenant l'objet, et pas seulement l'objet en lui même.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        //AJOUTER UN NOUVEL ARTICLE
        public function newPost($newPost) {
            $connexion = new Manager();
            $db = $connexion->dbConnect();
            $post = $db->prepare('INSERT INTO posts(title, content, creation_date) VALUES(:title, :content,  NOW())');
            $post->bindValue(':title', $newPost->getTitle(), \PDO::PARAM_INT);
            $post->bindValue(':content', $newPost->getContent(), \PDO::PARAM_INT);
            $post->execute(array("title"=>$_POST['title'], "content"=>$_POST['content']));
            var_dump($post);
            return $post;
        }

    Puis avec un var_dump() j'ai la confirmation que cela a retourné l'objet sous forme d'array
    Images attachées Images attachées  

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    Merci skunka pour ta piste, j'ai repris ce que tu as fais en enlevant le constructeur de la class Post, car il me semble pas que ça soit nécessaire quand on a que des getters et des setters.
    Et merci aussi pour les documents que tu m'as conseillé !

  9. #9
    Membre habitué Avatar de Skunka
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 135
    Points : 158
    Points
    158
    Par défaut
    Salut,

    je suis content que tu es réussi !

    Pour le constructeur, c'est à toi de voir, il peut être utile pour éviter de faire appel à de multiples setteurs dans des objets plus complexes mais dans ton cas tu peux t'en passer! C'est également utile si tu souhaites définir des données par défaut.

    Comme tu execute() ta requête en lui passant un tableau, il se peut que les bindValue() ne soit pas utiles, tu pourras essayer de faire sans et voir le résultat, tu gagnerais peut-être 2 lignes de code ^^

    Sinon je te souhaite bonne continuation et n'oublie pas de marquer la discussion comme "Résolue".

    Cordialement,
    Skunka.
    Traverse les rues ...

    Git: https://github.com/BlueSkunka

    Débutant à vie

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

Discussions similaires

  1. Call to a member function add() on string
    Par MInfo25 dans le forum Débuter
    Réponses: 10
    Dernier message: 25/05/2018, 11h47
  2. [MySQL] Fatal error: Call to a member function fetch() on string
    Par Denis Placé dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/09/2017, 12h46
  3. [PDO] Erreur PDO : Call to a member function fetch() on a non-object
    Par numerodix dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 01/03/2010, 17h37
  4. [Joomla!] Erreur Call to a member function on a non-object
    Par tchaw dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 27/01/2010, 21h53
  5. Réponses: 4
    Dernier message: 02/10/2009, 10h12

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