Un blog avec des commentaires

Petit nouveau ! | 7 Messages

08 déc. 2018, 10:08

Bonjour ;
J'ai un exercice de blog avec commentaires qui me pose problème : il y a 3 pages sur ce projet la 1ere avec des articles qui permettent d'afficher des commentaires et donc de passer sur la seconde page et enfin la possibilité de laisser un commentaire et donc de traiter l'information sur la dernière page en renvoyant l'utilisateur sur la seconde page. Le soucis c'est que je n'arrive pas avec mon header('Location') à renvoyer le user sur la seconde page et qui plus est, rien ne s'inscrit dans ma base de données...Si quelqu'un pouvait avoir l'obligeance d'éclairer ma lanterne ; ce serait avec plaisir :)
Voici ma page commentaire :

Code : Tout sélectionner

<?php try { $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } $req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d%m%Y à %Hh%imin%ss\') AS date_creation_fr FROM billets WHERE id=?'); $req->execute(array($_GET['billet'])); $donnees = $req->fetch(); ?> <h2> <?php echo htmlspecialchars($donnees['titre']); ?> <?php echo $donnees['date_creation_fr']; ?> </h2> <p> <?php echo (htmlspecialchars($donnees['contenu'])); ?> </p> <h2>Commentaires</h2> <?php $req->closeCursor(); $req = $bdd->prepare('SELECT id, id_billet, auteur, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentaire_fr FROM commentaires WHERE id_billet = ? ORDER BY date_commentaire'); $req->execute(array($_GET['billet'])); while ($donnees = $req->fetch()) { ?> <p><strong><?php echo (htmlspecialchars($donnees['auteur'])); ?> le <?php echo $donnees['date_commentaire_fr']; ?></strong></p> <p><?php echo (htmlspecialchars($donnees['commentaire'])); ?><br /><br /> <?php } $req->closeCursor(); ?> <form method="post" action="commentaires_post.php"> <p>Laissez nous un commentaire</p> <input type="text" name="auteur" placeholder="Votre pseudo" /><br /> <textarea name="commentaire" rows="2" cols="30" ></textarea><br /> <input type="submit" name="envoyer" value="poster votre commentaire" /> </form> <p><a href="indexe.php">Retour à la liste des articles</a></p>


Et voici la page de traitement problématique :

Code : Tout sélectionner

<?php try { $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } if(isset($_POST['envoyer'])) { $auteur=($_POST['auteur']); $commentaire=($_POST['commentaire']); $req = $bdd->prepare('INSERT INTO commentaires (auteur, commentaire, date_commentaire) VALUES(:auteur, :commentaire, NOW())'); $req->execute(array('auteur'=>$auteur, 'commentaire'=>$commentaire)); header("Location: commentaires.php?billet=".$_GET['billet']); } ?>

Mammouth du PHP | 2703 Messages

08 déc. 2018, 14:15

lors de l'insert, si l'id du billet pour lequel on ajoute un commentaire n'est pas sauvé, alors ce sera difficile par la suite d'afficher les commentaire d'un billet en particulier.

Petit nouveau ! | 7 Messages

08 déc. 2018, 15:28

J'ai modifié mon code mais rien n'y fait toujours rien dans ma bdd et ma redirection ne veut pas prendre en compte l'id du billet
Voici mon code à présent :

Code : Tout sélectionner

<?php try { $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } if(isset($_POST['envoyer'])) { $auteur=($_POST['auteur']); $commentaire=($_POST['commentaire']); $req = $bdd->prepare('INSERT INTO commentaires (id, id_billet, auteur, commentaire, date_commentaire) VALUES(:id, :id_billet, :auteur, :commentaire, NOW())'); $req->execute(array('auteur'=>$auteur, 'commentaire'=>$commentaire)); header("Location: commentaires.php?billet=".$_GET['billet']); } ?>
Si tu avais quelques explications supplémentaires ce serait pas de refus, je cherche vraiment à comprendre, mais je débute et je tiens vraiment à m'accrocher...D'avance ; merci

Mammouth du PHP | 2703 Messages

08 déc. 2018, 16:04

il faut activer les messages d'erreurs. par exemple, mettre 4 paramètres à remplir dans sa requête et n'en passer que 2 lors de l'execution de la requete, cela doit déclencher une erreur. afficher cette erreur va aider à débugger.

