Steve TENZA
Intervient pour votre site internet
Facebook Me contacter Cookie
Télécharger
Noter:
3.9/5 (22)
Ajouté/Modifié le 2024-12-29
Visionné 76430 fois

Système de commentaire en PHP

Description

Avec ce script, vos visiteurs pourront ajouter des commentaires sur votre site web, vous pouvez l'utiliser pour créer un livre d'or, des témoignages ou avis client, ou encore permettre aux visiteurs de laisser des commentaires sur vos articles de blog.

J'ai simplifié au maximum le code en terme visuel, de manière à ce que vous puissiez facilement personnaliser le script selon vos besoins. Mon objectif étant de vous proposer un système de commentaires simple à installer, sans nécessiter une expertise avancée en CSS ou en balises HTML pour la mise en forme.

Ce script se compose de trois fichiers distincts :

- La page qui contient le formulaire permettant aux utilisateurs d'ajouter un commentaire.

- Un fichier de fonctions PHP qui prend en charge le fonctionnement du système de commentaires.

- Une table SQL prête à être importée dans votre SGBD, tel que phpMyAdmin ou Adminer.


Ainsi, grâce à ces fonctionnalités, vous pouvez rapidement mettre en place un formulaire de commentaires sur votre site pour recueillir des avis, adaptez-le selon vos besoins.

Vous pouvez télécharger le script ici :

systeme-de-commentaires.zip
(Téléchargé 1210 fois)



<?php
//on définit notre variable pour pouvoir inclure les fichiers mais interdire l'accès direct
define("C2SCRIPT", true);
include("fonctions/fonctions.php");

//on se connecte à la base de données (à adapter/remplacer avec votre système de connexion)
$BDD = array();
$BDD['serveur'] = "localhost";
$BDD['login'] = "root";
$BDD['pass'] = "";
$BDD['bdd'] = "nom_de_la_base_de_donnees";
$mysqli = mysqli_connect($BDD['serveur'],$BDD['login'],$BDD['pass'],$BDD['bdd']);
if(!$mysqli) exit('Connexion MySQL non accomplie !');


?><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Système de commentaires</title>

</head>
<body>
<h1>Hello</h1>
<p>Bienvenue sur mon site, faites-vous plaisir, postez un commentaire !</p>
<h2>Écrire un commentaire</h2>
<?php
//on affiche le formulaire pour poster un commentaire
afficherFormulaireCommentaire("page.php", 123);// indiquer la page actuelle avec ou sans query du type ?id=123&... et l'id de l'article pour affiche les commentaires de cette article seulement, si vous utilisez ce système de commentaire pour un livre d'or par exemple, vous pouvez l'enlever et mettre seulement la page actuelle: afficherFormulaireCommentaire("page.php");
?>

<h2>Commentaires postés</h2>
<?php
afficherCommentaires(123);//on indique l'id de l'article (ou pas: afficherCommentaires()) pour afficher les commentaires correspondants à cet article
?>


</body>
</html>
<?php if(!defined("C2SCRIPT")) exit;//empêche l'accès direct à cette page, autorisé seulement en include en définissant "C2SCRIPT", juste avant

