Fonction commentaire PHP : Ajoutez des commentaires à vos articles

Article ajouté le 09/01/2019

Fonction commentaire PHP : Ajoutez des commentaires à vos articles

A la base, lorsqu'on souhaite créer un site de type blog (Constitué essentiellement d'articles et d'un espace commentaire associé), on utilise un CMS de type Wordpress. Cela nous évite de réinventer la roue et donc de perdre du temps à redévelopper entièrement ce module.

Dans mon cas, je possédais au départ un site vitrine qui ne proposait que des simples contenus. Je n'ai donc pas eu besoin de ce genre de module. Cependant, mon site à très vite évolué et j'ai donc du concevoir une fonction simple qui allait permettre à un grand nombre des pages de faire réagir les visiteurs sur le contenus.

En revanche, les pages étaient déjà créées. J'ai donc eu un premier souci vis à vis des identifiants permettant d'associer une page à des commentaires en base de données.

Pour cette base, j'ai été au plus efficace en récupérant l'url de la page et en m'en servant en tant qu'identifiant pour l'association de ses commentaires.

Je vous passe les détails techniques et j'en viens tout de suite au but (Oui c'est un peu expédié) : Je vous présente ici mon propre module de commentaires qui ressemble un peu aux commentaires qu'on retrouve sur Youtube par exemple.

Update du 19/11/2019 : Prise en compte de vos commentaires (Ajout CSS, connexion BDD, appel JQuery et URL courrante). N'hésitez pas si vous avez d'autres critiques.

Le code PHP / HTML à insérer sur vos pages

<?php
	$db = new PDO('mysql:host=SERVER;dbname=BDD;charset=utf8mb4', 'USER', 'PASSWORD');
	$currenturl = strtolower('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);

	// Fonctions de chargement des commentaires

	function commentaires($url, $id_commentaire=0)
	{
		global $db;
	
		$i=0;
		$commentaires = '';
		$tcolor = ['blue','green','orange','purple','gray','red'];
		
		$sql = "SELECT id_commentaire, nom, commentaire, email, date FROM p3x_commentaire WHERE actif='y' AND url=".$db->quote($url);
		if($id_commentaire!=0){ $sql .= " AND id_sous_commentaire=".$id_commentaire; }else{ $sql .= " AND id_sous_commentaire=0"; }
		$sql .= " ORDER BY id_sous_commentaire, date";
		
		foreach($db->query($sql) as $data) {
			$i++;
			mt_srand(crc32($data['email']));
			
			$commentaires .= '<div class="box-light">';
				
				if($i==1 && $id_commentaire==0)
				{
					$sql2 = "SELECT COUNT(id_commentaire) FROM p3x_commentaire WHERE actif='y' AND url=".$db->quote($url);
					$query = $db->prepare($sql2); 
					$query->execute(); 
					$row = $query->fetch();
					$count = $row[0];
					$nb = $count;
					$s='s';
					
					if($count==1){ $nb = 'Un'; }
					
					$commentaires .= '<h2>'.$nb.' commentaire'.$s.'</h2>';
				}
				
				$commentaires .= '<div class="separator"></div>
									<div class="box-light">
										<div class="letter '.$tcolor[mt_rand(0, count($tcolor) - 1)].'">'.htmlentities(substr($data['nom'], 0, 1)).'</div>
										<p class="chapeau">@'.htmlentities($data['nom']).' <span class="gray">'.$data['date'].'</span></p>
										<p>'.htmlentities($data['commentaire']).'</p>
										<form id="comform-'.$data['id_commentaire'].'" method="post" action="'.$url.'">
											<input name="action" value="poster-commentaire" type="hidden">
											<input name="email" class="hidden" type="text">
											<input name="id_sous_commentaire" value="'.$data['id_commentaire'].'" type="hidden">
											<div id="comform-div-'.$data['id_commentaire'].'" class="comform-div hidden">
												<p>Réponse à @'.htmlentities($data['nom']).'<br><textarea name="commentaire"></textarea></p>
												<p>Nom<br><input name="nom" type="text"></p>
												<p>Adresse e-mail<br><input name="emailtrue" type="text"></p>
											</div>
											<div class="clear"></div>
											<p><a class="repondre" data-rel="'.$data['id_commentaire'].'" href="#">Répondre</a></p>
											<div class="clear"></div>
										</form>
									</div>';
				
				$commentaires .= commentaires($url, $data['id_commentaire']);
				
			$commentaires .= '</div>';
		}
		
		return $commentaires;
	}

	// Insertion d'un commentaire
	
	if(isset($_POST['action']) && $_POST['action']=='poster-commentaire')
	{
		// Protection robot
		if(isset($_POST['email']) && empty($_POST['email']))
		{
			if(isset($_POST['commentaire']) && !empty($_POST['commentaire']) &&	isset($_POST['nom']) && !empty($_POST['nom']) && isset($_POST['emailtrue']) && !empty($_POST['emailtrue']))
			{
				$id_sous_commentaire = 0;
				
				if(isset($_POST['id_sous_commentaire']) && is_numeric($_POST['id_sous_commentaire'])){ $id_sous_commentaire = intval($_POST['id_sous_commentaire']); }
			
				if(filter_var($_POST['emailtrue'], FILTER_VALIDATE_EMAIL))
				{
					$sql = "INSERT INTO p3x_commentaire(
												id_sous_commentaire,
												nom,
												commentaire,
												email,
												url,
												actif,
												date
											) VALUES(
												".$id_sous_commentaire.",
												:nom,
												:commentaire,
												:emailtrue,
												:currenturl,
												'a',
												'".date("Y-m-d H:i:s")."'
											)";
					$query = $db->prepare($sql);
					$query->bindValue(':nom', $_POST['nom'], PDO::PARAM_STR);
					$query->bindValue(':commentaire', $_POST['commentaire'], PDO::PARAM_STR);
					$query->bindValue(':emailtrue', $_POST['emailtrue'], PDO::PARAM_STR);
					$query->bindValue(':currenturl', $currenturl, PDO::PARAM_STR);
					$query->execute();
					
					unset($_POST);
					
					$message_text = 'Votre message a été déposé mais vous devez attendre qu\'il soit validé.';
					$message_img = 'check';
				}
				else
				{
					$message_text = 'Votre adresse e-mail n\'est pas valide !';
				}
			}
			else
			{
				$message_text = 'Les informations obligatoires ne sont pas toutes renseignées !';
			}
		}
	}
	
	// Chargement des commentaires
	$commentaires = commentaires($currenturl, 0);
	if(!empty($commentaires)){ echo '<div class="box-light">'.$commentaires.'</div>'; }