enlever le header dans un premier temps et mettre des echo un peu partout va aussi aider à débugger.
par exemple :
if(isset($_POST['envoyer']))
{
echo $_POST['auteur'];
echo $_GET['billet'];
...

Petit nouveau ! | 7 Messages

08 déc. 2018, 17:46

Effectivement pour :

-$_GET['billet']; j'ai cette erreur : Notice: Undefined index: billet in C:\wamp64\www\test\commentaires_post.php ; j'en déduis qu'il ne reconnait pas ma variable.

Ensuite ; j'ai ces 2 erreurs pour la même ligne où effectivement il ne semble pas apprécier le nombre de paramètres passés par rapport à l'éxecution :

-Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp64\www\test\commentaires_post.php
- Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in C:\wamp64\www\test\commentaires_post.php

Je ne vois pas comment reformuler mon execution et je ne comprends pas pourquoi il ne reconnait pas ma variable...Merci encore pour ton aide

Mammouth du PHP | 2703 Messages

08 déc. 2018, 18:30

$req = $bdd->prepare('INSERT INTO commentaires (auteur, commentaire, date_commentaire) VALUES(:auteur, :commentaire, NOW())');
$req->execute(array('auteur'=>$auteur, 'commentaire'=>$commentaire));

2 paramètres dans la requete, 2 variables passées à execute => pas d'erreur

-$_GET['billet']; j'ai cette erreur : Notice: Undefined index: billet in C:\wamp64\www\test\commentaires_post.php ; j'en déduis qu'il ne reconnait pas ma variable.
l'url de la page appelée quand on valide le formulaire contient-elle un paramètre billet ?

Petit nouveau ! | 7 Messages

09 déc. 2018, 13:06

Dans la requête, j'avais rajouté l'id et l'id_billet que je n'avais pas reporté dans l'éxecution(cf derniers codes envoyés) ; du coup, je suis revenu à la syntaxe initiale ; les 2 messages d'erreurs précédents ont disparus à la place voici, celui que j'obtiens :

Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 1364 Field 'id_billet' doesn't have a default value in C:\wamp64\www\test\commentaires_post.php

En ce qui concerne l'url de la page appelée, je retombe sur : "http://localhost/test/commentaires.php?billet="
il ne veut pas prendre en compte l'id du billet et me ramener sur la page commentaires spécifique à celui ci ; de plus je n'ai toujours rien qui s'inscrit en bdd...

Mammouth du PHP | 2703 Messages

09 déc. 2018, 14:59

Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 1364 Field 'id_billet' doesn't have a default value in C:\wamp64\www\test\commentaires_post.php
j'ai indiqué que si l'id_billet n'était pas sauvé, on ne pourrais pas savoir à quel billet un commentaire était rattaché, donc ne mettre que 2 paramètre ne peut pas marcher.
cela aurait pu quand sauver en base de donnée quelque chose d'incomplet, mais non, pour la raison donnée dans le message d'erreur.
En ce qui concerne l'url de la page appelée, je retombe sur : "http://localhost/test/commentaires.php?billet="
c'est d'abord l'url du script commentaires_post.php qu'il faut regarder (donc sans mettre de redirection, qu'il ne faudra mettre que lorsque les données seront sauvées en bdd et complètes).

pour commencer, il faudrait exécuter la requête d'ajout de commentaire construite manuellement dans phpmyadmin, exécuter la requête d'un affichage des commentaires du billet dans phpmyadmin. ajouter un second commentaire au même billet, affichage de la sélection, ajouter un billet à un autre commentaire, affichage des commentaires du premier billet puis du second. une fois que cela marche, tu auras les 2 requêtes à exécuter en php.

Petit nouveau ! | 7 Messages

09 déc. 2018, 17:44

J'avoue que je suis complètement largué ; j'ai remis l'id_billet dans la requête et dans l'éxecution comme précédemment. Dans phpmyadmin, j'ai inséré manuellement un commentaire il s'affiche à la suite des autres sur la page commentaires de l'id_billet en question... J'ai déjà 2 billets dans ma bdd, mais le fait est c'est qu'en passant par mon code je n'arrive à rien... Je ne demande pas à ce que tu résolves mon exercice, mais, si tu as un exemple de code à me soumettre pour illustrer ton propos ce serait pas de refus.

Mammouth du PHP | 2703 Messages

09 déc. 2018, 18:30

la requete à exécuter en php ou dans phpmyadmin :
INSERT INTO commentaires (id_billet, auteur, commentaire, date_commentaire) ...

ensuite, il faut comprendre pourquoi
echo $_POST['auteur'];
echo $_GET['billet'];
1ère ligne ok
seconde ligne pas bon