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 :

Undefined variable incompréhensible en MVC et POO


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 3
    Par défaut Undefined variable incompréhensible en MVC et POO
    Bonjour à tous,
    Je suis en train de suivre le cours sur l'architecture MVC en PHP.
    Tout allait bien jusqu'à devoir créer un routeur...
    Avant tout, voici les codes nécessaires:

    index.php (le routeur):
    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
    <?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('Aucun identifiant de billet envoyé');
     
    		}
    	}
    	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('tous les champs ne sont pas remplis');
     
    			}
    		}
    		else {
    			throw new Exception('Aucun identifiant de billet envoyé');
     
    		}
    	}
    	}
    	else {
    		listPosts();
    	}
    } catch (Exception $e) {
    	echo 'Erreur: ' . $e->getMessage();
    }
    controller.php:
    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
    <?php
     
    //Chargement des classes
    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/viewPost.php');
    }
     
    function addComment($postId, $author, $comment)
    {
    	$commentManager = new CommentManager();
     
    	$affectedLines = $commentManager->postComments($postId, $author, $comment);
     
    	if ($affectedLines === false) {
    		throw new Exception('Impossible d\'ajouter le commentaire');
     
    	}
    	else {
    		header('Location: index.php?action=post&id=' . $postId);
    	}
    }
    postManager.php:
    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
    <?php 
    /**
    * 
    */
    class PostManager
    {
    	public function getPosts()
    	{
    		$db = $this->dbConnect();
     
    		$dbreq = $db->query('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%imins%ss\') AS creation_date FROM billets ORDER BY date_creation DESC LIMIT 0, 5');
     
    		return $dbreq;
    	}
     
    	public function getPost($idPost)
    	{
    		$db = $this->connectDb();
     
    		$reqpost = $db->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%imins%ss\') AS creation_date FROM billets WHERE id=?');
    		$reqpost->execute(array($idPost));
     
    		$post = $reqpost->fetch();
     
    		return $post;
    	}
     
    	private function dbConnect()
    {
    	$db = new PDO("mysql:host=localhost;dbname=test", 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    	return $db;
    }
    }
    CommentManager.php:
    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
    <?php
    /**
    * 
    */
    class CommentManager
    {
     
    	public function getComments($idPost)
    	{
    		$db = $this->dbConnect();
     
    		$comments = $db->prepare('SELECT id, auteur, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imins%ss\') AS creation_date_fr FROM commentaires WHERE id_billet=? ORDER BY date_commentaire DESC');
    		$comments->execute(array($idPost));
     
    		return $comments;
    	}
     
    	public function postComments($postId, $postAuthor, $postComment)
    	{
    		$db = $this->dbConnect();
     
    		$reqPostComments = $db->prepare('INSERT INTO commentaires(id_billet, auteur, commentaire, date_commentaire) VALUES (?, ?, ?, NOW())');
    		$affectedlines = $reqPostComments->execute(array($postId, $postAuthor, $postComment));
     
    		return $affectedlines;
    	}
     
    	private function dbConnect()
    	{
    		$db = new PDO("mysql:host=localhost;dbname=test", 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    		return $db;
    	}
    }
    template.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8" />
    	<title><?= $title ?></title>
    	<link rel="stylesheet" type="text/css" href="public/css/style.css" />
    </head>
    <body>
    	<?= $content ?>
    </body>
    </html>
    listPostView.php:
    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
    	<?php $title = 'Mon super blog'; ?>
     
    	<?php ob_start(); ?>
    	<p>Derniers billets</p>
    	<?php
    	while($data = $posts->fetch())
    	{
    	?>
    	<div class="news">
    		<h3><?= $data['titre']; ?><em><?= $data['creation_date']; ?></em></h3>
    		<p><?= $data['contenu']; ?><br />
    			<a href="view/viewPost.php?id=<?= $data['id']; ?>">Commentaires</a></p>
    	</div>
     
    	<?php 
    	}
    	$posts->closeCursor();
    	?>
     
    	<?php $content = ob_get_clean(); ?>
    	<?php require('template.php'); ?>
    viewPost.php:
    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
    	<?php $title = 'Commentaires'; ?>
     
    	<?php ob_start(); ?>
    	<h1>Mon super blog!</h1>
    	<p><a href="../index.php">Retourner à la liste des billets</a></p>
     
    	<div class="news">
    		<h3><?php echo $post['titre']; ?><em><?php echo $post['creation_date']; ?></em></h3>
    		<p><?= $post['contenu']; ?></p>
    	</div>
     
    	<h2>Commentaires</h2>
     
    	<form action="index.php?action=addComment&amp;id=<?= $post['id'];?>" method="post">
    		<div>
    			<label for="author">Auteur</label><br />
    			<input type="text" id="author" name="author" />
    		</div>
     
    		<div>
    			<label for="comment">Commentaire</label><br />
    			<textarea id="comment" name="comment"></textarea>
    		</div>
     
    		<div>
    			<input type="submit" />
    		</div>
     
     
    	<?php
    	while ($comment = $comments->fetch()) {
    	?>
    	<strong><?= $comment['auteur']; ?></strong> le <?= $comment['creation_date_fr']; ?></strong>
    	<p><?= $comment['commentaire'] ?></p>
     
    	<?php
    	}
    	?>
    	<?php $content = ob_get_clean(); ?>
    	<?php require('template.php'); ?>
    Et alors que tout fonctionne pour la page listPostsView.php, lorsque je clique sur le lien Commentaires pour afficher les commentaires liés au post ou pour pouvoir le commenter, j'ai les erreurs suivantes qui s'affichent:
    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
    Notice: Undefined variable: post in E:\wamp\www\php\mysql\TP blog\view\viewPost.php on line 8
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0013	242720	{main}( )	...\viewPost.php:0
     
    ( ! ) Notice: Undefined variable: post in E:\wamp\www\php\mysql\TP blog\view\viewPost.php on line 8
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0013	242720	{main}( )	...\viewPost.php:0
     
    ( ! ) Notice: Undefined variable: post in E:\wamp\www\php\mysql\TP blog\view\viewPost.php on line 9
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0013	242720	{main}( )	...\viewPost.php:0
     
     Notice: Undefined variable: comments in E:\wamp\www\php\mysql\TP blog\view\viewPost.php on line 31
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0013	242720	{main}( )	...\viewPost.php:0
     
    ( ! ) Fatal error: Call to a member function fetch() on null in E:\wamp\www\php\mysql\TP blog\view\viewPost.php on line 31
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0013	242720	{main}( )	...\viewPost.php:0
    Cela fait 3 jours que j'inspecte mon code, et je ne trouve toujours pas le problème...
    Merci d'avance pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Comme le disent les messages d'erreur, regarde viewPost.php, lignes 8, 9,....

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 3
    Par défaut
    Bonjour jreaux62,

    J'ai beau regarder aux lignes 8 et 9, je ne trouve pas mon erreur. Ma variable $post existe, elle est renvoyée par postManager.php à controller.php, et controller.php la renvoit à viewPost.php. C'est pour ça que je ne comprends pas pourquoi le serveur dit qu'il ne reconnait pas la variable $post (et c'est pareil pour $comments)...

  4. #4
    Invité
    Invité(e)
    Par défaut
    dans listPostView.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="view/viewPost.php?id=<?= $data['id']; ?>">Commentaires</a>
    Tu vas afficher directement viewPost.php. (ce qui explique pourquoi les variables ne sont pas définies !)
    C'est une erreur.
    Qui prouve que tu n'as pas compris le principe du MVC...

    Il faut passer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="index.php?action=.......&id=<?= $data['id']; ?>">Commentaires</a>
    action=post, si je ne m'abuse.... (?)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 3
    Par défaut
    Merci beaucoup! effectivement j'étais passé à côté de ça...

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

Discussions similaires

  1. [PDO] Undefined variable + Call to a member function query() on a non-object + MVC
    Par blopjerem dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/10/2009, 20h35
  2. [MVC]Modélisation POO avec BD
    Par fremsoi dans le forum MVC
    Réponses: 1
    Dernier message: 08/11/2005, 13h53
  3. Réponses: 2
    Dernier message: 01/11/2005, 15h04
  4. Notice: Undefined variable
    Par kayn dans le forum Langage
    Réponses: 2
    Dernier message: 03/10/2005, 20h44
  5. Réponses: 3
    Dernier message: 22/09/2005, 11h24

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