Modification et validation des 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 maintenant créer la page qui va nous permettre de modifier, supprimer, black-lister ou valider un commentaire en attente de modération.
Dans la page "commentaire.php" qui concerne la gestion des commentaires, nous avons mis en place le lien suivant
<a href="modifier-commentaire.php?id='.$affiche['id'].'&page='.$affiche['id_page'].'&statut='.$affiche['validation'].'"><img src="images/modifier.png" alt="Modifier"/></a>
Ce lien transmet des données vers la page "modifier-commentaire.php" et c'est ainsi que va se nommer notre page!

Dans le code ci-dessous j'ai intégré directement :
  • La session pour l'utilisation de CKFinder.
  • L'appel au script CKEditor.
  • La requête sql permettant d'afficher les données dans le formulaire.
  • Les variables d'erreurs liés au formulaire.
  • Le masquage du formulaire pour éviter la répétition d'envoie.
<?php
session_start();
$IsAuthorized = true;
include('../fonctions.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr-fr">
 
<head>
 
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>Modifier un commentaire</title>
<link href="style.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../ckeditor/ckeditor.js"></script>
 
</head>
 
<body>
 
<div id="moncadre">
 
<?php include('menu.php');?>
 
<div class="cadrecentrale">
 
<h1>Modifier un commentaire</h1>
 
<?php
//On sélectionne les données pour les afficher dans le formulaire
$page = mysql_query("SELECT * FROM COMMENTAIRE WHERE id='".mysql_real_escape_string($id_transmit)."'");
while($affiche = mysql_fetch_array($page))
{
    $pseudo=$affiche['pseudo'];
    $commentaire=stripcslashes($affiche['commentaire']);
    $valide=$affiche['validation'];
    $date=convertit_date($affiche['date']);
    $email=$affiche['email'];
}
?>
 
<?php if(isset($message_ok)) echo $message_ok;
//On masque le formulaire
if($masquer_formulaire == 0) {
?>
<form action="#ok" method="post">
<p>Commentaire déposé le <?php echo $date;?> <br/> Url : <?php echo '<a target="_blank" href="'.$url_commentaire.'">'.$url_commentaire.'</a>';?></p>
<?php if(isset($alerte_pseudo)) echo $alerte_pseudo;?>
<p>Pseudo :<br/>
<input name="pseudo" size="65" value="<?php echo $pseudo;?>" type="text"/>
</p>
<p>Email :<br/>
<input name="email" size="65" value="<?php echo $email;?>" type="text"/>
</p>
<?php if(isset($alerte_commentaire)) echo $alerte_commentaire;?>
<p>Commentaire :<br/>
<textarea name="commentaire" rows="10" cols="50" ><?php echo $commentaire;?></textarea>
<script type="text/javascript">
CKEDITOR.replace( 'commentaire',
{
    filebrowserBrowseUrl : '/ckfinder/ckfinder.html',
    filebrowserImageBrowseUrl : '/ckfinder/ckfinder.html?type=Images',
    filebrowserFlashBrowseUrl : '/ckfinder/ckfinder.html?type=Flash',
    filebrowserUploadUrl : '/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files&currentFolder=/archive/',
    filebrowserImageUploadUrl : '/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Images&currentFolder=/cars/',
    filebrowserFlashUploadUrl : '/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Flash'
}
);
</script>
</p>
 
 
<p>Statut du commentaire :<br/>
<select name="valide">
<option value="">Sélectionnez un choix</option>
<option value="0"<?php if ($valide==0) {echo "selected='selected'";}?>>En attente</option>
<option value="1"<?php if ($valide==1) {echo "selected='selected'";}?>>Valider</option>
<option value="2"<?php if ($valide==2) {echo "selected='selected'";}?>>Blacklister</option>
<option value="3"<?php if ($valide==3) {echo "selected='selected'";}?>>Supprimer</option>
</select>
</p>
 
<p>
<input name="Valider" value="Valider" type="submit"/>
<input name="Effacer" value="Effacer" type="reset"/>
</p>
</form>
<?php
//Fin masque formulaire
}
?>
</div>
 
<?php include('footer.php');?>
 
</div>
 
</body>
 
</html>
 Juste pour info concernant les options de validation du formulaire :
0 = En attente
1 = Valider
2 = Black-lister
3 = Supprimer
 
Nous allons maintenant compléter le code en intégrant celui-ci avant la requête sql pour la sélection des données à afficher dans le formulaire.

On récupère ce qui est transmit par l'url et on se connecte à la BD.
//on récupère les variables qui transites par l'url
$id_transmit=$_GET['id'];
$id_page=$_GET['page'];
$statut=$_GET['statut'];
 
//On se connecte à la base de données
include('../connexion_bd.php');
connexion_bd();
On va ensuite chercher quelques informations sur l'article lié au commentaire :
//On va chercher les informations sur la pages à qui appartient le commentaire
$infopage = mysql_query("SELECT id_categorie,titre,titre_rewrite FROM CONTENU WHERE id='".mysql_real_escape_string($id_page)."'");
while($afficheinfopage = mysql_fetch_array($infopage))
{
    $id_categorie=$afficheinfopage['id_categorie'];
    $titre_article=$afficheinfopage['titre'];
    $url_article=$afficheinfopage['titre_rewrite'];
}
On récupère la catégorie de l'article :
//On va chercher la catégorie à qui appartient le commentaire
$infocategorie = mysql_query("SELECT titre_rewrite FROM CATEGORIES WHERE id='".mysql_real_escape_string($id_categorie)."'");
while($afficheinfocategorie = mysql_fetch_array($infocategorie))
{
    $dossier_article=$afficheinfocategorie['titre_rewrite'];
}
On construit l'url de la page et on initialise le formulaire :
//On construit l'url de la page et on supprime l'extension
$url_commentaire = 'http://'.$_SERVER['HTTP_HOST'].'/'.$dossier_article.'/'.sanspointphp($url_article).'#'.$id_transmit.'';
//initialisation du masquage du formulaire
$masquer_formulaire = 0;
Et la vous vous demandez peut être pourquoi on fait ça...?
Tout simplement pour transmettre l'url précis du commentaire dans le mail que va recevoir le dépositaire du commentaire et tout ceux et celles qui suivent le sujet. Vous allez comprendre dans la suite du tutoriel .

On passe maintenant au traitement du formulaire :
//Traitement du formulaire
if(isset($_POST["Valider"]))
{
    $formulaire_pseudo = htmlspecialchars(stripcslashes(trim($_POST["pseudo"])));
    $formulaire_email = stripcslashes($_POST["email"]);
    $formulaire_commentaire = stripcslashes($_POST["commentaire"]);
    $formulaire_valide = $_POST["valide"];
Si le commentaire déposé est "stupide" ou je ne sais quoi d'autre sans gravité, on le supprime directement sans vérification :
    //Action de supprimer le commentaire
    if($formulaire_valide==3){
        //On efface le commentaire
        $efface_commentaire = mysql_query("DELETE FROM COMMENTAIRE WHERE id = $id_transmit");
        //Si il y a une erreur, on crie ^^
        if (!$efface_commentaire) {
            die('Requête invalide : ' . mysql_error());
        }
        else{
            echo '<div class="ok">Le commentaire à été supprimé avec succès. <a href=commentaire.php>Retour à l\'administration.</a></div>';
            exit();
        }   
    }
On vérifie le formulaire :
    //Vérification du formulaire
    if(empty($formulaire_pseudo)){
        $alerte_pseudo ='<div class="erreur"><a name="ok"></a>Le pseudo est vide.</div>';
    }
    else if(empty($formulaire_commentaire)){
        $alerte_commentaire ='<div class="erreur"><a name="ok"></a>Le commentaire est vide.</div>';
    }
Si tout est "ok", on enregistre, on informe le webmaster du bon déroulement, on masque le formulaire et on redirige :
    //Si tout est ok
    else
    {
        //On enregistre les données
        $result = mysql_query(" UPDATE COMMENTAIRE SET pseudo='".mysql_real_escape_string($formulaire_pseudo)."', commentaire='".mysql_real_escape_string($formulaire_commentaire)."', validation='".mysql_real_escape_string($formulaire_valide)."' WHERE id = '$id_transmit'");
 
        //Si il y a une erreur, on crie ^^
        if (!$result) {
            die('Requête invalide : ' . mysql_error());
        }
        else{
            //Si tout est ok, on informe le webmaster
            $message_ok = '<div class="ok"><a name="ok"></a>Commentaire modifi&eacute;e avec succ&egrave;s! Redirection automatique en cours... <img src="images/loading.gif" alt="Loading"/></div>';
                    //on masque le formulaire
        $masquer_formulaire=1;
            echo '<script> function redirection(page){ window.location=page; } setTimeout(\'redirection("commentaire.php")\',8000); </script>';
On passe maintenant à l'envoie du ou des mails....

Si le commentaire est validé pour la première fois on informe l'auteur du commentaire que son commentaire est en ligne :    
            if($formulaire_valide==1 AND empty($statut)){
                //email de celui qui envoie
                $webmaster = $adresse_email;
                //email de celui qui reçoit
                $a_qui_j_envoie = $formulaire_email;
                //sujet
                $subject = "Commentaire en ligne";
                //message  
                $msg  = "Bonjour $formulaire_pseudo<br/><br/>";
                $msg .= "Votre commentaire concernant l'article « ".$titre_article." » à été accepté et est visible sur cette page ".$url_commentaire."<br/><br/>Cordialement,<br/>http://".$_SERVER['HTTP_HOST'].".<br/>Courriel automatique (Ne pas répondre à ce message)";
                //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);
Si le commentaire à déjà été validé mais que d'autres commentaires ont été déposés à la suite, on informe alors tout ceux et celles qui suivent le sujet qu'une nouvelle réponse a été déposé :
                //On envoie un mail à ceux qui suivent le sujet tout en excluent le posteur
                $result1 = mysql_query("SELECT MAX(id),email,pseudo,suivre_sujet FROM COMMENTAIRE WHERE email != '$formulaire_email' AND suivre_sujet='Oui' AND id_page='$id_page' AND validation='1' GROUP BY email");
                //si il y a au moins un résultat
                if(mysql_num_rows($result1) >= 1 ){
                    //on va chercher tout ce qui correspond
                    while($envoi_mail = mysql_fetch_array($result1))
                    {
                        $pseudo=$envoi_mail["pseudo"];
                        $mail=$envoi_mail["email"];
                        $subject1 = "Réponse au commentaire...";
                        //message  
                        $msg1  = "Bonjour $pseudo<br/><br/>";
                        $msg1 .= "Un nouveau commentaire concernant l'article « ".$titre_article." » a été déposé et est disponible sur la page $url_commentaire.<br/>";
                        $msg1 .= "Vous pouvez vous désabonner ici http://".$_SERVER['HTTP_HOST']."/desabonnement.php?contact=$mail&id=".$envoi_mail["MAX(id)"]."<br/><br/>";
                        $msg1 .= "Cordialement http://".$_SERVER['HTTP_HOST'].".<br/>Courriel automatique (Ne pas répondre à ce message)";
 
                        //email des posteurs 
                        $recipient1 = $mail;
                        //email de celui qui envoie le mail
                        $mailheaders1 = "From: $adresse_email\n";
                        $mailheaders1 .= "MIME-version: 1.0\n";
                        $mailheaders1 .= "Content-type: text/html; charset= iso-8859-1\n";
                        //on envoie l'email
                        mail($recipient1, $subject1, $msg1, $mailheaders1);
 
                        //on ferme la boucle while
                    }
                    //Si il y a une erreur, on crie ^^
                    if (!$result1) {
                        die('Requête invalide : ' . mysql_error());
                    }
                }
La requête un peut étrange de ce dernier code permet de trouver les personnes qui suivent le sujet en sélectionnant uniquement le derniers statut (Oui, Non) du dernier commentaire qu'ils ont déposés lié au sujet.
Dans la foulé, un lien de désabonnement est proposé dans le mail envoyé.

Pour finir, on ferme toutes les boucles précédemment ouvertes :
                //on ferme if($formulaire_valide==1 AND empty($statut)){
            }
            //on ferme else
        }
        //On ferme else
    }
    //On ferme if(isset($_POST["Valider"]))
}
Note : le black-listage d'un individu repose sur l'adresse email et l'adresse ip.
Voir/déposer un commentaire (0) | Signaler un problème