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):
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
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(); }
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
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); } }
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 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; } }
template.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; } }
listPostView.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>
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 <?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'); ?>
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
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&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'); ?>
Cela fait 3 jours que j'inspecte mon code, et je ne trouve toujours pas le problème...
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
Merci d'avance pour votre aide![]()
Partager