function htmlent($texte){
// htmlentities(chaine de caractères,ENT_QUOTES,"UTF-8") permet de convertir tous les caractères en entité HTML, surtout pour éviter les injections SQL car elle convertir les guillemets simple et double: ' devient &#39; et " devient &quot;nous convertira les balises HTML, scripts (vous pouvez voir la fonction mysqli_real_escape_string pour une protection optimale)
return htmlentities($texte,ENT_QUOTES,"UTF-8");
}
function raf($NomDuBouton,$TexteParDefaut=''){
//fonction pour réafficher les champs du formulaire après l'avoir envoyé pour ne pas avoir à les reremplir
//plus d'infos sur https://www.c2script.com/scripts/reafficher-les-champs-du-formulaire-en-php-s38.html
return isset($_POST[$NomDuBouton]) ? htmlentities($_POST[$NomDuBouton],ENT_QUOTES,"UTF-8") : $TexteParDefaut;
}
function afficherFormulaireCommentaire($Page,$IdArticle=0){
global $mysqli;//permet à la variable $mysqli d'être utilisée dans la fonction
$AfficherForm=1;//quand tout sera bien posté, on cachera le formulaire en mettant cette valeur à 0
$msg_erreur='';//pour indiquer les erreurs qui empêche la soumission du formulaire, on prendre aussi cette valeur comme répère pour savoir si il y a une erreur (vide = OK, pas vide = il y a des erreurs, on affiche le message)
if(isset($_POST['envoyer'])){//si le bouton envoyer (name="envoyer") est cliqué, on traite le formulaire
if(empty($_POST['pseudo']) OR empty($_POST['mail']) OR empty($_POST['commentaire'])){
$msg_erreur.="Un des champs est vide";
} else {

//les champs sont pas vides, on traite les informations saisies en commençant par l'adresse email
if(!preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$_POST['mail'])){
$msg_erreur.="Le mail est incorrect<br/>";//on met un saut de ligne (br) pour afficher les messages les un sur les autres (si il y en a plusieurs) et pas les un derrière les autres
}

//on pourrait imaginer une vérififcation du pseudo, par exemple, on pourrait accepter seulement des lettres et des chiffres (pas d'espaces et caractères spéciaux)
/*if(!preg_match("#^[a-z0-9]+$#i",$_POST['pseudo'])){//option "i" pour dire qu'on autorise a et A (i pour Insensible à la case)
$msg_erreur.="Le pseudo est incorrect (lettres et chiffres seulement)<br/>";
}

//on peut également imaginer une vérif pour la longueur maximale du message:
if(strlen($_POST['commentaire'])>1000){
$msg_erreur.="Le commentaire est trop long, 1000 caractères maximum (vous avez tapé ".strlen($_POST['commentaire'])." caractères<br/>";
}

//ou même interdire des mots dans le message
if(stristr($_POST['commentaire'],"connard")){//désolé c'est pour l'exemple :) ici j'utilise stristr qui est moins gourmand que preg_match, stristr recherche le mot en version Insensible (str"i"str), il trouvera connard comme Connard
$msg_erreur.="Le commentaire contient le mot interdit: connard<br/>";
}

//interdire de poster une URL
if(preg_match("#https?://[a-z0-9]+#i",$_POST['commentaire'])){ //on recherche avec ou sans "s" dans http car on demande avec "?" juste après le s, veut dire "peut y être ou pas" (concerne seulement la lettre (ou la classe) juste avant le point d'interrogation. Avec [a-z0-9]+ on demande à ce que ça ne soit pas seulement http(s):// et rien d'autre desuite après mais qu'il y ait bien des lettres ou des chiffres après http(s)://, comme http(s)://abcd123... qui constituerait une URL
$msg_erreur.="Le commentaire contient une URL, c'est interdit<br/>";
}

//ajouter un captcha (que vous pouvez trouver ici: https://www.c2script.com/scripts/captcha-simple-en-php-s14.html)
if(empty($_POST['captcha'])){
$msg_erreur.="Le captcha est vide";
} else {
if($_POST['captcha']!=$_SESSION['code']){
$msg_erreur.="Le captcha est incorrect";
}
}*/

}
if($msg_erreur!=''){
//si il y a des erreurs, on les affichent
echo '<h1 style="color:red">Il y a des erreurs:</h1>';
echo $msg_erreur;
} else {
//pas d'erreurs, on sécurise les champs pour les insérer dans la base de données
$Pseudo = htmlent($_POST['pseudo']);//voir la fonction htmlent() dans le fichier fonctions/fonctions.php pour plus de détails
$Mail = htmlent($_POST['mail']);
$Commentaire = htmlent($_POST['commentaire']);
$Commentaire = nl2br($Commentaire);//nl2br nous permet d'ajouter des <br/> quand il y a un saut de ligne, nous permettra de garder les saut quand on

//on l'insère dans la bdd (vous remarquerez que je n'ai pas entouré les variable par ".$MaVariable.", ça fonctionne seulement si vous mettez des guillemets double en début et en fin ("INSERT INTO....") ne fonctionnera pas avec des guillemets simples, exemple: ('INSERT INTO....')
if(mysqli_query($mysqli,"INSERT INTO commentaires SET
pseudo = '$Pseudo',
mail = '$Mail',
commentaire = '$Commentaire',
".($IdArticle!=0?"id_article = $IdArticle,":"") /* ici id_article à remplacer par le nom de votre colonne */ ."
quand = ".time())){//time() donne le timestamp actuel, on pourra le manipuler avec la fonction date(), exemple: date("H:i d-m-Y",quand)
echo "<p>Commentaire posté avec succès!</p>";
//bien sûr, on pourrait imaginer que le commentaire ne soit pas tout de suite validé, en mettant une colonne supplémentaire dans la table des commentaires (ex: valide=0) et l'afficher que quand un admin le valide et mis à 1
$AfficherForm=0;//on cache le formulaire
} else {
echo "<p>Une erreur s'est produite, merci de réessayer ou contactez le support si le problème persiste.</p>".mysqli_error($mysqli);
}
}
}
if($AfficherForm==1){
?>
<form action="<?php echo $Page; ?>" method="post">
Pseudo
<br/>
<input type="text" name="pseudo" value="<?php echo raf("pseudo"); ?>" maxlength="20" required="required">
<!--

required="required"

- pour obliger l'utilisateur à renseigner ce champ avant l'envoi, même si on indique ce paramètre, toujours faire la vérification du champs avec PHP (if empty) parce que l'utilisateur peut modifier le code source HTML (pas PHP) d'une page


maxlength="20"

- pour interdire de mettre plus de 20 caractères, si il en rentre plus, notre table SQL coupera à la longueur de 20 caractères (ne pas se fier à un paramètre HTML pour l'insert dans une table car on peut facilement modifier ces conditions (required, maxlength,...) dans le code source) ici ça indiquera à l'utilisateur (si il tente de mettre plus de 20 caractères) qu'il ne peut pas, ça évitera de lui couper pseudo si il est trop long

-->
<br/>
Email
<br/>
<input type="text" name="mail" value="<?php echo raf("mail"); ?>" maxlength="50" required="required">
<br/>
Message
<br/>
<textarea name="commentaire" rows="10" cols="50" required="required"><?php echo raf("commentaire"); ?></textarea>
<!--
rows définit la hauteur, indique le nombre de ligne qui sera visible
cols définit la largeur, indique le nombre de lettre qui sera visible de gauche à droite
ici on à une hauteur de 10 ligne et d'une largeur de 50 lettres
-->
<br/>
<input type="submit" name="envoyer" value="Poster!">
</form>
<?php
}
}
function afficherCommentaires($IdArticle=0){
global $mysqli;//permet à la variable $mysqli d'être utilisée dans la fonction
//on va chercher les commentaires qui correspondent à l'id de l'article (si mentionné)
$req = mysqli_query($mysqli,"SELECT * FROM commentaires WHERE id_article ".($IdArticle!=0?"=$IdArticle": "IS NULL")." ORDER BY id ASC");
if(mysqli_num_rows($req)==0) {
echo "<p>Aucun commentaire pour le moment.</p>";
} else {
while($infos = mysqli_fetch_assoc($req)) {
?>
<div style="margin-bottom:30px;border-bottom:1px solid black">
<p style="text-decoration:underline"><b><?php echo $infos['pseudo']; ?> le <?php echo date("d-m-Y",$infos['quand'])." à ".date("H:i",$infos['quand']); ?></b></p>
<p><?php echo $infos['commentaire']; ?></p>
</div>
<?php
}
}
}
CREATE TABLE `commentaires` (
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`pseudo` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`mail` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`commentaire` text COLLATE utf8_unicode_ci NOT NULL,
`id_article` int(11) DEFAULT NULL,
`quand` bigint(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


J'espère que ce script gratuit vous est utile.
Pour soutenir mon travail, un simple don ou mettre une note est grandement apprécié.
Votre réussite en ligne commence ici

Vous cherchez à pousser encore plus loin vos idées ou à les concrétiser avec un site internet sur mesure ? Je suis là pour vous aider ! Mon expérience en développement web est à votre disposition.

Que ce soit la création de votre site web pro ou l'apport de fonctionnalités avancées à votre projet, contactez-moi pour en discuter et avoir un devis gratuit personnalisé.

Mon objectif est de vous offrir des solutions sur mesure qui répondent à vos besoins, et votre vision associée à mon expertise donnera vie à votre projet web parfait. Contactez-moi aujourd'hui, je réponds en général en moins d'une heure :

Demander un devis
Réponse rapide !

Vous recherchez un script précis ?

Dites-moi ce dont vous avez besoin, je peux développer le script demandé et vous envoyer un mail dès qu'il est dispo !

🔔 Vous pouvez laisser votre mail pour recevoir les nouveaux scripts. Pas de pub, pas de tracas. Vous êtes libre de le supprimer à tout moment.

Je prends en compte toutes les demandes. Les idées les plus populaires passent en priorité et seront publiées dès qu'elles seront prêtes. 2872 demandes reçues.

Si vous avez un projet en tête, je vous suggère de me contacter directement pour en discuter.

Commentaires

Ajouter un commentaire

Commenter
Pseudo/Nom
Email
Message
Captcha
memo2
Commenter

jk le 21 Avril 2021 à 15:57

c'excellent

CANAILLE35 le 07 Mai 2021 à 15:37

Bonjour. Je trouve cela super mais n'étant pas codeuse, comment faire pour que l'on réponde à une personne qui met un commentaire dans votre formulaire ? Ex : DOUDOU écrit et DADA souhaite lui répondre mais sans mettre "pour DOUDOU" dans son message mais juste en cliquant sur DOUDOU pour répondre. Comme dans Facebook en fait.
Merci de votre réponse.
CANAILLE35
indicana@laposte.net

admin le 10 Mai 2021 à 10:11

Bonjour,

commencez par mettre un bouton sous chaque commentaire avec l'ID du commentaire dans l’URL puis poster le commentaire et afficher les commentaires qui correspondent à l'ID de chaque commentaire.

CANAILLE35 le 11 Mai 2021 à 11:55

Pour Admin :
Merci beaucoup je vais essayer cela.
Bonne journée
CANAILLE35

tyr le 16 Juillet 2021 à 15:30

je n'y arrive pas !

admin le 16 Juillet 2021 à 18:42

A quoi faire?

rémy le 26 Novembre 2021 à 14:12

Test

admin le 26 Novembre 2021 à 15:13

Oui, ça fonctionne :) si vous avez une question n'hésitez pas.

rémy le 26 Novembre 2021 à 16:38

OK ça fonctionne mais comment fait on pour que je le valide avant affichage ?

admin le 26 Novembre 2021 à 21:41

Il vous faudra le gérer avec une petite surface administration, mettre une nouvelle colonne dans la table "commentaires" et sa valeur à 0 ou 1 si activé puis valider et passer cette valeur à 1 pour l'afficher.

Lors du while des commentaires on rajoutera aussi une condition dans la commande SQL (ex : WHERE active=1).

dodo le 26 Mai 2022 à 23:15

salut tous le monde

admin le 26 Mai 2022 à 23:24

Oui le formulaire fonctionne, dodo :)

Azar le 02 Juin 2022 à 20:08

ca marche tres bien

Toto le 29 Septembre 2022 à 22:50

Test toto avec un message plus long car sinon je me fais taper sur les doigts de pieds

vincent le 03 Mars 2023 à 12:28

Impeccable !

ttv le 20 Mars 2023 à 08:44

c'est genial

amin le 10 Avril 2024 à 19:41

c'est bien

MrLeRobot le 22 Juin 2024 à 20:15

Attention,
Quand vous rentrer vos informations pour connecter votre BDD, si votre mot de passe contient un $, ça ne va pas pouvoir se connecter.
Il suffit de remplacer les guillemets " par des apostrophe '.

Merci c2script pour tes scripts qui permet d'apprendre ou de gagner du temps sur nos créations !

admin le 23 Juin 2024 à 22:13

Merci pour cette information, vous pouvez également garder les guillemets doubles et annuler le début de variable PHP $ en mettant un backslash \ devant $ : \$

Nostra le 09 Juillet 2024 à 23:17

Je vois bien le commentaire, bravo !

Nostra le 09 Septembre 2024 à 22:53

Bonjour je vais essayer merci

Retour à la liste des scripts

Un site à créer ?
Contactez-moi