Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PHP/MySQL] TP blog, ajouter des commentaires

Récupérer l'id d'un article

Sujet résolu
20 février 2013 à 17:15:10

Bonjour, après m'être bien entraîné avec HTML et CSS, j'ai commencé à apprendre le PHP. Jusqu'à maintenant, les problèmes que j'avais, j'ai réussi à les régler seul mais aujourd'hui je rencontre un problème pour réaliser le TP où il faut faire un blog.

Mon problème est au niveau de l'ajout de commentaires, je vous explique ce que j'ai fait et où il y a un soucis :

J'ai fait une page blog.php qui fonctionne parfaitement, les articles s'affichent bien, j'ai également mis de quoi ajouter des articles depuis la page et ça fonctionne parfaitement. Pour chaque article il y a un lien "Commentaires" qui mènent à une page commentaires.php qui affiche parfaitement l'article avec en dessous les commentaires. Le problème est ici, j'ai essayé d'ajouter de quoi ajouter des commentaires directement depuis cette page mais malgré mes essais, j'ai toujours des erreurs.

Je pense que mon soucis est que je ne comprends pas comment récupérer l'id de l'article qui est dans la page actuelle. J'ai essayé différentes choses mais rien ne fonctionne. Je n'ai pas envie de passer trop longtemps sur ce TP car il me reste encore beaucoup à apprendre mais pour moi c'est indispensable de savoir faire ça.

Si vous pouvez m'aider, je vous en serait très reconnaissant.

blog.php

<!DOCTYPE html>
<html>
    <head>
		<link rel="stylesheet" href="blog.css" />
        <title>Blog</title>
        <meta charset="utf-8" />
    </head>
    <body>
	
	<h1>TP Blog</h1>
	
		<?php
			try
			{
				$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
			}
			catch(Exception $e)
			{
				die('Erreure : '.$e->getMessage());
			}
			
			$req = $bdd->query('SELECT id, auteur, titre, contenu, date_creation FROM billets ORDER BY date_creation DESC LIMIT 0, 5');
			while ($donnees = $req->fetch())
			{
			?>
				<div class="news">
					<h3><?php echo $donnees['titre']; ?><br />
					<em><?php echo $donnees['date_creation']; ?> par <strong><?php echo $donnees['auteur']; ?></strong></h3>
					<p><?php echo $donnees['contenu']; ?><br />
					<a href="commentaires.php?billet=<?php echo $donnees['id']; ?>">Commentaires</a></p>
				</div>
			<?php
			}
			$req->closeCursor();
		?>
		
		<form method="post" action="blog_post.php">
			<label for="pseudo">Pseudo : </label><input type="text" name="pseudo" id="pseudo" placeholder="Entrez votre pseudo..." maclength="20" /><br />
			<label for="titre">Titre : </label><input type="text" name="titre" id="titre" placeholder="Entrez le tire..." maxlength="50" /><br />
			<label for="article">Article : </label><br /><textarea name="article" id="article" placeholder="Ecrivez votre article ici..."></textarea><br />
			<input type="submit" value="Envoyer" />
		</form>
		
    </body>
</html>

blog_post.php

<?php
		try
		{
			$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
		}
		catch(Exception $e)
		{
			die('Erreure : '.$e->getMessage());
		}
		
		$req = $bdd->prepare('INSERT INTO billets (titre, auteur, contenu, date_creation) VALUES(?, ?, ?, NOW())');
		$req->execute(array($_POST['titre'], $_POST['pseudo'], $_POST['article']));
		header('Location: blog.php');
	?>

commentaires.php

<!DOCTYPE html>
<html>
    <head>
		<link rel="stylesheet" href="blog.css" />
        <title>Commentaires</title>
        <meta charset="utf-8" />
    </head>
    <body>
	
		<?php
		
			try
			{
				$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
			}
			catch(Exception $e)
			{
				die('Erreure : '.$e->getMessage());
			}
			
			$req = $bdd->prepare('SELECT id, auteur, titre, contenu, date_creation FROM billets WHERE id = ?');
			$req->execute(array($_GET['billet']));
			$donnees = $req->fetch();
			?>
				<div class="news">
					<h3><?php echo $donnees['titre']; ?><br />
					le <?php echo $donnees['date_creation']; ?> par <?php echo $donnees['auteur']; ?></h3>
					<p><?php echo $donnees['contenu']; ?></p>
				</div>
				
			<form method="post" action="commentaire_post.php?billet=<?php echo $donnees['id']; ?>">
				<label for="auteur">Pseudo : </label><input type="text" name="auteur" id="auteur" placeholder="Entrez votre pseudo..." maxlength="20" /><br />
				<label for="commentaire">Commentaire : </label><textarea name="commentaire" id="commentaire" placeholder="Entrez un commentaire"></textarea><br />
				<input type="submit" value="Envoyer" />
			</form>
			
			<?php
			$req->closeCursor();
			
			$req = $bdd->prepare('SELECT id_billet, auteur, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_com_fr FROM commentaires WHERE id_billet = ? ORDER BY date_commentaire');
			$req->execute(array($_GET['billet']));
			
			while ($donnees = $req->fetch())
			{
			?>
				<p><strong><?php echo $donnees['auteur']; ?></strong> le <?php echo $donnees['date_com_fr']; ?></p>
				<p><?php echo $donnees['commentaire']; ?></p>
			<?php
			}
			$req->closeCursor();
		?>
		
    </body>
</html>

commentaire_post.php

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

Mon problème se trouve au niveau de commentaires.php et commentaires_post.php, je vous ai aussi donné blog.php et blog_post.php au cas où ça vous donne plus d'informations pour régler mon problème.

Je n'ai pas sécurisé mon code avec htmlspecialchars, je sais que je suis censé le faire mais étant donné que c'est du local, j'ai préféré ne pas le mettre pour rendre mon code moins chargé.

Merci.



-
Edité par Teslak 20 février 2013 à 17:17:00

  • Partager sur Facebook
  • Partager sur Twitter
21 février 2013 à 17:17:30

Up, j'aurai peut-être dû poster ça dans le forum PHP...
  • Partager sur Facebook
  • Partager sur Twitter
21 février 2013 à 18:09:53

Je suis également sur le même problème actuellement. Je publie mes codes comme le tiens : mon problème c'est que j'ai fait des requetes préparés mais que les commentaires ne s'enregistre pas. De plus, le //header('Location: commentaires.php?billet='.$_POST['billet']); ne donne pas la valeur du dernier billet pour la redirection.
  • Partager sur Facebook
  • Partager sur Twitter
21 février 2013 à 18:17:17

Ceci est mon formulaire pour ajouter un nouveau commentaire : dans commentaires.php

<form method="post" action="commentaires_post.php">
<p>Ajouter votre commentaire</p>
<label for="Auteur">Auteur</label><input type="text" id="Auteur" name="auteur"/><br />
<label for="commentaire">Commentaire</label><textarea name="commentaire" id="commentaire"></textarea>
<input type="hidden" name="billet" value="<?php $_GET['billet']?>"/>
<input type="submit" value="Envoyer"/>
</form>


remarquer que j'ai ajouté un champ hidden avec comme valeur le numero du blog dans un variable $_GET donc à ce que je pense, il doit être renvoyé dans $_POST['billet'] chez commentaires_post.php. ceci afin de rediriger sur la meme page.

Et voici le code pour commentaires_post.php :

try{
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch (exception $e)
{
    die ('Erreur : '. $e->getMessage());
}

$req = $bdd->prepare('INSERT INTO miniblog_commentaires (id_billet, auteur, commentaire, DATE_FORMAT(date_commentaire, %Y-%m-%d %H:%i:%s))
VALUES (:id_billet, :auteur, :commentaire, NOW())');

$req->execute(array(
    'id_billet'=> $_POST['billet'],
    'auteur'=> $_POST['auteur'],
    'commentaire'=> $_POST['commentaire'],

));

header('Location: commentaires.php?billet='.$_POST['billet']);


Le problème :

Aucun nouveau commentaire enregistré et le header Location ne redirige pas sur le dernier page où on a laissé le commentaire.

Merci pour votre aide.

  • Partager sur Facebook
  • Partager sur Twitter
21 février 2013 à 20:23:49

Merci, ça fonctionne parfaitement pour moi, j'ai ajouté le champ hidden comme toi et j'ai modifié le header().

Pour ton problème, je pense que le problème est que dans ton commentaires_post.php, les VALUES sont mauvaises, essaye en remplaçant ":id_billet, :auteur, :commentaire, NOW()" par "?, ?, ?, NOW()" Je pense que ça devrait fonctionner.

Bonne soirée. ^^

Je vais attendre que ton problème soit résolu pour marquer le sujet comme résolu. ;)

-
Edité par Teslak 21 février 2013 à 20:32:31

  • Partager sur Facebook
  • Partager sur Twitter
22 février 2013 à 13:03:26

C'est fait,

Après plusieurs pause de déloupage, j'ai trouvé que mon nom de table était miniblog_commentaires mais pas simplement commentaires.

De plus, merci pour l'idée de action="commentaire_post.php?billet=<?php echo $donnees['id']; ?> je n'ai pas cette idée et j'ai toujours de l'erreur sur le header('Location: commentaires.php?billet='. $_GET['billet']);.

Maintenant c'est résolu :)

  • Partager sur Facebook
  • Partager sur Twitter
22 février 2013 à 13:50:06

Très bien, sujet résolu. ^^
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2013 à 6:00:19

Bonjours les amies j'ai un petits soucie l apage ce redirige le plus normalement du monde mais y a pas d'ajout de commentaire a la base de donner

Voila c'est mon code pour com.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Commentaire</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>

<body>

<?php 
//Connexion a la base de donner

try{
$bdd = new PDO('mysql:host=localhost;dbname=php','root','');
}
catch (Exception $e){
	
	die('Erreur :'.$e->getMessage());
	}
//recuperation de la base de donner billet
$req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y %Hh%imin%ss\') as date_r FROM billets WHERE id = ? ');
$req->execute(array($_GET['billet']));
$donnees = $req->fetch();

?>
<p> <strong><?php echo $donnees['titre']; ?></strong> le <?php echo $donnees['date_r']; ?> <br /> <?php echo $donnees['contenu']; ?></p>


<?php 
$req->closeCursor();

//recuperation de la base de donner commentaire
$req = $bdd->prepare('SELECT id, id_billet, auteur, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_com  FROM commentaires WHERE id_billet = ? ORDER BY date_commentaire');
$req->execute(array($_GET['billet']));
while($donnees = $req->fetch()){

?>
<p> <strong> <?php echo $donnees['auteur']; ?> </strong> le <?php echo $donnees['date_com']; ?> <br /><?php echo $donnees['commentaire']; ?></p>

<?php 
}
$req->closeCursor();

?>

<form action="com_post.php" method="post">
<label for="auteur">auteur</label> : <input name="auteur" /><br />
<label for="commentaire">commentaires</label> : <input name="commentaire" type="text" />
<input name="billet" type="hidden" value="<?php echo $_GET['billet']?>" /><br />
<input type="submit" value="envoyer le commentaire" />
</form>

</body>
</html>


  et voila le code de com_post.php

<?php 



//Connexion a la base de donner

try{
$bdd = new PDO('mysql:host=localhost;dbname=php','root','');
}
catch (Exception $e){
	
	die('Erreur :'.$e->getMessage());
	}
	
$req = $bdd->prepare('INSERT INTO commentaires (id_billet, auteur , commentaire, date) VALUES(?, ?, ?, NOW()');	
$req->execute(array($_POST['auteur'],$_POST['commentaire'],$_POST['billet']));


header('location: com.php?billet='.$_POST['billet']);
	
	?>

Merci de me rependre

  • Partager sur Facebook
  • Partager sur Twitter
Nassim
9 juillet 2013 à 9:51:13

Bonjour,

La prochaine fois, rends-toi plutôt sur le forum PHP et crée un nouveau sujet.

L'ordre des paramètres est important pour les requêtes préparées avec ?

Dans la requête préparée, tu mets d'abord l'id_billet, puis l'auteur, puis le commentaire.

Dans l'execute(), c'est pas du tout le même ordre.

  • Partager sur Facebook
  • Partager sur Twitter
29 mai 2017 à 3:17:58

bonsoir tout le monde

si vous utiliser la méthode PDO pour vous connecter à la base de données vous pouvez relier l'id de la table commentaires avec id_article (par exemple) utilisé la requête avec la méthode JOIN elle permet de donner un alias à vos nom de table et les champs que vous souhaiter relier comme ca on peut afficher les commentaire sur la page des article et on rajoutant la fonction toggle() de Jquery vous pouvez cacher et afficher la liste des commentaire ;)

PS: j'espere avoir participer à l'amélioration de ce sujet

voici comment on utilise JOIN:

SELECT [alias1.]champ1, [alias2.]champ2… listeDesChamps


FROM [nomBase.]nomTable1 [{ INNER | { LEFT | RIGHT } [OUTER] }]


JOIN [nomBase.]nomTable2{ ON condition | USING ( colonne1 [, colonne2]... )}


| { CROSS JOIN | NATURAL [{ LEFT | RIGHT } [OUTER] ]


JOIN [nomBase.]nomTable2 } …


[ WHERE condition ];



-
Edité par souhailettaoussi 29 mai 2017 à 3:21:39

  • Partager sur Facebook
  • Partager sur Twitter