Création du système de commentaires

Attention, depuis PHP 5.5.0, certaines extensions SQL sans doute utilisées dans ce tutoriel peuvent être obsolètes et seront supprimées dans le futur, vous devez donc adapter les codes! Exemples ici.
Nous allons concevoir dans cette partie du tutoriel un formulaire permettant aux visiteurs de déposer des commentaires. Ce système de commentaires sera intégré directement dans les articles, ce qui signifie que les commentaires seront affichés à la suite des articles par l'intermédiaire d'une simple include.
Nous allons créer un nouveau fichier nommé "commentaire.php" qui sera par la suite à placer à la racine de votre site. Nous commençons donc par concevoir le formulaire. Pour me simplifier la tache dans la rédaction de ce tutoriel, certaines variables sont déja intégrées dans le code et permettent entre autre de signaler à l'utilisateur les erreurs rencontrées lors de la validation de celui-ci :
<div class="commentaire">

<span class="commentaire-thematique">Laisser un commentaire</span>

<?php
if(isset($message_ok)) echo $message_ok;
//On masque le formulaire
if($masquer_formulaire == 0) {
    ?>
    <form class="form" action="#ok" method="post">
    <!-- Pseudo -->
    <?php if(isset($alerte_pseudo_admin)) echo $alerte_pseudo_admin;?>
    <?php if(isset($alerte_pseudo)) echo $alerte_pseudo;?>
    <label for="pseudo">Pseudo:</label>
    <input name="pseudo" size="22" value="<?php
if (!empty($_POST["pseudo"])) {
echo stripcslashes(htmlspecialchars($_POST["pseudo"],ENT_QUOTES));
}
?>" type="text"/>
    <br/>
    <!-- Email -->
    <?php if(isset($alerte_email)) echo $alerte_email;?>
    <?php if(isset($alerte_email_bis)) echo $alerte_email_bis;?>
    <label for="email">Email:</label>
    <input name="email" size="22" value="<?php
if (!empty($_POST["email"])) {
echo stripcslashes(htmlspecialchars($_POST["email"],ENT_QUOTES));
}
?>" type="text"/>
    <br/>
    <!-- Commentaire -->
    <?php if(isset($alerte_commentaire)) echo $alerte_commentaire;?>
    <label for="commentaire">Commentaire:</label><br/>
    <textarea name="commentaire" rows="10" cols="50"><?php
    if (!empty($_POST["commentaire"])) {
        echo stripcslashes(htmlspecialchars($_POST["commentaire"],ENT_QUOTES));
    }
    ?></textarea><script type="text/javascript">
    CKEDITOR.replace( 'commentaire',
    {
        toolbar :
        [
        ['Source','-','Undo','Redo'],
        ['Bold','-','Italic','-','Underline'],
        ['NumberedList','BulletedList','-','Blockquote'],
        ['Link','Unlink'],
        ['Image','-','Smiley','-','TextColor']
        ]
    });
    </script>
    <br/>
    <!-- Suivit du sujet -->
    <?php if(isset($alerte_suivre_sujet)) echo $alerte_suivre_sujet;?>
    <label for="suivre_sujet">Suivre les réponses :</label>
    <select name="suivre_sujet">
    <option value="">Sélectionnez</option>
    <option value="Non"<?php if(isset($suivre_sujet) && $suivre_sujet=="Non") { echo "selected='selected'";}?>>Non</option>
    <option value="Oui"<?php if(isset($suivre_sujet) && $suivre_sujet=="Oui") { echo "selected='selected'";}?>>Oui</option>
    </select>
    <br/>
    <!-- Captcha -->
    <?php
    if (isset($alerte_capcha_vide)) echo $alerte_capcha_vide;
    if (isset($alerte_capcha_erreur)) echo $alerte_capcha_erreur;
    ?>
    <label for="capcha">Captcha :</label>
    <input name="capcha" size="22" value="<?php
if (!empty($_POST["capcha"])) {
echo stripcslashes(htmlspecialchars($_POST["capcha"],ENT_QUOTES));
}
?>" type="text"/><span class="capcha"><?php echo $pass;?></span>
    <input name="verification_capcha" size="22" value="<?php echo $pass;?>" type="hidden"/>
    <br/>
    <!-- Validation -->
    <label for="Valider">Action :</label>
    <input name="Valider" value="Valider" type="submit"/>
    <input name="Effacer" value="Effacer" type="reset"/>
    <br/>
    </form>

    </div>
Petites explications :
Vous avez peut être remarqué la partie "if($masquer_formulaire == 0) {" et constaté que celle-ci n'est pas fermée ... rassurez-vous, c'est normal, elle le sera plus tard :). Cette variable permet de masquer le formulaire quand l'utilisateur aura correctement remplit et validé celui-ci.
Vous avez peut être également remarqué que le "textarea" permettant de saisir le commentaire utilise l'éditeur CKEDITOR ... ce qui signifie qu'il faudra y faire appel à un moment et nous verrons ça un peut plus tard.

