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 à présent créer une page nommé "modifier-commentaire.php" à partir du gabarit qui va nous permettre de modifier, valider, supprimer ou black-lister un commentaire.
Comme nous utilisons Ckeditor et Ckfinder, il ne faut pas oublier l'ouverture de session ni l'appel au Javascript.
<?php
session_start();
$IsAuthorized = true;
?>
<!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>
</div>
<?php include('../footer.php');?>
</div>

</body>
</html>
Sous la balise "h1", nous créons un formulaire qui va afficher les données du commentaire. Comme d'habitude, une partie des variables y est directement intégrés pour alléger le tutoriel :
<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>
Notez bien les choix de validations (0, 1, 2 et 3).

Nous allons à présent placer le code PHP qui va suivre entre la balise "h1" et le début du formulaire. Pour commencer, on récupère les variables qui transitent par l'url puis on ouvre une connexion à la Bd :
<?php
//on récupère les variables qui transitent par l'url
$id_transmit=$_GET['id'];//identifiant du commentaire
$id_page=$_GET['page'];//identifiant de l'article
$statut=$_GET['statut'];//statut du commentaire

include('../fonctions.php');
//On se connecte à la base de données
include('../connexion_bd.php');
    mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe");
    mysql_select_db("$nom_de_la_base") or die('Impossible de s&eacute;lectionner une base de donn&eacute;e. Assurez vous d\'avoir correctement remplit les donn&eacute;es du fichier connexion_bd.php.');
On va chercher des informations sur l'article à qui appartient le commentaire qui va nous permettre de construire un lien vers le commentaire (si il est validé) qui sera envoyé dans les notifications :
$infopage = mysql_query("SELECT id,titre FROM CONTENU WHERE id='".mysql_real_escape_string($id_page)."'");
while($afficheinfopage = mysql_fetch_array($infopage))
{
    $id_article=$afficheinfopage['id'];
    $titre_article=$afficheinfopage['titre'];
}
//On construit l'url de la page ou se trouvera le commentaire
$url_commentaire = 'http://'.$_SERVER['HTTP_HOST'].'/page.php?id='.$id_article.'#'.$id_transmit.'';
//initialisation du masquage du formulaire
$masquer_formulaire = 0;
On passe maintenant au traitement du formulaire et on récupère toutes les variables :
//Traitement du formulaire
if(isset($_POST["Valider"]))
{
    $formulaire_pseudo = htmlspecialchars(stripcslashes($_POST["pseudo"]));
    $formulaire_email = stripcslashes($_POST["email"]);
    $formulaire_commentaire = stripcslashes($_POST["commentaire"]);
    $formulaire_valide = $_POST["valide"];
Si on supprime un commentaire :
//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. Redirection en cours...</div>
            <script type="text/javascript">function redirection(page){ window.location=page; } setTimeout(\'redirection("commentaire.php")\',5000);</script>';
            exit();
        }  
    }
Quand un commentaire est supprimé, on arrête le script via la fonction exit() afin d'éviter que les données suivantes soient traitées.

On vérifie les données (la j'ai fais simple, juste le pseudo et le commentaire mais vous pouvez vérifier les autres champs si ça vous tente) :
//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 bon, on modifie les données :
//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());
        }
Si pas d'erreur d'enregistrement, on informe et on redirige :
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 en cours... </div>';
        //on masque le formulaire
        $masquer_formulaire=1;
            //Redirection
            echo '<script type="text/javascript">function redirection(page){ window.location=page; } setTimeout(\'redirection("commentaire.php")\',5000);</script>';
Si le commentaire est validé pour la première fois, on informe l'auteur du commentaire que celui-ci a été accepté :
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);
On envoie un mail aux utilisateurs qui suivent le sujet tout en excluent le posteur :
//On sélectionne le dernier id de chaque email
                $result1 = mysql_query("SELECT MAX(id),email,pseudo 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 moin 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 = "Nouveau 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
                    }
Attardons-nous un peut sur la requête suivante pour comprendre ce qu'elle fait :
$result1 = mysql_query("SELECT MAX(id),email,pseudo FROM COMMENTAIRE WHERE email != '$formulaire_email' AND suivre_sujet='Oui' AND id_page='$id_page' AND validation='1' GROUP BY email");
Pour simplifier, on demande d'allé chercher les identifiants les plus grand en regroupant les emails dont le mail utilisé est différent de celui du posteur et qui suit les commentaires du même article et qui ont été validés.

En cas d'erreur de la requête, on informe et referme le tout :
//Si il y a une erreur, on crie ^^
                    if (!$result1) {
                        die('Requête invalide : ' . mysql_error());
                    }
                }
                //on ferme if($formulaire_valide==1 AND empty($statut)){
            }
            //on ferme else
        }
        //On ferme else
    }
    //On ferme if(isset($_POST["Valider"]))
}
Pour afficher les données du commentaire dans le formulaire, on effectue une requête :
//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'];
}
Si le formulaire est posté et sans erreur, on cache celui-ci et on informe le webmaster :
//Si le formulaire est posté et que tout est bon
if(isset($message_ok)) echo $message_ok;
//On masque le formulaire si la variable est égal à zéro
if($masquer_formulaire == 0) {
?>
Pour terminer, on ferme la boucle du masquage du formulaire sous la balise </form> :
<?php
//Fin masque formulaire
}
?>

Note : Si vous utilisez l'url rewriting, vous devez penser à modifier la variable $url_commentaire comme ci-dessous :
$url_commentaire = 'http://'.$_SERVER['HTTP_HOST'].'/'.OptimiseUrl($titre_article).'-'.$id_article.'.php#'.$id_transmit.'';


Valider un commentaire

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