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 ?
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).
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 ;
<?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>
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>
BwooGames : Un groupe indépendant passionné par les jeux vidéos. Donnez vos avis sur Evil Tournament!