J'ai essayé d'implémenter la fonctionnalité "Modification de commentaire" dans l'activité du cours sur l'Architecture en MVC. Merci à ceux qui m'avaient signalé les erreurs relatives au nombre d'arguments. C'est réglé.
Cependant, je ne parviens toujours pas à modifier les commentaires.
Si je modifie un commentaire et que je l'envoie, je reçois à présent l'erreur "Tous les champs ne sont pas remplis". Pourtant, je les renseigne. En mettant un var_dump, je vois que l'id n'est pas récupérée. Mais, je ne vois pas pourquoi. Comment peut on s'y prendre pour que l'id puisse être récupérée ?
J'ai beau me creuser la tête, insister, passer à autre chose et revenir sur ce travail, je ne vois pas ce qui bloque. J'ai passé un temps fou sur ce TP et si quequ'un pouvait m'aider à comprendre, ce serait vraiment sympas. Je commence à penser à le mettre de côté. Je ne vois plus où chercher. Merci.
frontend.php:
<?php
// Chargement des classes
require_once('model/PostManager.php');
require_once('model/CommentManager.php');
function listPosts()
{
$postManager = new \Laure\MVC\Model\PostManager();
$posts = $postManager->getPosts();
require('view/frontend/listPostsView.php');
}
function post()
{
$postManager = new \Laure\MVC\Model\PostManager();
$commentManager = new \Laure\MVC\Model\CommentManager();
$post = $postManager->getPost($_GET['id']);
$comments = $commentManager->getComments($_GET['id']);
require('view/frontend/postView.php');
}
function addComment($postId, $author, $comment)
{
$commentManager = new \Laure\MVC\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 modifyComment($author, $comment)
{
$commentManager = new \Laure\MVC\Model\CommentManager();
$affectedComment = $commentManager->editComment($author, $comment);
if($affectedComment === false) {
throw new Exception('Erreur lors du remplacement du commentaire !');
}
else {
header('Location: /architecture_en_mvc/index.php?action=modifyComment&id=' .$_GET['id']);
}
}
index.php :
<?php
if(!empty($_GET['id'])){
setcookie("cookie_id", $_GET['id'], time()+24*3600*365, null, null, false, true);
session_start();
}
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 !');
}
}
else {
throw new Exception('Aucun identifiant de billet envoyé');
}
}
elseif ($_GET['action'] == 'modifyComment') {
if(isset($_GET['id']) && $_GET['id'] > 0) {
if(!empty($_POST['author']) && !empty($_POST['comment'])) {
$_COOKIE['cookie_id'] = $_GET['id'];
$test=$_GET['id'];
modifyComment($_GET['id'], $_POST['author'], $_POST['comment']);
}
else {
// throw new Exception('Tous les champs ne sont pas remplis');
var_dump($test);
}
}
throw new Exception('Aucun identifiant de commentaire envoyé');
}
}
else {
listPosts();
}
}
catch(Exception $e) {
echo 'Erreur : ' . $e->getMessage();
}
commentManager.php :
<?php
namespace Laure\MVC\Model;
require_once("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 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 editComment($author, $comment)
{
$db = $this->dbConnect();
$comments = $db -> prepare('UPDATE comments SET author = :author, comment = :comment WHERE id = :id');
$affectedComment = $comments->execute(['id' => $id, 'author' => $author, 'comment' => $comment]);
return $affectedComment;
/* header('Location:../view/frontend/postview.php?amp;id=<?php echo $_COOKIE['cookie_id'];?>');*/
var_dump($_COOKIE['cookie_id']);
}
}
Sinon c'est normal que tu n'obtiennes rien dans ton var_dump, étant donné que tu ne défini la variable test que dans le premier cas de la condition, alors que tu fais le var_dump sur la variable dans le second cas de la condition, par conséquent lorsque tu fais le var_dump de la variable, elle n'est pas définie.
- Edité par Lartak 21 mai 2019 à 12:11:40
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Oui, merci, je viens de placer ma variable au début du code et des var_dump à toutes les conditions. J'obtiens à présent l'id avec mon var_dump. Le problème ne semble donc pas être ici. L'ID est récupérée. Mais dans ce cas, pourquoi est-ce que j'obtiens un message comme quoi je n'ai pas rempli tous les champs puisqu'ils sont bel et bien remplis (author et comment uniquement) ?
Voici ce que j'ai fait :
elseif ($_GET['action'] == 'modifyComment')
{
$id = $_GET['id'];
$test=$_GET['id'];
if(isset($_GET['id']) && $_GET['id'] > 0)
var_dump($test);
{
if(!empty($_POST['author']) && !empty($_POST['comment']))
{
$_COOKIE['cookie_id'] = $_GET['id'];
modifyComment($_GET['id'], $_POST['author'], $_POST['comment']);
// var_dump($test);
}
else
{
throw new Exception('Tous les champs ne sont pas remplis');
// var_dump($test);
}
}
throw new Exception('Aucun identifiant de commentaire envoyé');
// var_dump($test);
}
J'obtiens toujours l'erreur 'Tous les champs ne sont pas remplis'.
Je joins les fichiers manquants ci-dessous :
updateComment.php (contient le formulaire de modification d'un commentaires) :
<?php
session_start();
?>
<?php require('../../model/CommentManager.php'); ?>
<?php $title = 'Modification de commentaire'; ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p><a href="/architecture_en_mvc/index.php">Retour à la liste des billets</a></p>
<h2>Modification du commentaire</h2>
<form action="/architecture_en_mvc/index.php?action=modifyComment&id=<?php echo $_COOKIE['cookie_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" value="Envoyer" name="submit"/>
</div>
</form>
<?php
if(!empty($_POST['author']) && !empty($_POST['comment']))
{
header('Location:/architecture_en_mvc/view/frontend/postView.php');
}
else{
echo 'Veuillez remplir l\'ensemble des champs svp.';
}
?>
<?php $content = ob_get_clean(); ?>
<?php require('template.php'); ?>
<?php
var_dump ($_COOKIE['cookie_id']);
?>
Première chose, tu dois définir ta variable id qu'à l'intérieur de la condition qui vérifie que le paramètre id existe dans l'url, d'ailleurs à ce propos, tu peux remplacer la condition par :
if (!empty($_GET['id'])) {
Cela fait la même chose que ce que tu avais fait, mais c'est raccourci.
Seconde chose, à définir une variable, autant l'utiliser, non ?
Troisième chose, dans ton fichier updateComment.php, tu devrais enlever le code de la ligne 30 à 38, car lorsque que l'utilisateur arrive sur la page, l'utilisateur aura forcément le message du second cas, étant donné que le formulaire n'a pas encore pu être soumis. Quatrième chose, dans la fonction modifyComment, tu passes 3 arguments, alors qu'elle n'en attend que deux, il te faut donc ajouter en première position des arguments de la fonction une variable concernant l'id de l'enregistrement à modifier, pareil pour la méthode editComment, sauf que dans ce cas là, tu ne lui passe même pas l'id du commentaire à modifier et pourtant tu utilises la variable id dans ta requête SQL, alors que cette variable n'est même pas définie.
- Edité par Lartak 21 mai 2019 à 14:17:10
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Si tu es sûre que tous les champs sont bien rempli quand tu obtiens ce message, je ne vois pas vraiment pourquoi tu l'obtiens.
Par contre, soit tu enlèves la seconde exception, ou alors, modifies tes conditions, par exemple :
if (!empty($_GET['id']) && !empty($_POST['author']) && !empty($_POST['comment'])) {
// ...
} else if (empty($_GET['id'])) {
throw new Exception('Aucun identifiant de commentaire envoyé');
} else {
throw new Exception('Tous les champs ne sont pas remplis');
}
- Edité par Lartak 21 mai 2019 à 18:21:35
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Merci Lartak pour tes commentaires et suggestions, le code est plus lisible ainsi.
J'ai fait des modifications supplémentaires et à présent, je suis redirigé correctement après avoir validé ma modification de message. Je n'ai plus de messages d'erreur.
Cependant, mes commentaires modifiés n'entrent pas en base et et ne s'affichent pas.
J'ai relu et remanié mon code depuis plusieurs semaines et je n'arrive pas à voir d'où vient le problème, je ne vois vraiment pas comment le résoudre de ce fait. Si quelqu'un pouvait me mettre sur la piste, me dire quel type d'erreur j'ai fait, cela me permettrait peut-être d'avancer. Merci. Je remets mon nouveau code ci-dessous.
index.php :
<?php
if(!empty($_GET['id']))
{
setcookie("cookie_id", $_GET['id'], time()+24*3600*365, null, null, false, true);
session_start();
}
require('controller/frontend.php');
try {
if(isset($_GET['action']))
{
// CAS 1 - liste des billets
if ($_GET['action'] == 'listPosts') {
listPosts();
}
// CAS 2 - affichage d'un billet
elseif ($_GET['action'] == 'post')
{
if (isset($_GET['id']) && $_GET['id'] > 0) {
post();
}
else
{
throw new Exception('Aucun identifiant de billet envoyé');
}
}
// CAS 3 - ajouter un commentaire
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é');
}
}
// CAS 4 - Modifier un commentaire
elseif($_GET['action'] == 'modifyComment')
{
if(!empty($_GET['id']) && !empty($_POST['author']) && !empty($_POST['comment']))
{
$id = $_GET['id'];
$_COOKIE['cookie_id'] = $id;
modifyComment($_GET['id'], $_POST['author'], $_POST['comment']);
}
else if(empty($_GET['id']))
{
throw new Exception('Aucune ID envoyée');
}
else
{
throw new Exception('Tous les champs ne sont pas remplis');
}
}
}
else
{
listPosts();
}
}
catch(Exception $e)
{
echo 'Erreur : ' . $e->getMessage();
}
frontend.php :
<?php
// Chargement des classes
require_once('model/PostManager.php');
require_once('model/CommentManager.php');
function listPosts()
{
$postManager = new \Laure\MVC\Model\PostManager();
$posts = $postManager->getPosts();
require('view/frontend/listPostsView.php');
}
function post()
{
$postManager = new \Laure\MVC\Model\PostManager();
$commentManager = new \Laure\MVC\Model\CommentManager();
$post = $postManager->getPost($_GET['id']);
$comments = $commentManager->getComments($_GET['id']);
require('view/frontend/postView.php');
}
function addComment($postId, $author, $comment)
{
$commentManager = new \Laure\MVC\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 modifyComment($id, $author, $comment)
{
$commentManager = new \Laure\MVC\Model\CommentManager();
$affectedComment = $commentManager->editComment($id, $author, $comment);
if($affectedComment === false)
{
throw new Exception('Erreur lors du remplacement du commentaire !');
}
else
{
header('Location:index.php?action=post&id=' .$_GET['id']);
}
}
updateComment.php :
<?php
session_start();
?>
<?php require('../../model/CommentManager.php'); ?>
<?php $title = 'Modification de commentaire'; ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p><a href="/architecture_en_mvc/index.php">Retour à la liste des billets</a></p>
<h2>Modification du commentaire</h2>
<form action="/architecture_en_mvc/index.php?action=modifyComment&id=<?php echo $_COOKIE['cookie_id'];?>" method="post">
<?php var_dump($_COOKIE['cookie_id']); ?>
<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" value="Envoyer" name="submit"/>
</div>
</form>
<?php $content = ob_get_clean(); ?>
<?php require('template.php'); ?>
commentManager.php :
<?php
namespace Laure\MVC\Model;
//attention : conséquences potentielles : j'ai enlevé la majuscule erronée au début de manager.Php
require_once("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 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 editComment($id, $author, $comment)
{
$db = $this->dbConnect();
$comments = $db -> prepare('UPDATE comments SET author = :author, comment = :comment WHERE id = :id');
$affectedComment = $comments->execute(['author' => $author, 'comment' => $comment, 'id' => $id]);
return $affectedComment;
// header('Location:index.php?action=post&id=' .$_GET['id']);
}
}
Désolée pour la quantité de code, merci à ceux qui liront.
C'est gentil de vouloir l'aider JohanVallon, mais l'id du commentaire est déjà récupérée via l'url lors de la soumission du formulaire.
Par contre laure79, j'espère que c'est bien l'id du commentaire au moins que tu définies dans le paramètre id de l'url pour la modification du commentaire au moins.
Sinon ce ne serait pas étonnant que tu ne puisses pas modifier le commentaire en base de données.
- Edité par Lartak 22 mai 2019 à 15:07:21
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Je ne vois pas l'id du billet dans le form du fichier updateComment.php pour le transmettre afin de pouvoir le récupérer pour la redirection dans le fichier frontend.php.
Dans ce cas là, si tu as besoin des deux id, en paramètre id de l'url tu définies celui du billet, ensuite dans le formulaire tu ajoutes un input de type hidden avec comme nameid et tu lui définies comme valeur l'id du commentaire.
Du coup, en premier argument de la fonction modifyComment, tu ne lui passe pas $_GET['id'], mais $_POST['id'], de cette manière tu auras tes deux id mais que ce soit la fonction modifyComment et la méthode editComment n'ont besoin que de l'id du commentaire, mais tu pourras faire la modification du commentaire au niveau de la base de données, car d'après ce que je comprends, jusqu'à présent tu fournissais à la fonction et à la méthode l'id du billet, ce qui n'était pas bon.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
J'ai modifié mes liens. A présent, mon index renvoie bien l'id du billet lorsque je clique sur Commentaires et j'arrive sur la page du billet avec ses commentaires. L'ajout de billet est normal. Ensuite, si je clique sur "modifier", j'arrive sur la page updateComment avec l'id qui suit dans l'url.
Par contre, lorsque je valide les éléments, PHP me signale 'Aucune ID envoyée'. Le lien du header placé à la fin de ma fonction modifyComment dans frontend.php (controller) ne semble pas bon. Pourtant, je l'ai modifié sur la même base que mes autres liens.
Voici mon code :
function modifyComment($post_id, $id, $author, $comment)
{
$commentManager = new \Laure\MVC\Model\CommentManager();
$affectedComment = $commentManager->editComment($post_id, $id, $author, $comment);
if($affectedComment === false)
{
throw new Exception('Erreur lors du remplacement du commentaire !');
}
else
{
// lien qui semble poser problème, l'id ne suis pas sur la page UpdateComment après soumission du formulaire, toujours rien en bdd et dans la liste des comments header('Location:index.php?action=post&id=' . $id.'&postId='.postId);
}
Y a t'il quelque chose d'anormal selon vous dans mon lien ? Merci. Pour simplifier, j'ai modifié un champs en db, le champs post_id s'appelle postId.
J'ai essayé de faire les modifications suggérée par Lartak mais j'ai du mal comprendre car j'avais encore plus d'erreur qu'avant. Je suis donc revenue en arrière et j'ai travaillé sur des liens notamment. Tout fonctionnait si ce n'est encore et toujours l'enregistrement en base et l'affichage des commentaires modifiés. A présent, j'ai trop remanié mon code et je m'y perds. Je n'ai plus la visibilité de mes commentaires... Avec le décalage horaire, je ne peux pas forcément répondre quand je reçois les réponses, ce n'est pas très pratique.
Je commence vraiment à croire que je ne verrai pas le bout de ce tp. Mais, même si je ne le terminai pas, ce qui me dérange, ce serait de ne pas avoir de correction pour comprendre où je pêche. Comment voir alors où travailler.
Voici mon code au cas ou vous verriez ce qui ne va pas mais il doit être très mauvais à présent. Malheureusement, je dois aller chercher mes enfants, je ne peux donc pas le remettre au propre tout de suite. Désolée pour ce code.
index.php:
<?php
if(!empty($_GET['id']))
{
setcookie("cookie_id", $_GET['id'], time()+24*3600*365, null, null, false, true);
session_start();
}
require('controller/frontend.php');
try {
if(isset($_GET['action']))
{
// CAS 1 - liste des billets
if ($_GET['action'] == 'listPosts') {
listPosts();
}
// CAS 2 - affichage d'un billet
elseif ($_GET['action'] == 'post')
{
if (isset($_GET['id']) && $_GET['id'] > 0) {
post();
}
else
{
throw new Exception('Aucun identifiant de billet envoyé');
}
}
// CAS 3 - ajouter un commentaire
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é');
}
}
// CAS 4 - Modifier un commentaire
elseif($_GET['action'] == 'modifyComment')
{
if(!empty($_GET['id']) && !empty($_POST['author']) && !empty($_POST['comment']))
{
$id = $_GET['id'];
$_COOKIE['cookie_id'] = $id;
modifyComment($_GET['id'], $_POST['author'], $_POST['comment']);
}
else if(empty($_GET['id']))
{
throw new Exception('Aucune ID envoyée');
}
else
{
throw new Exception('Tous les champs ne sont pas remplis');
}
}
}
else
{
listPosts();
}
}
catch(Exception $e)
{
echo 'Erreur : ' . $e->getMessage();
}
frontend.php :
<?php
// Chargement des classes
require_once('model/PostManager.php');
require_once('model/CommentManager.php');
function listPosts()
{
$postManager = new \Laure\MVC\Model\PostManager();
$posts = $postManager->getPosts();
require('view/frontend/listPostsView.php');
}
function post()
{
$postManager = new \Laure\MVC\Model\PostManager();
$commentManager = new \Laure\MVC\Model\CommentManager();
$post = $postManager->getPost($_GET['id']);
$comments = $commentManager->getComments($_GET['id']);
require('view/frontend/postView.php');
}
function addComment($postId, $author, $comment)
{
$commentManager = new \Laure\MVC\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 modifyComment($id, $author, $comment)
{
$commentManager = new \Laure\MVC\Model\CommentManager();
$affectedComment = $commentManager->editComment($id, $author, $comment);
if($affectedComment === false)
{
throw new Exception('Erreur lors du remplacement du commentaire !');
}
else
{
// lien qui semble poser problème, l'id ne suis pas sur la page UpdateComment après soumission du formulaire, toujours rien en bdd et dans la liste des comments
header('Location:index.php?action=post&id=' . $id);
}
}
updateComment.php :
<?php
session_start();
?>
<?php require('../../model/CommentManager.php'); ?>
<?php $title = 'Modification de commentaire'; ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p><a href="/architecture_en_mvc/index.php">Retour à la liste des billets</a></p>
<h2>Modification du commentaire</h2>
<form action="/architecture_en_mvc/index.php?action=modifyComment&id=<?php echo $_GET['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" value="Envoyer" name="submit"/>
</div>
</form>
<?php $content = ob_get_clean(); ?>
<?php require('template.php'); ?>
CommentManager.php :
<?php
namespace Laure\MVC\Model;
//attention : conséquences potentielles : j'ai enlevé la majuscule erronée au début de manager.Php
require_once("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 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 editComment($author, $comment, $postId, $id)
{
$db = $this->dbConnect();
$modif_comment = $db -> prepare('UPDATE comments SET author = :author, comment = :comment, postId = :postId WHERE id = :id');
$affectedComment = $modif_comment->execute(['author' => $author, 'comment' => $comment, 'postId' => $postId, 'id' => $id]);
return $affectedComment;
}
}
postView.php :
<?php $title = htmlspecialchars($post['title']); ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p><a href="index.php">Retour à la liste des billets</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>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>
</form>
<!-- Ajout d'un input de type hidden avec comme name : id et tu lui définies comme valeur l'id du commentaire. -->
<!-- <input type="hidden" name="id" value="<?php echo $_COOKIE['cookie_id'] ;?>"/> -->
<?php
while ($comment = $comments->fetch())
{
?>
<p><strong><?= htmlspecialchars($comment['author']) ?></strong> le <?= $comment['comment_date_fr'] ?> <a href="view/frontend/updateComment.php?id=<?php echo $post['id']; ?>" >(modifier) </a> </p>
<p><?= nl2br(htmlspecialchars($comment['comment'])) ?></p>
<?php
}
?>
<?php $content = ob_get_clean(); ?>
<?php require('view/frontend/template.php'); ?>
Par rapport à ce que dis JohanVallon, je ne comprends pas pourquoi tu stockes ce genre de données dans un cookie, de plus que donner comme nom d'index cookie_id, n'est pas du tout parlant.
Au passage, tu te mélange les pédales entre ce que tu définies comme argument dans la méthode editComment et ce que tu lui passe comme valeurs depuis la fonction modifyComment.
Exemple :
Fonction modifyComment: id, author, comment
Méthode editComment: author, comment, postId, id
Ce que tu passes à la méthode editComment: id, author, comment.
D'ailleurs, en ce qui concerne l'édition d'un commentaire, la seule chose qui devrait être modifiée en base de données, c'est seulement la valeur de la colonne comment.
Donc les seules informations que tu devrais passer à la méthode editComment, devraient être le contenu du commentaire et son id pour la clause WHERE.
- Edité par Lartak 23 mai 2019 à 12:05:37
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Je vous remercie pour vos réponses. J'ai supprimé le cookie, j'ai remis à plat les paramètres des fonctions et enlevé l'auteur editComment. Merci.
L'ID qui se transmet tout le long de la chaîne est l'ID du billet. Je voudrais mettre dans le lien modifier, l'id du commentaire à modifier mais ça ne fonctionne pas. Je pense qu'il faudrait aussi mettre cette ID dans form action de updateComment. Mais, à chaque fois, que j'essaie d'utiliser l'id du commentaire au lieu de l'id du post, j'ai une erreur undefined variable. Si je fais un var_dump, j'ai une valeur null.
Je pense que tout le reste est bon à présent enfin je l'espère.
D'après ce que je vois, sur le lien modifier dans postView.php vous transmettez l'id du billet mais pas celui du commentaire.
En ce qui me concerne je fais comme ceci dans le fichier commentManager.php pour récupérer les 2 id :
public function getComments($postId)
{
$db = $this->dbConnect();
$comments = $db->prepare('SELECT id,post_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;
}
Puis pour le lien modifier dans le fichier postView.php :
Merci beaucoup pour votre aide, j'ai corrigé le lien et ajouté le champs post_id dans getComments. C'est très gentil.
Il me reste un problème cependant.
Lorsque je veux modifier un commentaire, tout suit correctement (id et post id) mais j'ai un souci lorsque je clique sur le lien modifier. En effet, lorsque j'arrive sur la page updateComment, j'ai encore deux undefined variables pour ID et POST ID.
Je pense que c'est dû au lien de traitement du formulaire. Je l'ai modifié car j'aimerai qu'il arrive sur la page du post concerné et que l'on voit l'ensemble des commentaires dont celui qui a été modifié. Mais pour cela, l'id et le post id doivent suivre et je n'arrive pas à les faire prendre en compte dans le lien, rien ne fonctionne. Pourtant, ils suivent bien dans la barre d'adresse, j'ai vérifié et c'est bien les bonnes id.
J'ai l'erreur suivante :
Si je saisis malgré tout un commentaire et que je le soumets, j'obtiens l'erreur "aucun identifiant trouvé'.
Je mets ci-dessous le code de la page updateComment qui contient le lien avec les variables signalées comme undefined :
<?php
// session_start();
?>
<?php require('../../model/CommentManager.php'); ?>
<?php $title = 'Modification de commentaire'; ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p><a href="/architecture_en_mvc/index.php">Retour à la liste des billets</a></p>
<h2>Modification du commentaire</h2>
<!--modif de l'id-->
<form action="/architecture_en_mvc/index.php?action=post?id=<?php $_GET['id'];?>&postId=<?php $_GET['postId'];?>" method="post">
<?php var_dump($id); ?>
<?php var_dump($postId); ?>
<div>
<label for="comment">Commentaire</label><br />
<textarea id="comment" name="comment"></textarea>
</div>
<div>
<input type="submit" value="Envoyer" name="submit"/>
</div>
</form>
<?php $content = ob_get_clean(); ?>
<?php require('template.php'); ?>
postView.php :
<?php $title = htmlspecialchars($post['title']); ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p><a href="index.php">Retour à la liste des billets</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>Commentaires</h2>
<!-- lien a ne pas toucher, si je le modifie l'id ne convient pas-->
<form action="index.php?action=addComment&id=<?php echo $_GET['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
while ($comment = $comments->fetch())
{
?>
<p><strong><?= htmlspecialchars($comment['author']) ?></strong> le <?= $comment['comment_date_fr'] ?> <a href="view/frontend/updateComment.php?id=<?= $comment['id'] ?>&postId=<?= $comment['post_id']?>" >(modifier) </a> </p>
<p><?= nl2br(htmlspecialchars($comment['comment'])) ?></p>
<?php
}
?>
<?php $content = ob_get_clean(); ?>
<?php require('view/frontend/template.php'); ?>
CommentManager.php :
<?php
namespace Laure\MVC\Model;
require_once("Manager.php");
class CommentManager extends Manager
{
public function getComments($postId)
{
$db = $this->dbConnect();
$comments = $db->prepare('SELECT id, post_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 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 editComment($comment, $id)
{
$db = $this->dbConnect();
$comments = $db -> prepare('UPDATE comments SET comment = :comment WHERE id = :id');
$affectedComment = $comments->execute(['comment' => $comment, 'id' => $id]);
return $affectedComment;
}
}
J'ai définit les variables et testé, j'avais oublié d'enlever les var_dump et d'enlever mes variables.
Je pense que Modifier fonctionne bien car l'id et l'id post sont bien présentes ensuite dans la barre d'adresse sur la page suivante "updateComment".
Par contre, quelque chose ne fonctionne pas au niveau du updateComment car je reviens à la bonne page mais rien ne se fait et l'id ne suit pas à partir de là. Mais j'ai retourné à de nombreuses reprises mon lien et je ne résous rien, c'est pour cela que j'avais testé avec var_dump.
Quand je suis ramenée sur la page des posts, je n'ai pas l'id dans la barre d'adresse, j'obtiens ceci :
Pour Johan : Merci, j'ai modifié le lien mais le problème ne vient pas de là, rien ne change.
J'ai ajouté une page editView.php et j'ai essayé de modifier mon code pour résoudre mes problèmes.
Au final, c'est mieux visuellement, mais lorsque je valide une modification de commentaire à présent, j'ai une page blanche et mes modifications n'apparaissent pas en base. J'ai fait des recherches et j'ai vu des codes assez proches du mien. Je ne vois vraiment pas ce qui cloche dans le mien. Je le reposte au cas ou quelqu'un voit une erreur quelque part. Merci par avance.
index.php (partiel pour ne pas poster trop de code) :
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é');
}
}
elseif ($_GET['action'] == 'modifyComment')
{
if(!empty($_GET['id']) && $_GET['id'] > 0 && !empty($_GET['post_id']) && $_GET['post_id'] > 0)
{
if(!empty($_POST['comment']))
{
modifyComment($_GET['id'], $_GET['post_id'], $_POST['comment']);
}
else
{
throw new Exception('Tous les champs ne sont pas remplis !');
}
}
else
{
throw new Exception('Aucun identifiant de billet envoyé');
}
}
elseif ($_GET['action'] == 'viewComment')
{
if (isset($_GET['id']) && $_GET['id'] > 0)
{
viewComment();
}
}
}
else
{
listPosts();
}
CommentManager.php :
public function editComment($comment, $id)
{
$db = $this->dbConnect();
$comments = $db -> prepare('UPDATE comments SET comment = ?, comment_date = NOW() WHERE id = ?');
$affectedComment = $comments->execute(array($comment, $id));
return $affectedComment;
}
public function getComment($id)
{
$db = $this->dbConnect();
$req = $db->prepare('SELECT id, author, comment, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\') AS comment_date_fr FROM comments WHERE id = ?');
$req->execute(array($id));
$comment = $req->fetch();
return $comment;
}
}
frontend.php :
function modifyComment($id, $postId, $comment)
{
$commentManager = new \Laure\MVC\Model\CommentManager();
$affectedComment = $commentManager->editComment($id, $postId, $comment);
if($affectedComment === false)
{
throw new Exception('Erreur lors du remplacement du commentaire !');
}
else
{
header('Location:index.php?action=post&id=' .$postId);
}
}
function viewComment()
{
$commentManager = new \Laure\MVC\Model\CommentManager();
$comment = $commentManager->getComment($_GET['id']);
require('view/frontend/editView.php');
}
postView.php :
<?php $title = htmlspecialchars($post['title']); ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p><a href="index.php">Retour à la liste des billets</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>Commentaires</h2>
<!-- lien a ne pas toucher, si je le modifie l'id ne convient pas-->
<!--SUGGESTION DE MODIF ? "index.php?action=addComment&id=<?php echo $post['id'] ?>" method="post">-->
<form action="index.php?action=addComment&id=<?php echo $_GET['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
while ($comment = $comments->fetch())
{
?>
<p><strong><?= htmlspecialchars($comment['author']) ?></strong> le <?= $comment['comment_date_fr'] ?></p>
<p><?= nl2br(htmlspecialchars($comment['comment'])) ?> (<a href="index.php?action=viewComment&id=<?= $comment['id'] ?>">modifier</a>)</p>
<p><?= nl2br(htmlspecialchars($comment['comment'])) ?></p>
<?php
}
?>
<?php $content = ob_get_clean(); ?>
<?php require('view/frontend/template.php'); ?>
updateComment.php :
<?php require('../../model/CommentManager.php'); ?>
<?php $title = 'Modification de commentaire'; ?>
<?php ob_start(); ?>
<h1>Mon super blog !</h1>
<p><a href="/architecture_en_mvc/index.php">Retour à la liste des billets</a></p>
<h2>Modification du commentaire</h2>
<?php $id=$_GET['id'];?>
<?php $post_id=$_GET['postId'];?>
<form action="/architecture_en_mvc/index.php?action=post&id=" <?php echo $_GET['id']; ?>"&postId="<?php echo $_GET['postId'];?> method="post">
<div>
<label for="comment">Commentaire</label><br />
<textarea id="comment" name="comment"></textarea>
</div>
<div>
<input type="submit" value="Envoyer" name="submit"/>
</div>
</form>
<?php $content = ob_get_clean(); ?>
<?php require('template.php'); ?>
× 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.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.