Bonjour à tous,
Je vous remercie d’avance pour l’aide que vous m’apporterez car j’ai lu et relu mon code et je ne comprend toujours pas quel est le problème..
Dans ce TP, on nous demande de mettre un lien après chaque commentaire avec la mention "modifier", afin de modifier le commentaire.
Ce lien doit nous amener sur une autre page où un formulaire doit nous permettre de modifier l’auteur du commentaire ainsi que son message.
Tout est OK ! sauf lorsque je clique sur l bouton "valider".
Je suis tombé sur 2 messages en bidouillant un peu :
-
Une page totalement blanche (mais qui redirige bien vers le lien en question), bien que dans mon code je redirige l’utilisateur vers la page de l’article et là rien ne se passe.
-
et la deuxième erreur c’est ce message d’erreur : "Catchable fatal error: Object of class PDOStatement could not be converted to string in C:\wamp64\www\mvc\model\CommentManager.php on line 42"
J’ai déja rencontré ce problème, je devais faire un fetch sur une requête SELECT car la variable en question était un objet, par contre la lorsque je fais un var_dump() de mes variables post,comments, ce sont tous les deux des arrays, donc je ne vois pas où est le problème..
J’aimerais si vous le pouvez, m’orienter et ne pas me donner de réponse svp.
Merci d’avance
page index.php
<?php
require('controller/frontend.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 !');
}
}
}elseif ($_GET['action'] == "viewComment"){
if(isset($_GET['comment_id']) && $_GET['comment_id'] > 0){
viewComment();
}
}elseif($_GET['action'] == "updateComment"){
if (isset($_GET['id']) && $_GET['id'] > 0)
{
if (!empty($_POST['author']) && !empty($_POST['comment']))
{
updateComment($_GET['id'], $_POST['author'], $_POST['comment'],$_GET['comment_id']);
}
else
{
throw new Exception('Tous les champs ne sont pas remplis !');
}
}
}else {
}
}else {
listPosts();
}
} catch(Exception $e) {
echo 'Erreur : ' . $e->getMessage();
}
controller.php
<?php
// Chargement des classes
require_once('model/PostManager.php');
require_once('model/CommentManager.php');
function listPosts()
{
$postManager = new \OpenClassrooms\Blog\Model\PostManager();
$posts = $postManager->getPosts();
require('view/frontend/listPostsView.php');
}
function post()
{
$postManager = new \OpenClassrooms\Blog\Model\PostManager();
$commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
$post = $postManager->getPost($_GET['id']);
$comments = $commentManager->getComments($_GET['id']);
require('view/frontend/postView.php');
}
function viewComment(){
$postManager = new \OpenClassrooms\Blog\Model\PostManager();
$commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
$post = $postManager->getPost($_GET['id']);
$comments = $commentManager->getComment($_GET['comment_id']);
var_dump($comments);
require "view/frontend/commentView.php";
}
function addComment($postId, $author, $comment)
{
$commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
$affectedLines = $commentManager->postComment($postId, $author, $comment);
if ($affectedLines === false) {
throw new Exception('Impossible d\'ajouter le commentaire !');
}
else {
header('Location: index.php?action=post&id=' . $postId);
}
}
function updateComment($postId, $author, $comment, $commentId)
{
$commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
$affectedLines = $commentManager->changeComment($postId, $author, $comment, $commentId);
if ($affectedLines === false) {
throw new Exception('Impossible de modifier le commentaire !');
}
else {
header('Location: index.php?action=post&id='.$postId);
}
}
CommentManager.php
<?php
namespace OpenClassrooms\Blog\Model;
use \PDO;
require_once("model/Manager.php");
class CommentManager extends Manager
{
public function getComments($postId)
{
$db = $this->dbConnect();
$comments = $db->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 DESC');
$comments->execute(array($postId));
return $comments;
}
public function getComment($commentId)
{
$db = $this->dbConnect();
$comments = $db->prepare('SELECT id, author, comment, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\') AS comment_date_fr FROM comments WHERE id = ? ORDER BY comment_date DESC');
$comments->execute(array($commentId));
$data = $comments->fetch();
return $data;
}
public function postComment($postId, $author, $comment)
{
$db = $this->dbConnect();
$comments = $db->prepare('INSERT INTO comments(post_id, author, comment, comment_date) VALUES(?, ?, ?, NOW())');
$affectedLines = $comments->execute(array($postId, $author, $comment));
return $affectedLines;
}
public function changeComment($postId, $author, $comment, $commentId){
$db = $this->dbConnect();
$comment = $db->prepare("UPDATE comments SET author = ?, comment = ?, comment_date = NOW() WHERE id = ? AND post_id = ?");
$affectedComment = $comment->execute(array($author, $comment, $commentId, $postId));
return $affectedComment;
}
}
et ma vue commentView.php
<?php $title = htmlspecialchars($post['title']); ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p><a href="index.php?action=post&id=<?= $post['id']?>">Retour au précédent billet</a></p>
<div class="news">
<h3>
<?= htmlspecialchars($post['title']) ?>
<em>le <?= $post['creation_date_fr'] ?></em>
</h3>
<p>
<?= nl2br(htmlspecialchars($post['content'])) ?>
</p>
</div>
<h2>Modifier le commentaire</h2>
<form action="index.php?action=updateComment&id=<?= $post["id"]?>&comment_id=<?= $comments['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>
</form>
<?php $content = ob_get_clean(); ?>
<?php require('template.php'); ?>