?>
<h3>Poster un commentaire</h3>
<form method="post" action="<?php echo $currenturl; ?>">
	<input type="hidden" name="action" value="poster-commentaire" />
	<input type="text" name="email" class="hidden" />
	<p>Commentaire<br /><textarea name="commentaire"></textarea></p>
	<p>Nom<br /><input type="text" name="nom" /></p>
	<p>Adresse e-mail<br /><input type="text" name="emailtrue" /></p>
	<p><input type="submit" class="button-blue left" value="Poster mon commentaire" /></p>
	<div class="clear"></div>
	<p class="red right">Votre adresse e-mail n'est pas publiée lorsque vous ajoutez un commentaire.<br />Tous les champs sont obligatoires pour soumettre votre commentaire.</p>
	<div class="clear"></div>
</form>

Le SQL de la base de données

CREATE TABLE `p3x_commentaire` (
  `id_commentaire` smallint(4) UNSIGNED NOT NULL,
  `id_sous_commentaire` smallint(4) UNSIGNED NOT NULL,
  `nom` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `commentaire` text COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `url` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
  `actif` enum('y','n','a') COLLATE utf8_unicode_ci NOT NULL,
  `date` datetime NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `p3x_commentaire`
  ADD PRIMARY KEY (`id_commentaire`),
  ADD KEY `id_sous_commentaire` (`id_sous_commentaire`);

ALTER TABLE `p3x_commentaire`
  MODIFY `id_commentaire` smallint(4) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;

Un petit peu de JQuery

<script src="//code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
	$('.repondre').click(function(){
		var id = $(this).attr('data-rel');
		if($('#comform-div-' + id).hasClass('hidden'))
		{
			$('.repondre').removeClass('button-blue');
			$(this).addClass('button-blue').css('float','left');
			$('.comform-div').addClass('hidden');
			$('#comform-div-' + id).find('p').show();
			$('#comform-div-' + id).removeClass('hidden');
			return false;
		}
		else
		{
			$('#comform-' + id).submit();
			return false;
		}
	});
</script>

Styles CSS

input[type=text]{padding:10px;width:280px;border:1px solid #E7E7E7;border-radius:5px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-family:Arial;}
input[type=text]:hover{background-color:#f8fbff;}
textarea{padding:10px;border:1px solid #E7E7E7;border-radius:5px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;height:125px;}
.box-light{padding:25px;color:#333333;margin:10px 0;background:#ffffff;transition:all 0.6s ease 0s;}
	.box-light .box-light{padding:0 35px;}
		.box-light .box-light p{margin:5px 0px;}
	.box-light h2,.box-light h3,.box-light h4{margin:0;padding:0;}
	.box-light h3{margin-top:10px;}
		.box-light h3 a{text-decoration:none;}
	.box-light img{transition:all 0.6s ease 0s;display:block;}
	.box-light:hover{box-shadow:1px 1px 10px #dcdcdc;}
		.box-light .box-light:hover{box-shadow:none;}
	.box-light p{padding:0;}
.letter{background-color:#4C74AD;color:#ffffff;border-radius:50%;width:40px;height:40px;line-height:35px;font-weight:bold;text-align:center;float:left;margin-left:-35px;margin-right:15px;}
	.letter.blue{background-color:#3B689F;}
	.letter.green{background-color:#44A437;}
	.letter.orange{background-color:#ff7537;}
	.letter.purple{background-color:#b99aff;}
	.letter.gray{background-color:#888888;}
	.letter.red{background-color:#DC4739;}
.chapeau{font-size:1em;margin:5px 0;font-weight:bold;}
.gray{color:#888888;}
.red{color:#DC4739;}
.hidden{display:none;}
.clear{clear:both;}
.separator{border-top:1px solid #e7e7e7;border-bottom:1px solid #ffffff;width:100%;height:1px;margin-top:30px;margin-bottom:30px;clear:both;}
.button-blue{margin-top:10px;float:right;font-family:Arial;cursor:pointer;font-size:1em;padding:10px 15px;font-weight:bold;border-radius:5px;color:#ffffff;border:0px;background:#3e679b;box-sizing:border-box;text-align:center;}

54 commentaires

J

@Jean P. 2019-01-18 11:45:43

Bonjour,

Il y a un souci dans ta fonction.
A la ligne 104 tu fais appel à une fonction mais tu ne la fournis pas...
Le script ne fonctionne pas.

Cdt,
Jean

Répondre

p

@p3x 2019-01-18 11:49:22

Salut Jean,

En effet, j'ai oublié de retirer ces lignes en récupérant le bout de code sur mon site Web.
Je viens de supprimer les lignes en question.

Cela devrait fonctionner ;)

Répondre

K

@Kooalaa 2019-01-26 04:10:14

C'est sympa tout ça mais moi ce qui me plaisait à la base c’était le design global. Où est le CSS ?

Répondre

p

@p3x 2019-01-26 04:18:53

Oups... effectivement je l'ai oublié !

je le mets dès que possible (Quand j'aurais un moment) mais tu peux toujours le récupérer en affichant le code source du site :p

Répondre

I

@INDICANA 2019-08-31 17:15:30

Bonjour,

Je ne suis pas codeuse mais je fais comme je peux. J'ai bien installé la table dans ma base de données mais dans la page en php, je ne vois pas d'appel de la base de données. Mon fichier du coup est une page blanche ...

Pouvez-vous m'aider ?

Par avance, merci beaucoup.

Indicana

Répondre

p

@p3x 2019-08-31 17:48:50

Bonjour Indicana,

Il faut bien sûr établir une connexion à la base de données en début de script PHP pour que ça fonctionne. Je ne l'ai pas indiqué car cela me paraissait logique.

Voici le bout de code pour la connexion en PDO à ajouter :
$db = new PDO('mysql:host=SERVER;dbname=BDD;charset=utf8mb4', 'USER', 'PASSWORD');

A toi de remplacer les éléments SERVER, BDD, USER et PASSWORD.

Répondre

D

@Deme L k Honire 2019-09-15 13:49:39

salut vous pouvez m'aidez comment placez le jQuery pour que ça fonctionne

Répondre

p

@p3x 2019-09-15 20:59:35

Bonjour,

Il n'y a pas grand chose à faire.
Il suffit juste d'appeler JQuery en fin de document HTML : <script src="//code.jquery.com/jquery-3.4.1.min.js"></script>
Puis mettre en dessous le script JQuery fourni entre des balises <script></script>

Répondre

A

@Aboubakar 2019-11-06 18:32:45

j'ai mis un long commentaire et comme j'ai validé en oubliant de mettre l'email et le nom, ça a rechargé la page et effacé le commentaire, et vu que tu sais utiliser jquery t'aurais pu faire un petit effort pour empêcher que cela se produise, c'est chiant de refaire :/
Je vais donc résumer mon commentaire en quelques mots seulement : Tous ces changements demandés par les intervenants devraient être inclus dans le code original, car ça commence à faire beaucoup pour un debutant qui connait pas le codage. Tant que c'est pas mis à jour c'est pas motivant de copier/installer ce code :/

Répondre

p

@p3x 2019-11-06 19:00:27

Bonjour Aboubakar,

Je suis désolé de t'avoir fait perdre un peu de ton temps.

Effectivement, tu as raisons : il faudrait que je mette à jour le code et ceci pour plusieurs autres articles également. Malheureusement, je manque de temps pour ça en ce moment et je m'en excuse.

Cependant, je prends tout de même la peine de vous répondre en restant réactif. Donc si vous rencontrez le moindre problème ou si vous avez des questions, n'hésitez pas à me contacter.

Répondre

s

@samy 2019-11-19 16:35:53

bonjour et merci pour votre tuto,
je rencontre un problème au niveau du php une fois que le formulaire est validé j'ai l'erreur suivant qui s'affiche:
Not Found

The requested URL /testcom/<br /><b>Notice</b>: Undefined variable: currenturl in <b>/Applications/MAMP/htdocs/testcom/index.php</b> on line <b>133</b><br /> was not found on this server.

Répondre

p

@p3x 2019-11-19 16:47:26

Bonjour,

Il suffit d'ajouter un variable currenturl avec pour valeur l'url de la page courrante en début de script :
$currenturl = strtolower('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);

Répondre

A

@Adam 2020-01-12 09:45:53

Bonjour,

En faisant quelques correction, les commentaires sont bien enregistrés dans la table, mais ne sont jamais affichés.
Normal, la variable "actif" est initialisé (une seule fois) à "a", mais dans les 2 Select, elle est à "y", donc forcément aucune ligne n'est sélectionnée pour être affichés.

Alors en mettant "actif" à "y", les commentaires s'affichent bien, mais en double.

Petite question : je suis pose que "y" signifie que le commentaire est actif. Dois je en déduire que la valeur "a" signifie en attente ?
Je pense que dans la logique, il doit exister un formulaire qui doit servir à valider les commentaires pour qu'ils s'affichent ou pas ?


Merci en tout cas pour le script, j'avais la flemme de le développer à partir de zero.

Répondre

p

@p3x 2020-01-12 23:34:12

Bonjour Adam,

En effet, les commentaires insérés sont à "a" pour "attente" dans la base de données.

Cela évite les commentaires bidons ou les spams par exemple.

Il faut donc manuellement les passer en "y" dans la BDD ou développer une admin.

Pour ma part, j'ai insérer un code qui m'envoie un mail lorsqu'un commentaire est posté comme ça je suis prévenu et ensuite je modifie à la main le "a" en "y" dans la base de données.

Par contre les commentaires ne doivent pas s'afficher en double...

Je me pencherais là dessus bientôt (quand j'aurais un moment) et je remettrais le code au propre.

Répondre

O

@Opango 2020-02-04 11:35:16

Bonjour, Tuto très intéressant. Plusieurs indications vous ont déjà été remontées, notamment la perte des informations lorsque la page se recharge, et l'administration sur la validité des commentaires, etc. Il me semble qu'il serait intéressant lorsqu'on ouvre la page d'un article, qu'on puisse voir simplement le nombre de commentaire sur l'article et un lien permettant leur affichage, puis celui permettant d'ajouter directement un commentaire ! Qu'en pensez-vous ?

Répondre

p

@p3x 2020-02-04 16:18:14

Bonjour Opango,

Je te remercie pour ton commentaire.

J'ai récemment ajouté plusieurs fonctionnalités que certaines personnes réclamaient mais je n'ai malheureusement pas le temps de satisfaire tout le monde.

Concernant les fonctionnalités que tu proposes, il est vrai que celles-ci sont intéressantes mais je te laisse perfectionner le script toi-même.

Il ne s'agit pas ici d'un tuto mais d'un bout de code que j'ai développé pour mes projets perso et que je publie pour aider les webmasters à aller plus vite dans leurs réalisations.

Libre à eux ensuite de le modifier et de l'adapter selon leurs besoins.

Répondre

O

@Opango 2020-02-04 12:05:16

Re bonjour,
dans la partie insertion d'un commentaire, vous faites appel à la fonction commentaires() avec trois paramètres, pourtant elle a été définie avec deux paramètres ! Peut-être je me trompe.
Merci !

Répondre

p

@p3x 2020-02-04 16:24:56

En effet, tu ne te trompes pas.
Merci pour ta remarque, c'est corrigé !

Répondre

O

@Opango 2020-02-04 17:31:44

J'allais oublier.
En effet, lorsque je poste un commentaire, il y a bien insertion mais il n'y a pas la petite fenêtre qui m'indique qu'il faut attendre la validation du commentaire, etc.
Merci

Répondre

p

@p3x 2020-02-04 19:23:10

Rebonjour Opango,

Concernant le résultat de validation de formulaire, il faut que tu utilises la variable $message_text retournée.

Tu dois un peu coder.
Mais si tu veux te simplifier la vie tu peux par exemple mettre dans ton Javascript en fin de page un truc de ce style en PHP :
<?php if(!empty($message_text)){ echo "alert('".$message_text."');"; } ?>

Répondre

O

@Opango 2020-02-05 10:21:32

Bonjour P3X,
J'ai bien mis ce bout de code en fin de page et c'est OK. L'alerte marche lorsqu'on ajoute un commentaire. Mais aucune réaction du bouton répondre lorsqu'on souhaite répondre à un commentaire. J'ai fait un F12 et console il n'y a aucun message (normal puisque le bouton est comme "disabled" )Pourtant je n'ai rien changé sur jQuery ! Il y a peut-être quelque chose qui m'échappe dont j'ignore et la console ne m'aide pas ! Merci de ton coup d'oeil !

Répondre

O

@Opango 2020-02-04 17:29:08

Re bonjour,
Je reviens vers vous car j'ai eu un problème qui je crois vous pouvez résoudre. En effet, j'ai essayé de remplacer la variable $currenturl dans votre script
<?php
$currenturl = strtolower('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
//--soit

$currenturl =$id_artile;
?>
par l'Id de l'article qui est renseigné dans la page.
Tout marche bien lorsque je poste un commentaire. Mais lorsque je souhaite répondre à un commentaire, le lien "Répondre" ne fonctionne pas. Aucune réaction quand je clique dessus !
Pourtant j'ai bien en fin de page html
<script src="//code.jquery.com/jquery-3.4.1.min.js"></script>
<script>

$('.repondre').click(function(){
var id = $(this).attr('data-rel');
if($('#comform-div-' + id).hasClass('hidden'))
{
$('.repondre').removeClass('button-blue');
$(this).addClass('button-blue').css('float','left');
$('.comform-div').addClass('hidden');
$('#comform-div-' + id).find('p').show();
$('#comform-div-' + id).removeClass('hidden');
return false;
}
else
{
$('#comform-' + id).submit();
return false;
}
});
</script>

Aucune autre modification n'a été faite sauf l'action du formulaire qui celle de la page courante.
Peut-être y a t-il une action que je n'ai pas faite ? Merci de m'indiquer.
Bien cordialement

Répondre

p

@p3x 2020-02-04 19:30:14

Il doit y avoir un problème de Javascript.
Y a t'il des erreurs dans la console de ton navigateur ?
En pressant "F12" puis "Console" puis repérer les erreurs en rouge.

Répondre

O

@Opango 2020-02-05 14:18:36

Oupss! Bonjour,
J'ai bien pressé la bouton F12 puis allé sur l'onglet "Console", aucun message. Il me semble que le bouton n'est pas actif, et je ne vois vraiment pas où je javascript foire ! Je n'ai rien changé dans jQuery !

Répondre

p

@p3x 2020-02-05 22:52:51

Bonsoir Opango,

Si tu m'envoies un lien ou ton code par mail je pourrais peut-être t'aider car n'oublions pas qu'il s'agit à la base ici d'un espace commentaire et non d'un forum de discussion.

Pour me contacter : https://www.p3x.fr/contact

Répondre

a

@amd 2020-06-19 15:32:19

bonjour j'ai un problème pour le sous commentaire quand je valide la réponse il e l'envoie pas vers la base de donnée que faire ?
et je voudrais également que le commentaire s'affiche directement sans que j'ai besoin d'aller modifier dans la base de donnée. est-ce que je peux court-circuiter le code en switchant entre a et y ??
Merci bien

Répondre

p

@p3x 2020-06-19 16:25:31

Bonjour amd,
Sans avoir plus de détail je ne peux pas vraiment t'aider. As-tu une erreur ou un lien de démo par exemple ?
Si tu veux éviter de devoir valider les commentaires tu peux modifier le 'a' en 'y' dans le code PHP : ligne 97 du code PHP de l'article.

Répondre

a

@amd 2020-06-19 17:18:26

rebonjour, non il n'y a pas d'erreurs qui s'affichent mais j'ai l'impression que le bouton n'est pas clicable.
pour le y et le a j'avais déjà essayer comme ça et ça fonctionne niquel

Répondre

p

@p3x 2020-06-22 12:35:59

Bonjour amd,

Suite à ton commentaire je viens de réaliser qu'il manquait l'élément HTML <form></form> dans la partie PHP. Je pense que ceci est du à mon éditeur qui m'a supprimé le bout de code quand j'avais mis à jour l'article.

Je viens de modifier le code PHP.
Tu peux le copier/coller de nouveau et je pense que ça fonctionnera.

Répondre

a

@amd 2020-06-20 17:15:16

j'ai l'erreur suivant qui s'affiche
Notice: Undefined offset: 0 in /Applications/MAMP/htdocs/ct/index.php on line 31

Répondre

p

@p3x 2020-06-22 12:36:59

Ceci n'est pas une erreur mais comme précisé d'une "Notice".

Répondre

a

@amd 2020-06-22 13:57:16

bonjour p3x et merci pour ta réponse. mais ça ne fonctionne toujours pas.
comment est-ce que je peut t'envoyer le code ?
merci

Répondre

p

@p3x 2020-06-22 14:47:22

Je viens de tester le code en local chez moi et je me suis aperçu qu'il manquait l'identifiant sur le formulaire et qu'il y avait aussi une erreur dans le PHP.

Il faut vraiment que je change mon éditeur d'article car les copier/coller de code déconnent.

Je viens de corriger les erreurs. Tu peux récupérer le code PHP et ça devrait fonctionner.
En espérant ne pas avoir oublié autre chose...

Répondre

a

@amd 2020-06-22 15:12:29

bonjour, ça fonctionne bien merci.
script au top. Merci vraiment pour ta patience et ton aide. tu viens de me retirer une grosse épine du pied.

Répondre

R

@Raoul 2020-07-24 03:42:22

merci pour ce beau travail.

Répondre

C

@Christian 2020-08-25 14:28:51

Bonjour, j'ai copié le script, merci pour ce travail,ça marche impeccable, sauf réponse, mais ça je m'en fou, par contre il y a moyen que le nouveau commentaire s'ajoute au début plutôt que s’ajouter tout en bas de la liste, merci

Répondre

p

@p3x 2020-08-25 20:43:03

Bonjour @Christian,

Pour mettre les derniers commentaires en top de liste, il suffit de modifier la requête SQL présente à la ligne 17 du code php/html ci-dessus.

Voici le bout de code à remplacer :
$sql .= " ORDER BY id_sous_commentaire DESC";

Répondre

C

@Christian 2020-08-26 01:31:17

Bonsoir, merci pour ta réponse rapide, mais ça ne marche non plus, mais c'est pas grave du tout, le reste marche et ça me va, on va pas se prendre la tête pour ça, bonne soirée ou bonne nuit plutôt.
Christian

Répondre

C

@Christian 2020-08-26 08:52:41

Re bonjour, je me suis avancé trop vite je regardais juste le 1er et comme il bougait pas, en fait ça marche mais d'une drole de façon, j'ai vidé la table pour partir de zero, je commence a mettre un com 01, il apparait pas, j'en met un autre 02, il apparait bien, j'en met un autre 03 il se met en dessous du 02, j'en met un autre 04 ha la il respecte le order by, il se met au dessus du numero 03, j'en met un autre 05 il respecte aussi il se met bien en dessus du 04, en resumé, le 1er apparait pas le 2eme apparait, le 3eme se met en dessus du 2eme, donc a partir du 3eme ça respecte le order by, j'ai mis un com "avec je vous remercie...les coms doivent etre........." ça fait que mon com restera toujours au dessus des autres et au final, j'ai ce que je voulais, merci encore pour ce bon script.
Christian

Répondre

P

@PaKali 2020-10-02 09:01:20

Bonjour,
J'ai copié le code, les commentaires sont bien postés dans la bdd.
Le problème est que chaque fois que je récharge la page, il y a des nouvelles entrées dans la bdd.
Un autre problème, les commentaires ne s'affichent pas. Il y a un message d'erreur : invalid argument supplied for foreach()

Répondre

p

@p3x 2020-10-02 10:24:27

Bonjour PaKali,

Si tu veux éviter que le formulaire soit resoumis au rechargement de la page.
Tu peux par exemple faire une redirection vers la page elle même à la fin du traitement php.
En ajoutant par exemple le bout de code header('Location:http://tonsite.com/tapage'); à la ligne 107
Concernant le problème de foreach() je ne sais pas. Il me faudrait plus de détails.

Répondre

D

@Dylan 2020-11-07 23:40:12

Bonjour, super code !
C'est exactement ce que j'ai passé des heures à chercher.
Pour être sûr que tous les champs sont remplis avant l'envoi, je te conseille d'ajouter "required" (sans les guillemets) dans tes input du html. Ainsi tu peux te débarrasser du message "Tous les champs sont obligatoires pour soumettre votre commentaire.", puisque le navigateur se chargera de le dire.

Ce sera plus propre et mieux géré ainsi :)

Je tiens d'ailleurs à préciser que dans aucun de mes tests les messages des variables $message_text et $message_img ne se sont affichés, je ne comprends pas pourquoi.

Répondre

p

@p3x 2020-11-08 11:44:22

Bonjour Dylan,

Merci pour ton commentaire.

Effectivement tu peux ajouter des "required" sur les champs mais ils faut tout de même faire une vérification côté serveur (PHP) car cela n'empêche pas d'envoyer le formulaire si les champs sont vides. En faisant cela, je peux très bien modifier le HTML et supprimer les "required" quand j'affiche la console développeur de mon navigateur.

De plus les robots spammeurs ne se préoccupent guère de savoir si le champ possède un required.

Bref, il faut contrôler les champs après soumission du formulaire.

Les variables $message_text et $message_img ne sont pas utilisés dans le script mais tu peux les utiliser très simplement :

if(!empty($message_text))
{
if(!isset($message_img) || empty($message_img)){ $message_img = 'alerte'; }

echo '<div id="message-box">
<div id="message-img"><img src="message-'.$message_img.'.png" alt="Message" /></div>
<div id="message-text">'.$message_text.'</div>
</div>';
}

Répondre

D

@Dylan 2020-11-08 16:46:29

Merci beaucoup de ta réponse (rapide) !

Oui, il faut conserver la vérification en PHP derrière.
Je parlais sur le plan de l'interface utilisateur.
Il n'est pas nécessaire d'afficher le message (que tu as mis en rouge) disant que tous les champs sont obligatoires, puisque le required l'indiquera en montrant exactement les champs non remplis.

Et il a le gros avantage de conserver le message si on clique sur envoyer sans avoir tout rempli.


Enfin, merci pour ce bout de code.
Je peux te demander à quelle ligne l'insérer ?
Je suis plutôt débutant, j'ai essayé à différents endroits qui me paraissaient être les bons, mais sans résultat.
Sinon je continuerai à tester plus tard.

Répondre

p

@p3x 2020-11-09 09:10:10

Bonjour Dylan,

Il suffit de placer ce bout de code où tu veux voir apparaître le message dans le HTML après le traitement PHP.
Le mieux c'est de la mettre en absolute ou en fixed en CSS comme ça on la voit à tous les coups.

Répondre

J

@Joël 2020-11-17 17:32:45

Bonjour, un grand merci pour ce code, qui me sera bien utile pour mon petit site.
Je ne suis pas une bête du code, enfaite-je travaille à tâtons et je fais souvent plusieurs testent de morceau de code pour en comprendre le fonctionnement.

Après plusieurs testes, j'ai réussi sans trop de soucis à utiliser votre code, tout fonctionne comme je le veux, mais il reste une petite chose que je n'arrive pas à résoudre, j'ai bien cherché mais je suis largué sur ce coup-là.

"@Aboubakar" avait déjà parlé de ce problème dans les commentaires,
"""j'ai validé en oubliant de mettre l'email et le nom, ça a rechargé la page et effacé le commentaire"""
Tout est dit, comment résoudre ce petit souci du formulaire qui ce vide si l'on oublie le mail etc et que l'on fait envoyer?

Pourriez-vous svp m'aider?
Je vous remercie infiniment

Répondre

p

@p3x 2020-11-17 18:06:36

Bonjour @Joël,

Pour ce problème il suffit de définir une valeur sur tes champs de formulaire avec la variable POST.

Pour un input :
<input type="text" name="nom"<?php if(!empty($_POST['nom'])){ echo ' value="'.$_POST['nom'].'"'; } ?>" />

Pour le textarea :
<textarea name="commentaire"><?php if(!empty($_POST['commentaire'])){ echo $_POST['commentaire']; } ?></textarea>

Répondre

A

@Arzaz 2020-12-11 18:37:23

Je n'ai RIEN compris ^^' Enfin j'aurais besoin d'aide, je veux faire des commentaires différents sur chaque page, comment dire. des pages de téléchargement, cependant ce sont qu'une seule et même page qui change de contenus en fonction de l'?id_download=num
Et donc comment je peux faire pour que des commentaires différents s'affichent sur chaque page avec un id différent ?

Répondre

p

@p3x 2020-12-11 19:37:42

Bonjour,

Pour ça c'est très simple. Vu que tu utilise une variable GET id_download, tu peux simplement l'utiliser lors de l'insertion et de l'affichage des commentaires :

- A la ligne 104, pour l'insertion il suffit donc de remplacer $query->bindValue(':currenturl', $currenturl, PDO::PARAM_STR); par $query->bindValue(':currenturl', $_GET['id_download'], PDO::PARAM_INT);
Attention à bien modifier le PARAM_STR par PARAM_INT car dans ton cas il ne s'agit plus d'une chaîne de caractères mais d'un entier numérique.

- Ensuite à la ligne 125, pour charger les commentaires il faut remplacer commentaires($currenturl, 0); par commentaires(intval($_GET['id_download']), 0);
La fonction inval() permet de s'assurer qu'on envoie bien un entier.

- Enfin à la ligne 45, il faut bien prendre soin de changer action="'.$url.'" par action="URL de la page" car maintenant la variable $url est un identifiant.

Répondre

a

@amd 2021-02-03 12:09:14

bonjour et merci pour ce Tuto.
est-il possible d'aller plus loin en ajoutant une fonctionnalité qui envoie un email à la personne qui a poster un commentaire lorsque il ya une réponse à ce commentaire?
quelqu'un a une idée ou un début d'idée pour explorer cette piste ?

merci d'avance

Répondre

d

@diego 2021-03-04 03:29:34

bonjour excusez moi un peu j'aimerais savoir à quoi sert le jquery dans ce formulaire

Répondre

p

@p3x 2021-03-04 13:11:57

Bonjour,
Le jquery permet d'afficher et de valider le formulaire de réponse lorsqu'on clique sur le bouton "Répondre" de la même manière que les commentaires de cette page.
Mais on peut utiliser du javascript pur à la place.

Répondre

P

@Pierre 2021-03-15 16:52:21

Bonjour le script affiche une erreur dans mon console il disent que la variable n'est pas définie juste au début code source= Var a=$currentul que faire aider moi svp.merci avance

Répondre

j

@jujjj 2021-03-29 14:43:56

Quand j'actualise la page le commentaire est renvoyé ...

Répondre

Poster un commentaire

Commentaire

Nom

Adresse e-mail

Votre adresse e-mail n'est pas publiée lorsque vous ajoutez un commentaire.
Tous les champs sont obligatoires pour soumettre votre commentaire.


Outils et techniques de développement

Il existe de nombreuses manières de concevoir un site Internet.

Certains optent pour des outils clés en main et d'autres préfèrent utiliser des solutions faites maison. Le choix n'est pas toujours évident et lorsqu'on y connait rien, il est préférable de se tourner vers un vrai expert.

Découvrez les techniques que j'utilise et quelques-uns des outils qui permettent de rapidement disposer d'un site Web.

Outils et techniques

Créer un site Internet

Découvrez toute une sélection de solutions pour des projets Internet en parcourant la section spécialisée.

Consultez en quelques clics les méthodes, les étapes, les outils et les techniques pour réaliser au mieux un site Web.

Réaliser un site Internet