Nous allons à présent commencer le code PHP du formulaire et celui-ci va débuter au dessus du formulaire donc avant "<div class="commentaire">".
On initialise le masquage du formulaire, on récupère les données plus quelques variables utiles et on passe le commentaire automatiquement en attente :
<?php
//initialisation du masquage du formulaire
$masquer_formulaire = 0;

if(isset($_POST["Valider"]))
{
    //Variable
    $pseudo = htmlspecialchars(stripcslashes($_POST["pseudo"]));
    $email = htmlspecialchars(stripcslashes($_POST["email"]));
    $commentaire = htmlspecialchars(stripcslashes($_POST["commentaire"]));
    $suivre_sujet = $_POST["suivre_sujet"];
    $capcha = htmlspecialchars(stripcslashes($_POST["capcha"]));
    $verification_capcha = htmlspecialchars(stripcslashes($_POST["verification_capcha"]));
    $ip = getIp();
    $timestamp = time();
    $validation = 0;
On vérifie si l'utilisateur est banni :
//L'auteur du poste est il banni (2)
    $ban = mysql_query("SELECT email,ip FROM COMMENTAIRE WHERE validation = '2' AND (ip = '".mysql_real_escape_string($ip)."' OR email = '".mysql_real_escape_string($email)."')");
    //Si le résultat est différent de zéro, c'est que l'auteur est banni
    if(mysql_num_rows($ban) != 0)
    {
        echo '<div class="erreur"><a name="ok"></a>Le système de commentaires vous est refusé!</div>';
    }
L'utilisateur n'est pas banni, on vérifie les données saisies :
//Traitement du formulaire
    //Le pseudo est il celui de l'admin
    else if($pseudo == $pseudo_admin){
        $alerte_pseudo_admin ='<div class="erreur"><a name="ok"></a>Vous ne pouvez pas utiliser ce pseudo. Merci d\'en choisir un autre.</div>';
    }
    else if(empty($pseudo)){
        $alerte_pseudo ='<div class="erreur"><a name="ok"></a>Vous n\'avez pas saisie votre pseudo.</div>';
    }
    else if(empty($email)){
        $alerte_email ='<div class="erreur"><a name="ok"></a>Vous n\'avez pas saisie votre email.</div>';
    }
    //on contrôle la validitée de l'email
    else if (!preg_match("#^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*.[a-z]{2,4}$#",$email))
    {
        $alerte_email_bis ='<div class="erreur"><a name="ok"></a>Votre Email semble ne pas être valide.</div>';
    }
    else if(empty($commentaire)){
        $alerte_commentaire ='<div class="erreur"><a name="ok"></a>Vous n\'avez pas saisie votre commentaire.</div>';
    }
    else if(empty($suivre_sujet)){
        $alerte_suivre_sujet ='<div class="erreur"><a name="ok"></a>Vous n\'avez pas sélectionné votre choix.</div>';
    }
    else if(empty($capcha)){
        $alerte_capcha_vide ='<div class="erreur"><a name="ok"></a>Vous n\'avez pas saisie le captcha.</div>';
    }
    else if($capcha != $verification_capcha){
        $alerte_capcha_erreur ='<div class="erreur"><a name="ok"></a>Le captcha que vous avez saisie est incorrecte.</div>';
    }
On ne rencontre aucun problème, on enregistre :
//Tout est ok
    else {
        // on enregistre les données
        $result = mysql_query("INSERT INTO COMMENTAIRE VALUES
(
'',
'".mysql_real_escape_string($id_transmit)."',
'".mysql_real_escape_string($pseudo)."',
'".mysql_real_escape_string($email)."',
'".mysql_real_escape_string($commentaire)."',
'".mysql_real_escape_string($ip)."',
'".mysql_real_escape_string($timestamp)."',
'".mysql_real_escape_string($validation)."',
'".mysql_real_escape_string($suivre_sujet)."'
)
");
        //Si il y a une erreur
        if (!$result) {
            die('Requête invalide : ' . mysql_error());
        }
Si pas de soucis d'enregistrement, on informe le webmaster qu'un commentaire est en attente :
//pas d'erreur d'enregistrement
        else {
            //on informe le webmaster qu'un commentaire à été déposé
            //email de celui qui envoie
            $webmaster = $adresse_email;
            //email de celui qui reçoit
            $a_qui_j_envoie = $adresse_email;
            //sujet
            $subject = "Commentaire en attente";
            //message 
            $msg  = "Bonjour <br/><br/>";
            $msg .= "Un commentaire concernant l'article « ".$titre." » est en attente de validation sur votre site <a href=\"http://".$_SERVER['HTTP_HOST']."\">http://".$_SERVER['HTTP_HOST']."</a><br/>";
            $msg .= "Date et heure : le ".convertit_timestamp_en_date("$timestamp")."";
            //permet de savoir qui envoie le mail et d'y répondre
            $mailheaders = "From: $webmaster\n";
            $mailheaders .= "MIME-version: 1.0\n";
            $mailheaders .= "Content-type: text/html; charset= iso-8859-1\n";
            //on envoie l'email
            mail($a_qui_j_envoie, $subject, $msg, $mailheaders);
        }
Pour finir, on informe l'utilisateur que son commentaire est en attente puis on le redirige automatiquement vers la même page :
//on informe que le message est enregistré
        $message_ok = '<div class="ok"><a name="ok"></a>Votre commentaire est en attente de validation. Merci de votre participation ;)! Vous allez être redirigé automatiquement d\'ici quelques secondes.</div>';
        //on masque le formulaire
        $masquer_formulaire=1;
        //on redirige vers la page en cours pour éviter la répétition d'envoie du formulaire
        echo '<script type="text/javascript">function redirection(page){ window.location=page; } setTimeout(\'redirection("'.$_SERVER['REQUEST_URI'].'")\',5000);</script>';
        //on ferme else
    }
    //Fermeture de if(isset($_POST["Valider"]))
}
?>
Il est à noter que l'utilisation de la variable d'environnement "$_SERVER['HTTP_HOST']" dans ce code indiquera "localhost" si vous faites vos testes en local.

Bon, théoriquement et à ce stade, les commentaires sont enregistrés en BD et en attentes de validation. Nous allons donc à présent afficher les commentaires validés et pour ce faire nous allons commencer un nouveau code PHP qui débutera sous le formulaire donc après la balise "</div>".

Si l'utilisateur à correctement remplit et validé le formulaire, on cache celui-ci :
<?php
    //On ferme if($masquer_formulaire == 0)
}
On sélectionne tout les commentaires validés correspondant à l'article et on change la class CSS du cadre qui entoure le commentaire quand c'est l'admin. qui a posté :
//On va chercher les commentaires en rapport avec la page
$affiche_commentaire = mysql_query("SELECT id,pseudo,commentaire,date FROM COMMENTAIRE WHERE id_page='".mysql_real_escape_string($id_transmit)."' AND validation='1' ORDER BY id ASC");
//Si il y a quelque chose, on affiche
if(mysql_num_rows($affiche_commentaire) != 0)
{
    while($affiche = mysql_fetch_array($affiche_commentaire))
    {
        //On change la couleur du cadre des réponses de l'admin
        if($affiche['pseudo']==$pseudo_admin){
            echo '<div class="cadre-commentaire-admin">';
        }
        //Cadre normal
        else{
            echo '<div class="cadre-commentaire">';
        }
        //On affiche les commentaires
        echo '<a name="'.$affiche['id'].'"></a> <b>'.$affiche['pseudo'].' <span class="date">'.convertit_date($affiche['date']).'</span></b><br/><br/>'.nl2br($affiche['commentaire']).'</div>';
    }
}
Si il n'y a aucun commentaire :
//Si aucun commentaire
else{
    echo '<div class="cadre-commentaire-admin"><b>'.$pseudo_admin.' <span class="date">'.convertit_date(time()).'</span></b><br/><br/>Aucun commentaire pour le moment concernant le sujet « <strong>'.$titre.'</strong> »!</div>';
}
?>
Pour finir cette partie et comme je le disais au début de ce tutoriel, nous allons inclure le système de commentaires dans les articles sans oublier l'appel à l'éditeur CKEDITOR.
On ouvre le fichier "page.php" puis dans l'entête du document sous la balise "link" on intègre le code suivant :
<script type="text/javascript" src="ckeditor/ckeditor.js"></script>
Sous la variable "$contenu" (ou la ou vous le souhaitez), on inclue le système de commentaires :
<?php
echo $contenu;
include('commentaire.php');
?>

Note : Si votre fichier "page.php" ne contient pas un appel au fichier "fonctions.php", vous devez faire une include de celui-ci comme ci-dessous :
// on se connecte à la base de données
include('connexion_bd.php');
//on inclue les fonctions
include('fonctions.php');

Système de commentaire


Si vous souhaitez afficher le nombre de commentaires en attente, ouvrez le fichier "index.php" de la partie admin et insérer le code suivant après la connexion à la BD :
$commentaire_en_attente = mysql_query("SELECT id FROM COMMENTAIRE WHERE validation='0'");
$total_commentaire_en_attente = mysql_num_rows($commentaire_en_attente);
echo '<p>Commentaire en attente : '.$total_commentaire_en_attente.'</p>'; 

Voir/déposer un commentaire (0) | Signaler un problème