Partage
  • Partager sur Facebook
  • Partager sur Twitter

Undefined function pourtant définie en MCV

    29 novembre 2020 à 13:55:31

    Bonjour à tous, je suis sur le cours MVC en PHP, et je suis actuellement sur le dernier exercice : modifier un commentaire.

    Pour commencer, voici l'erreur qui s'affiche quand j'exécute les fichiers : 

    Fatal error: Uncaught Error: Call to undefined function getComment() in /Applications/MAMP/htdocs/coursphp/blog_mvc/index.php:38 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/coursphp/blog_mvc/index.php on line 38

    Ensuite, voilà les fichiers :

    CommentManager.php:

    <?php
    class CommentManager
    {
    	public function getComments($postId)
    	{
    		$bdd = $this->dbConnect();
    		
    		$comments = $bdd->prepare('SELECT id,author, comment, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\') AS comment_date_fr FROM comments WHERE post_id = ? ORDER BY comment_date');
    		$comments->execute(array($postId));
    
    		return $comments;
    	}
    
    	public function postComment($postId, $author, $comment)
    	{
    		$bdd = $this->dbConnect();
    
    		$comments = $bdd->prepare('INSERT INTO comments(post_id, author, comment, comment_date) VALUES (?, ?, ?, NOW())');
    		$affectedLines = $comments->execute(array($postId, $author, $comment));
    
    		return $affectedLines;
    	}
    
    	public function getComment($commentId)
    	{
    		$bdd = $this->dbConnect();
    
    		$comment = $bdd->prepare('SELECT id, author, comment FROM comments WHERE id= ?');
    		$selectedComment = $comment->execute(array($commentId));
    
    		return $selectedComment;
    	}
    
    	public function updateComment($commentId, $comment)
    	{
    		$bdd = $this->dbConnect();
    
    		$comment = $bdd->prepare('UPDATE comments SET comment= ? WHERE comment_id= ?');
    		$affectedComment = $comment->execute(array($comment, $comment_id));
    
    		return $affectedComment;
    	}
    
    	private function dbConnect()
    	{
    		$bdd = new PDO("mysql:host=localhost;dbname=test;charset=utf8", 'root', 'root');
    
    		return $bdd;
    	}
    }

    controller.php :

    <?php
    
    require_once('model/postManager.php');
    require_once('model/commentManager.php');
    
    function listPosts()
    {
    	$postManager = new postManager();
    	$posts = $postManager->getPosts();
    
    	require('view/listPostsView.php');
    }
    
    function post()
    {
    	$postManager = new postManager();
    	$commentManager = new CommentManager();
    
    	$post = $postManager->getPost($_GET['id']);
    	$comments = $commentManager->getComments($_GET['id']);
    
    	require('view/postView.php');
    }
    
    function addComment($postId, $author, $comment)
    {
    	$commentManager = new CommentManager();
    
    	$affectedLines = $commentManager->postComment($postId, $author, $comment);
    
    	if ($affectedLines === false) 
    	{
    		throw new Exception('Erreur : Impossible d\'ajouter le commentaire');
    	}
    	else
    		header('Location: index.php?action=post&id=' . $postId);
    }
    
    function showComment($commentId)
    {
    	$viewComment = new CommentManager();
    
    	$affectedComment = $viewComment->getComment($commentId);
    
    	if ($affectedComment === false) 
    	{
    		throw new Exception('Impossible d\'afficher le commentaire');
    	}
    	else
    		header('Location: index.php?action=showComment&id=' . $commentId);
    
    	require('view/commentView.php');
    }

    Et enfin, index.php :

    <?php
    require('controller/controller.php');
    try 
    {
        if (isset($_GET['action'])) 
        {
            if ($_GET['action'] == 'listPosts') 
            {
                listPosts();
            }
            elseif ($_GET['action'] == 'post') 
            {
                if (isset($_GET['id']) && $_GET['id'] > 0) 
                {
                    post();
                }
                else
                    throw new Exception('Erreur : aucun id de billet envoyé', 1);
            }
            elseif ($_GET['action'] == 'addComment') 
            {
                if (isset($_GET['id']) && $_GET['id'] > 0) 
                {
                    if (!empty($_POST['author']) && !empty($_POST['comment'])) 
                    {
                        addComment($_GET['id'], $_POST['author'], $_POST['comment']);
                    }
                    else
                        throw new Exception("Erreur : Tous les champs ne sont pas remplis", 1);
                }
                else
                    throw new Exception("Erreur : l'id est introuvable", 1);
            }
            elseif ($_GET['action'] == 'showComment') 
            {
                if (isset($_GET['id']) && $_GET['id'] > 0) 
                {
                    getComment($_GET['id']);
                }
                else
                    throw new Exception("Erreur : id introuvable ou vide", 1);
                    
            }
        }
        else
            listPosts();
    
    } 
    catch (Exception $e) 
    {
        echo'Erreur: ' . $e->getMessage();
    }

    En fait, j'ai bien compris la signification de l'erreur, mais je ne sais pas pourquoi elle survient alors que la fonction getComment() est bien définie dans CommentManager.php.

    Merci d'avance pour votre aide :)



    • Partager sur Facebook
    • Partager sur Twitter

    P77

      29 novembre 2020 à 14:50:39

      Sauf que getComment est une méthode (de ta classe CommentManager), pas une fonction. On notera que le message d'erreur mentionne bien une fonction qui n'existe pas.

      A moins que ton getComment (en ligne 38 de index.php) n'eusse censé être un showComment ? (ce qui serait déjà plus logique avec le reste)

      -
      Edité par julp 29 novembre 2020 à 15:00:02

      • Partager sur Facebook
      • Partager sur Twitter
        1 décembre 2020 à 9:17:44

        Bonjour,

        Désolé pour le retard de réponse. Effectivement, le problème venait de là. Je n'avais pas encore compris toute la subtilité du MVC. En revanche, maintenant, quand je clique sur modifier le commentaire, le navigateur me renvoie une page d'erreur avec le message suivant : 

        Cette page ne fonctionne pas
        localhost vous a redirigé à de trop nombreuses reprises.
        Essayez de supprimer les cookies..
        ERR_TOO_MANY_REDIRECTS

        J'ai supprimé les cookies mais cela ne fonctionne toujours pas. Une idée ?

        Merci beaucoup :)

        -
        Edité par programmeur77 1 décembre 2020 à 9:31:19

        • Partager sur Facebook
        • Partager sur Twitter

        P77

          1 décembre 2020 à 11:24:56

          Sauf que updateComment n'est appelée par personne sur tes codes initiaux ... (= il faudrait commencer par nous redonner ton code à jour)

          -
          Edité par julp 1 décembre 2020 à 11:39:54

          • Partager sur Facebook
          • Partager sur Twitter

          Undefined function pourtant définie en MCV

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown