Je cherche désespéramment à modifier le commentaire d'un article/billet via un formulaire(tout ça en respectant la structure MVC et la POO). j'arrive à récupérer le commentaire et à l'afficher dans le champs de formulaire pour pouvoir le modifier, mais une fois submit, c'est page blanche et rien ne s'est modifié dans la base de donnée. Ici mon formulaire dans le fichier View :
function changeComment($commentId,$comment,$postId)
{
$commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
$affectedLines = $commentManager->updateComment($commentId,$comment,$postId);
if ($affectedLines === false) {
// Erreur gérée. Elle sera remontée jusqu'au bloc try du routeur !
throw new Exception('Impossible de modifier le commentaire !');
}
else {
header('Location: billetsindex.php?action=post&id=' . $postId);
}
}
le model :
public function updateComment($commentId,$comment,$postId)
{
$db = $this->dbConnect();
$comments = $db->prepare('UPDATE comments SET comment = ? WHERE id = ?');
$affectedLines = $comments->execute(array($commentId,$comment,$postId));
return $affectedLines;
}
et enfin le routeur :
elseif ($_GET['action'] == 'changeComment') {
if (isset($_GET['id']) && $_GET['id'] > 0) {
if (!empty($_POST['comment'])) {
changeComment($_GET['id'],$_POST['comment'],$_GET['postId']);
}
else {
// Autre exception
throw new Exception('Tous les champs ne sont pas remplis !');
}
}
}
}
Help
- Edité par MohammedHsein 10 décembre 2018 à 9:40:02
Tu prends trois paramètres dans ton modèle mais tu en utilises que deux, je pense que tu dois avoir une erreur PDO au passage.
Au niveau PDO il se connecte bien (l'ajout de commentaire se fait sans soucis)
Oui je sais que c'est les paramètres transmis qui posent problème et ça là où je m'égare mais je vois pas par quel bout le prendre ? je transmet bien l'id du commentaire, donc en principe le champs "comment" devrait être modifié dans la bdd??
j'essaie également de récupérer le postId (qui correspond au billet commenté) pour pouvoir repointer vers la page d'affichage du billet en question et de ses commentaires (pour vérifier si ceux ci ont bien été modifié) mais là je vois pas trop comment le transmettre au routeur??
Pour éditer un commentaire en règle générale tu es dans cette situation:
Tu as l'ID de l'article que tu visionnes.
Tu as des commentaires dont un qui t'appartient que tu souhaites modifier, chaque commentaire à un ID et sont lié par l'ID de l'article.
En éditant ton message tu envoies une requête en POST ou PUT contenant l'id du commentaire ainsi que l'id de l'article.
Tu modifies dans la BDD en recherchant le commentaire indiquer dans l'article id X avec un id Y.
Si ta modification est sans erreur tu renvoies sur la page de l'article id X.
rga a écrit:
salut,
je croyais qu'un form ne pouvait pas être GET et POST en même temps ?
peut-être que ça vient de là...
Si tu observes bien il récupère l'id de l'article qui se situe dans l'URL donc tout à fait normal. Tu peux très bien effectuer une requête POST sur une URL qui contient des paramètres.
je croyais qu'un form ne pouvait pas être GET et POST en même temps ?
peut-être que ça vient de là...
Si tu observes bien il récupère l'id de l'article qui se situe dans l'URL donc tout à fait normal. Tu peux très bien effectuer une requête POST sur une URL qui contient des paramètres.
- Edité par xoxotf il y a 44 minutes
ça me fait bizarre, en même temps jamais vraiment fait comme ça
Sinon, concernant la requête et les paramètres, il y a un souci d'ordre, je pense, en plus du nombre différent. Il faut que les paramètres suivent les "?" de la requête. Dans ton cas, tu en as 3 : post_id (d'ailleurs, peut-être un oubli dans ton post initial ici car je ne le vois pas), comment_id, comment_text. Sauf que dans ta requête MAJ, tu fais (je résume) :
<?php
$sql = "UPDATE maTable SET comment = ? WHERE post_id = ?"; /* Ici, 2 paramètres attendus, comment_text et post_id */
$req = $sql->execute(array($comment_id, $comment, $post_id)); /* un en trop, du coup ordre non respecté => Attendu : comment_text et post_id */
?>
Tu dois donc : replacer dans le bon ordre les paramètres transmis (text, post_id, comment_id) ET dans la clause WHERE, ajouter le "comment_id = ?" à la fin
Winter Is Coming - Explorez le forum : votre problème a déjà dû être traité ailleurs
Je pense que l'identifiant n'est pas transmis car dans action de votre form sur votre fichier View, ne serait-ce pas id=<?= comment['id'] ?> au lieu de id=<? comment['id'] ?> ?
je croyais qu'un form ne pouvait pas être GET et POST en même temps ?
peut-être que ça vient de là...
Si tu observes bien il récupère l'id de l'article qui se situe dans l'URL donc tout à fait normal. Tu peux très bien effectuer une requête POST sur une URL qui contient des paramètres.
- Edité par xoxotf il y a 44 minutes
ça me fait bizarre, en même temps jamais vraiment fait comme ça
Sinon, concernant la requête et les paramètres, il y a un souci d'ordre, je pense, en plus du nombre différent. Il faut que les paramètres suivent les "?" de la requête. Dans ton cas, tu en as 3 : post_id (d'ailleurs, peut-être un oubli dans ton post initial ici car je ne le vois pas), comment_id, comment_text. Sauf que dans ta requête MAJ, tu fais (je résume) :
<?php
$sql = "UPDATE maTable SET comment = ? WHERE post_id = ?"; /* Ici, 2 paramètres attendus, comment_text et post_id */
$req = $sql->execute(array($comment_id, $comment, $post_id)); /* un en trop, du coup ordre non respecté => Attendu : comment_text et post_id */
?>
Tu dois donc : replacer dans le bon ordre les paramètres transmis (text, post_id, comment_id) ET dans la clause WHERE, ajouter le "comment_id = ?" à la fin
En fait l'id en question est le comment_id (c'est le post_id qui manque) ... mais comment rajouter celui-ci? un where supplementaire ? and where ???
par ailleurs j'ai respecté l'ordre dans la transmission des paramètres comme suit :
public function updateComment($commentId,$postId,$comment)
{
$db = $this->dbConnect();
$comments = $db->prepare('UPDATE comments SET comment = ? WHERE id = ?');
$affectedLines = $comments->execute(array($commentId,$postId,$comment));
return $affectedLines;
}
Mais toujours cette page blanche et rien de changé dans la bdd
Tu as toujours le même problème, trois arguments alors que tu en utilises uniquement deux et toujours dans le mauvaises ordres... est-ce que tu as vu le message de @JohanVallon ? Tu POST sur une URL où tu attends un id en paramètre sauf que ça ne marchera pas puisqu'il y a une erreur de syntaxe dans ta form, tu n'as pas du débug ta requête tu t'en serais rendu compte.
tu dois voir apparaître tous tes champs nécessaires remplis, même les "hidden". si c'est le cas, vires cette ligne et passes à la suite.
Model :
MohammedHsein a écrit:
par ailleurs j'ai respecté l'ordre dans la transmission des paramètres comme suit :
public function updateComment($commentId,$postId,$comment)
{
$db = $this->dbConnect();
$comments = $db->prepare('UPDATE comments SET comment = ? WHERE id = ?');
$affectedLines = $comments->execute(array($commentId,$postId,$comment));
return $affectedLines;
}
As-tu fait la même modif d'ordre des paramètres dans le contrôleur qui appelle cette fonction ?
Regardes la réponse de @christouphe et comment il construit la requête.
Là, je réécris la tienne en texte brut (au lieu de la requête mais en conservant ton ordre de transmission entre sql et array()) :
Modifier `maTable`
En remplaçant `comment` avec '$comment_id'
Où `post_id` vaut '$post_id'
/*et j'ai un '$comment' à utiliser */
Vois-tu ton erreur ?
Winter Is Coming - Explorez le forum : votre problème a déjà dû être traité ailleurs
J'ai refait la requête en essayant de suivre cet ordre de parametres et j'ai l'erreur suivante :
Erreur : Impossible de modifier le commentaire !
la requête en question :
public function updateComment($comment,$commentId)
{
$db = $this->dbConnect();
$comments = $db->prepare('UPDATE comments SET comment = $comment WHERE id = $commentId');
$affectedLines = $comments->execute(array($comment,$commentId));
return $affectedLines;
}
le contrôleur :
function changeComment($comment,$commentId)
{
$commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
$affectedLines = $commentManager->updateComment($comment,$commentId);
if ($affectedLines === false) {
// Erreur gérée. Elle sera remontée jusqu'au bloc try du routeur !
throw new Exception('Impossible de modifier le commentaire !');
}
else {
header('Location: billetsindex.php?action=post&id=' . $postId);
}
Imagines que $a = '$taRequête '. Que penses-tu afficher ?
- Edité par rga 11 décembre 2018 à 17:31:21
Re,
J'ai enfin pu récupérer ce fameux postId pour le transmettre : je le vois bien dans l'url (En fait il y avait une omission de ce champs dans la requête sql ). et réorganisé mon routeur...
function changeComment($comment,$commentId,$postId)
{
$commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
$affectedLines = $commentManager->updateComment($comment,$commentId,$postId);
if ($affectedLines === false) {
// Erreur gérée. Elle sera remontée jusqu'au bloc try du routeur !
throw new Exception('Impossible de modifier le commentaire !');
}
else {
header('Location: billetsindex.php?action=post&id=' . $postId);
}
model :
public function updateComment($comment,$commentId,$postId)
{
$db = $this->dbConnect();
$comments = $db->prepare('UPDATE comments SET comment = ? WHERE id = ? and post_id = ?');
$affectedLines = $comments->execute(array($comment,$commentId,$postId));
return $affectedLines;
}
et enfin le routeur :
elseif ($_GET['action'] == 'changeComment') {
if (isset($_GET['commentId']) && $_GET['commentId'] > 0) {
if (!empty($_POST['comment'])) {
changeComment($_POST['comment'],$_GET['commentId'],$_GET['postId']);
}
else {
// Autre exception
throw new Exception('Tous les champs ne sont pas remplis !');
}
}
}
Un grand merci à ceux qui ont pu prendre le temps de poster des réponses constructives. (Ceux qui s'adressent à moi à la troisième personne ne devraient pas se donner cette peine )
- Edité par MohammedHsein 13 décembre 2018 à 13:11:57
comment modifier un commentaire ??!!
× 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.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli