Partage
  • Partager sur Facebook
  • Partager sur Twitter

Système de commentaires

Sujet résolu
20 décembre 2008 à 20:29:25

Bonjour,

Au moment où j'en avais besoin, un très bon tutoriel a disparu (Le tuto "Système de commentaire de news" qui complétait le tutoriel de M@teo21 sur PHP dont l'un des TP était un système de news).

En fait il me manquait deux informations. Comment faire un lien "x commentaires" à la suite de chaque news (donc comment afficher le nombre de commentaires et comment faire pour que le lien soit automatiquement créé de la façon commentaires.php?id=1547 par exemple) et ma seconde information est que je ne sais pas vraiment comment classer les commentaires dans la BDD, je ne sais pas comment m'y prendre. Il faut créer une table "commentaires" avec dedans les commentaires mais comment les distingués de quel commentaire va avec quelle news ? :euh:

Merci d'avance. ;)
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2008 à 23:57:49

Bonjour,

Bon, c'est pas très compliqué à mettre en place tout ça. Pour ta table "news", on va dire que tu as comme champs : id, titre, auteur, message. Pour la table "commentaire", tu auras les champs suivants : id, idnews, auteur, message. Tu remarqueras que j'ai nommé un champs idnews, il te permettra d'enregistrer les commentaires en fonction de la news. Maintenant, avec ces deux tables, tes questions ont toutes une réponse :

Citation : ruudvannistelrooy

Comment faire un lien "x commentaires" à la suite de chaque news (donc comment afficher le nombre de commentaires



Il va falloir faire une jointure dans ta requête entre tes deux tables, grâce au champs id de la table "news" et du champs idnews de la table "commentaire". Il y a un tuto sur le Sdz si tu ne sais pas ce que c'est qu'une jointure.

Citation : ruudvannistelrooy

et comment faire pour que le lien soit automatiquement créé de la façon commentaires.php?id=1547 par exemple)



Comme tu souhaites accéder à la page de commentaires en fonction de la news, tu mets ceci : commentaires.php?id=X où X est l'id de la news. Et lorsque tu seras dans la pages commentaires.php, tu feras une requêtes en fonction de la valeur de l'id ($_GET['id']) avec :

WHERE idnews = '.$_GET['id'].'


Voilà, je t'ai donné toutes les informations utiles, le reste, tu peux le faire sans moi (c'est pour ça que je ne te donne pas de code, sinon ça ne servirait à rien).
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2008 à 12:20:22

Bonjour,

En ce qui concerne le lien de la page j'avais trouvé. ;)

<a href="/site/commentaires.php?id_news=<?php echo $donnees['id']; ?>&amp;titrenews=<?php echo htmlspecialchars($donnees['titre']); ?>">Commentaires</a>


Ensuite pour l'enregistrement des messages j'aimerais savoir si mon système est bon : le visiteur écrit son pseudo et son message, il envoie. L'ID du message s'enregistre (c'est pour ça qu'il y a le auto_increment sur le champ ID) et ensuite l'ID de la news va s'enregistrer dans la news. Ensuite, lorsque je veux afficher les messages de la news n°1 par exemple, je demande tous les messages dont idnews = 1 et je les met dans l'ordre avec l'ID du commentaires. L'idée est bien ?

Voici la table que j'ai créé :
CREATE TABLE `commentaires` (
  `id` mediumint(9) NOT NULL auto_increment,
  `idnews` mediumint(9) NOT NULL,
  `message` text NOT NULL,
  `pseudo` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Merci d'avance.
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2008 à 12:21:58

Pour chaque commentaire, tu mets l'id de la news correspondant.
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2008 à 12:37:01

J'étais en train d'édité mon message... :-°
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2008 à 13:04:34

Voilà ce que j'ai créé pour afficher les commentaires qui ont uniquement "1" comme valeur idnews sur MySQL, mais ça m'affiche tout... :o

<?php
mysql_connect("localhost", "root", "");
mysql_select_db("burni55975");
// On récupère les news
$retour = mysql_query('SELECT * FROM commentaires');
$idnews = mysql_query('SELECT idnews FROM commentaires');

// On choisi de n'afficher que les messages dont idnews = 1
if ($idnews = 1)
{

// On créé la boucle
while ($donnees = mysql_fetch_array($retour))
{
	echo 'pseudo : ';
	echo $donnees['pseudo'];
	echo '<br />';
	echo 'message : ';
	echo $donnees['message'];
	echo '<br />';
	echo '<br />';
}

}
mysql_close();
?>
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2008 à 13:30:30

Marque plutôt
<?php
$retour = mysql_query('SELECT * FROM commentaires WHERE idnews="'.$_GET['id'].'"');
$donnees = mysql_fetch_array($retour)

?>
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2008 à 14:39:26

Punkside : Merci, j'ai retiré cependant la ligne qui était déjà dans les conditions de la boucle.

<?php
$donnees = mysql_fetch_array($retour)
?>


Laygen :

// Ce code fonctionne :
<?php
if ($idnews = 1)
?>
// Ce code ne fonctionne pas :
<?php
if ($idnews == 1)
?>


Et je ne sais pas pourquoi :o

Voici donc mon code complet au final :

<!-- D'abord on affiche la news -->
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("burni55975");
// On récupère les news
$retour = mysql_query('SELECT * FROM commentaires WHERE idnews="'.$_GET['idnews'].'"');

// On créé la boucle
while ($donnees = mysql_fetch_array($retour))
{
	echo 'pseudo : ';
	echo $donnees['pseudo'];
	echo '<br />';
	echo 'message : ';
	echo $donnees['message'];
	echo '<br />';
	echo '<br />';
}
mysql_close();
?>
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2008 à 14:58:59

Change $_GET['idnews'] par $_GET['id'],
tu envoies une variable id, je m'étais trompé au début.
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2008 à 16:03:46

Non non tout fonctionne très bien.

Voici le lien de la page news :

<a href="commentaires.php?id_news=<?php echo $donnees['id']; ?>">Commentaires</a>


Et voici ma page des commentaires :

<?php
include("includes/haut.html");
?>

<div id="corps">
<span class="filariane">Vous êtes ici : <a href="index.php">Burning Mouse</a> > <a href="news.php">News</a> > <a href="">Commentaires</a></span>

<h2>News</h2>
<?php
// Connexion à MySQL
mysql_connect("localhost", "root", "");
mysql_select_db("burni55975");
// On récupère la news
$retour = mysql_query('SELECT * FROM news WHERE id="'.$_GET['id_news'].'"');
// On affiche la news
while ($donnees = mysql_fetch_array($retour))
{
?>
<li><b><?php $titre = nl2br(stripslashes($donnees['titre'])); echo $titre; ?></b></li>
<p class="p2">
	<?php
    // On enlève les éventuels antislash PUIS on crée les entrées en HTML (<br />)
    $contenu = nl2br(stripslashes($donnees['contenu']));
    echo $contenu;
	?></p>
<?php
}
?>
<?php
$retour = mysql_query('SELECT COUNT(*) AS nb_message FROM commentaires WHERE idnews="'.$_GET['id_news'].'"');
$donnees = mysql_fetch_array($retour);
?>
<p class="p2">__________________
<br /><br />
<b>Il y a <?php echo $donnees['nb_message']; ?> commentaires :</p></b>
<!-- On affiche les commentaires -->
<p class="p2">
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("burni55975");
// On récupère les news
$retour = mysql_query('SELECT * FROM commentaires WHERE idnews="'.$_GET['id_news'].'"');

// On créé la boucle
while ($donnees = mysql_fetch_array($retour))
{
	echo 'pseudo : ';
	echo $donnees['pseudo'];
	echo '<br />';
	echo 'message : ';
	echo $donnees['message'];
	echo '<br />';
	echo '<br />';
}
mysql_close();
?>
</p>


Maintenant je fais une page où les visiteurs vont envoyer leur message.

J'ai rajouter dans commentaires.php (la page du dessus) ceci :

// On créer la variable pour le lien de rédaction du commentaire
$commentaire = $_GET['id_news'];

<a href="commentaires2.php?id_news=<?php echo $commentaire; ?>">Ecrire un commentaire</a>


Puis j'ai créer ma page commentaires2.php :

<?php
include("includes/haut.html");
?>

<div id="corps">
<span class="filariane">Vous êtes ici : <a href="index.php">Burning Mouse</a> > <a href="news.php">News</a> > <a href="">Ecrire un commentaire</a></span>

<h2>Ecrire un commentaire</h2>
<form method="post" action="commentaires2.php">
        <p>Votre avis nous intéresse !</p>
        <p>
            Pseudo :<br />
			<input name="pseudo" /><br />
            Message :<br />
            <textarea name="message" rows="8" cols="35"></textarea><br />
            <input type="submit" value="Envoyer" />
        </p>
    </form>
<?php
// Connexion à MySQL
mysql_connect("localhost", "root", "");
mysql_select_db("burni55975");
$idn = $_GET['id_news'];
// On enregistre le message
if (isset($_POST['pseudo']) AND isset($_POST['message']))
{
    $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
    $message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
    $message = nl2br($message);
    mysql_query("INSERT INTO commentaires VALUES('', '" . $idn . "', '" . $pseudo . "', '" . $message . "')");
}

?>
</div>
<?php
include("includes/bas.html");
?>


Seulement tout marche sauf que l'ID de la news ne s'enregistre pas dans la BDD et c'est bien embêtant ! :-°

Merci d'avance.
  • Partager sur Facebook
  • Partager sur Twitter
10 janvier 2009 à 16:04:48

J'aimerais savoir si tu as réussi à régler ton soucis ou si uelqu'un pourrait aider car je suis coincer au même endroit que toi :(

Merci d'avance.
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2009 à 23:01:18

pourquoi le sujet est marqué comme résolu alors qu'il n'y a pas de réponse encore ?
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2009 à 23:48:30

Ce topic a réussi à m'inspirer afin de terminer les bonus du TD de Mateo pour le système de news en PHP. Et je suis content de moi puisque j'ai réussi!!

Voici mes solutions pour ceux qui rament!

Déjà, j'ai créé une table 'commentaires' avec 5 champs:
- id (du commentaire en auto-incrémentation)
- id_news (numéro identifiant de la news dans laquelle est inséré le commentaire)
- auteur
- commentaire
- timestamp (il est bien sûr préférable de rajouter la date et heure du commentaire)

Tout d'abord, voici la page /commentaire.php?id_news=Numéro où Numéro est l'id de l'article en question. Je vous ai laissé les balises style comme ça vous pourrez tester chez vous et ça sera déjà mis en page.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<HTML>
<HEAD>
<TITLE>Commentaires</TITLE>
<META NAME="GENERATOR" CONTENT="MAX's HTML Beauty++ 2004">

<style type="text/css">
	* {margin: 0; padding: 0; border: 0;}
	body {background-color: #000000;}
	#main {width: 50%; margin: auto; background-color: white; padding: 10px 15px;}
	h1 {width: 90%; margin: 30px auto 5px auto; text-align: center; padding: 4px 0px; background-color: #474747; font: 20px verdana; color: white; letter-spacing: 2px;}
	h2 {width: 90%; margin: 0px auto 20px auto; text-align: center; padding: 2px 0px; background-color: #808080; font: 10px verdana; color: white; letter-spacing: 3px;}
	form {width: 90%; margin: 40px auto;}
	label {width: 50px; margin-right: 15px; font: small-caps bold 15px arial;}
	#titre {border: 1px outset black; margin: 5px 10px 10px 0px; font: 14px arial; padding: 3px 5px 2px 5px;}
	#titre:focus {background-color: #dddddd; border: 1px inset black;}
	#submit {width: 60px; background-color: white; border: 1px outset black; margin: 3px 2px 5px 0px; font: 10px arial;}
	#submit:hover {border: 1px inset black}
	#champs {margin: 20px 0px 30px 0px; text-align: center; font: 15px arial; color: red;}
	hr {width: 40%; height: 1px; margin: auto; color: black; border-color: black; background-color: black;}
	#retour {width: 90%; margin: 20px auto 20px auto; text-align: center; padding: 2px 0px; background-color: #474747; font: 13px verdana; color: white; letter-spacing: 2px;}
	#retour a {color: white; text-decoration: none;}
	#retour a:hover {color: white; text-decoration: underline;}
	div.commentaire {width: 90%; margin: 10px auto 10px auto; background-color: #dddddd; border-top: 1px solid black; padding: 5px;}
	.pseudo {font: bold 11px arial; color: black;}
	.contenu {font: 13px arial; color: black;}
	
</style>

</HEAD>

<BODY>

<div id="main">
	<h1>COMMENTAIRES</h1>
	<h2>Ajoutez un Commentaire</h2>
        
        <!-- On commence par faire un zoli formulaire -->
	<form method="post" action="#">
	<label for="auteur">Auteur:</label>
	<input type="text" name="auteur" id="titre" size="20" maxlentgh="25" /><br />
	<label for="commentaire">Commentaire:</label><br />
	<textarea name="commentaire" id="titre" cols="60" rows="8"></textarea><br />
	<input type="submit" id="submit" value="Ajouter" />
	<input type="reset" id="submit" value="Effacer" />
	</form>

	<?php
	// Connexion à la BDD
	$connect = mysql_connect('localhost', 'root', '');
	mysql_select_db('tests');
	
        // On récupère l'identifiant de la page dans l'URL qui l'id de la news qui deviendra la variable id_news du commentaire
	$id_news = mysql_real_escape_string(htmlspecialchars($_GET['id_news']));
	//----------------------------------------------
	//      On ajoute les infos dans la BDD
	//----------------------------------------------
	
	// On vérifie que le formulaire a bien été validé et que tous les champs ont été rempli
	if (isset($_POST['auteur']) AND isset($_POST['commentaire']))
	{
		if (($_POST['auteur'] != NULL) AND ($_POST['commentaire'] != NULL))
		{	
			// On récupère les infos remplis par le visiteur
			
			$auteur = mysql_real_escape_string(htmlspecialchars($_POST['auteur']));
			$commentaire = mysql_real_escape_string(htmlspecialchars($_POST['commentaire']));
		
			// Requête pour ajouter les infos dans la table
			mysql_query("INSERT INTO commentaires (id, id_news, auteur, commentaire, timestamp) VALUES('', '" . $id_news . "', '" . $auteur . "', '" . $commentaire . "', '" . time() . "')");
		}
		else  // Alerte si les 2 champs n'ont pas été rempli
		{
			echo '<div id="champs">Vous n\'avez pas rempli tous les champs</div>';
		}
	}
	// Déconnexion BDD
	mysql_close($connect);
	?>
	
	<hr />
	
        <!-- On ajoute un petit lien pour revenir à la page principale après avoir donner son commentaire -->
	<div id="retour"><a href="news.php">Retour aux News</a></div>
	
	<?php
	
	//-------------------------------------------
	//       Affichage des Commentaires
	//-------------------------------------------
	
	// Connexion à la BDD
	$connect = mysql_connect('localhost', 'root', '');
	mysql_select_db('tests');
	
	// On fait la requête pour sélectionner les commentaires correspondant à l'article en question grâce à $id_news
	$retour = mysql_query("SELECT * FROM commentaires WHERE id_news='" . $id_news . "' ORDER BY id");
	
	while ($donnees = mysql_fetch_array($retour))
	{
	?>
	<div class="commentaire">
		<span class="pseudo"><?php echo stripslashes($donnees['auteur']); ?> a écrit le <?php echo date('d M Y à H\hi', $donnees['timestamp']); ?>:</span><br />
		<span class="contenu"><?php echo nl2br(stripslashes($donnees['commentaire'])); ?></span>
	</div>
	<?php
	}
	//Déconnexion
	mysql_close($connect);
	?>
	
</div>

</BODY>
</HTML>


Et voilà le travail... J'espère que ça marche chez vous et que vous avez bien tout compris! J'ai mis autant de commentaires que possible pour faciliter la compréhension.
N'oubliez pas de changer les identifiants de connexion à la BDD selon vos paramètre. Bien sûr j'aurais pu également rajouter le contenu de l'article à la page commentaire pour qu'on sache bien quel article on va commenter, mais ça n'est pas le plus dur à réaliser.

Voici enfin le lien vers la page commentaire à partir de l'article de la page principale.

<a href="commentaires.php?id_news=<?php echo $donnees['id']; ?>">
<!-- $donnees['id'] rapporte le numéro id de l'article et
 provient de ma requête qui permet d'afficher l'article
 dans la page principale. Pour vous, ce n'est pas nécessairement
 la variable $donnees. -->
		<?php
		// On récupère l'id de la news
		$id = $donnees['id'];
		// Connexion à la BDD
		$connect = mysql_connect('localhost', 'root', '');
		mysql_select_db('tests');
			
		// On fait une requête pour compter le nbre de commentaires de la news correspondant à l'id
		$comm = mysql_query("SELECT COUNT(*) AS nbre_comm FROM commentaires WHERE id_news='" . $id ."'");
		$retour = mysql_fetch_array($comm);
		$nbre_comm = $retour['nbre_comm'];
							
		// Déconnexion
		mysql_close($connect);
		// On affiche le nombre de commentaires retourné par la requête
		echo $nbre_comm;
		if ($nbre_comm >= 2)  // On n'oublie pas de faire une condition afin de bien orthographier 'Commentaire'
		{
		       echo ' Commentaires';
		}
		else
		{
		       echo ' Commentaire';
		}
					?>								
</a>
  • Partager sur Facebook
  • Partager sur Twitter
10 juillet 2011 à 21:22:43

Salut !

Je me permets de remonter car j'ai un problème dans le code de Toxicwill .

J'ai cet erreur qui s'affiche:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /xxx/xxx.php on line 100

Quelle est le problème s'il vous plait ? :euh:
  • Partager sur Facebook
  • Partager sur Twitter