8798 sujets

Développement web côté serveur, CMS

Bonjour a tous,

Me revoila avec mes questions sur php... Smiley smile

Alors j'aurais deux petites questions:

Dans un premier temps j'ai une base de donnees pour les commentaires. Jusque la tous va bien et tous fonctionne.

Cependant j'aimerais pouvoir moderer ces commentaires avant meme qu'il s'inscrivent dans la base de donnees. J'avais imagine une technique qui ma ete confirme, qui consiste a ajouter un champ a ma table pour indiquer si le commentaire a ete valide ou pas. S'il n'est pas valide le script php fait la selection et ne l'affiche pas.
Cependant le commentaire est quand meme inscrit dans ma table... Moi je voudrais seulement inscrire dans ma table les commentaire valide.
Avez vous suivi? Smiley confus et si oui avez vous une idee de comment procede?

Deuxieme question, pour la securite de mon formulaire, j'ai bien cherche et la methode qui reviens souvent a la mode est celle du captcha. C'est un systeme que je n'aime pas.
Du coup, j'avais envisager dans un premier temps d'obliger un labse de temps entre deux commentaires (par exemple 2 ou 3 minutes) grace a l'adresse ip du visiteur et ensuite de verifier par une verification simple des champs comme par exemple interdire les numeros dans le champ nom.
Croyez vous que cela est suffisant pour eviter d'etre spamer?

Merci d'avance a tous.
Bonne journee
Modifié par Dim (10 Jun 2009 - 14:40)
Salut,

Pour valider des commentaires, il te suffit effectivement d'ajouter un champ dans la table, qui représentera un booléen (validé ou non). Il suffira d'afficher les commentaires valides sur la partie publique de ton site en ajoutant une clause "WHERE is_valid = 1" à ta requête SQL.

Pour le spam (ce n'est pas vraiment une question de sécurité), ajouter un délai entre 2 commentaires permettra probablement de réduire le volume de spam éventuel. Sinon, une alternative possible au captcha est de placer un champ de formulaire de type text, caché par CSS et qui devra rester vide pour que le formulaire soit accepté. Ainsi, si un robot complète tous les champs du formulaire, il remplira aussi le champ caché et tu n'auras qu'à l'ignorer...
Dim a écrit :
Cependant le commentaire est quand meme inscrit dans ma table... Moi je voudrais seulement inscrire dans ma table les commentaire valide.
Eh bien je ne vois pas d'autre moyen que d'écrire ledit commentaire dans une table donc autant que ce soit fait dans la table finale (plutôt que dans une table temporaire avant validation) avec le booléen qui va bien. Ensuite il suffit que ta validation du commentaire consiste à mettre ce booléen à 1 et que l'invalidation consiste à supprimer l'enregistrement de la table.
Bonjour Thomas et merci pour ta reponse,

En faite, pour la premiere question effectivement je pourrais faire comme ca, mais je prefererais ne pas inscrire le(s) commentaire(s) dans ma table tant qu'il ne sont pas valide. Pour ca j'imagine que l'on doit pouvoir faire appel a un fichier temporaire, mais je n'est pas du tout idee de comment faire ce genre de chose.

Il faut cependant que j'explique pourquoi. Par exemple, ma securite ne fonctionne plus et les spams passent outre. Ma table commentaire se retrouve alors submerge de mail pourri... Si je pouvais eviter ca, cela m'arrangerais... C'est une sorte de seconde securite Smiley smile

Sinon pour le systeme anti-spam que tu me propose, j'ai lu ca hier. Cependant si un visiteur desactive son css, il verra cette magnifique case. Alors je pourrais faire apparaitre un mini-texte de dans avec marque "ne rien ecrire", mais bon d'apres ce que j'ai lu c'est pas tres fiable... Et je me demande si les personnes qui naviguent par clavier ne tombe pas dans cette case tout de meme? A vrais dire j'ai jamais vu un tel formulaire... Smiley langue

Merci.

[EDIT] Heyoan: Il n'existe donc aucun autre moyen que d'inscrire un commentaire directement dans la table? Oui effectivement je vais pas creer une deuxieme base juste pour le plaisir d'avoir une table pour commentaire temporaire.
Modifié par Dim (10 Jun 2009 - 15:42)
Dim a écrit :
En faite, pour la premiere question effectivement je pourrais faire comme ca, mais je prefererais ne pas inscrire le(s) commentaire(s) dans ma table tant qu'il ne sont pas valide. Pour ca j'imagine que l'on doit pouvoir faire appel a un fichier temporaire, mais je n'est pas du tout idee de comment faire ce genre de chose.
Le traitement serait bien plus lourd avec un fichier temporaire (écriture dans le fichier, validation du contenu, écriture du contenu dans la table, suppression du contenu dans le fichier) et surtout inutile...

Dim a écrit :
Il faut cependant que j'explique pourquoi. Par exemple, ma securite ne fonctionne plus et les spams passent outre. Ma table commentaire se retrouve alors submerge de mail pourri... Si je pouvais eviter ca, cela m'arrangerais... C'est une sorte de seconde securite
Autant la protection contre le spam peut être contournée, autant il n'y a aucune raison que l'utilisation du booléen le soit. Et puis c'est vite fait de supprimer plusieurs spams d'une table (qui de toutes façons ne seront pas affichés puisque tu ne les auras pas validés). Pour te simplifier un peu la vie il suffit de ne pas autoriser plus d'un certains nombre de commentaires par jour pour une même IP, ou plus de 2 ou 3 commentaires d'affiliée pour un même article et pour une même IP, etc.
Heyoan a écrit :
Autant la protection contre le spam peut être contournée, autant il n'y a aucune raison que l'utilisation du booléen le soit. Et puis c'est vite fait de supprimer plusieurs spams d'une table (qui de toutes façons ne seront pas affichés puisque tu ne les auras pas validés).

Bein l'objectif c'etait de ne pas me remplir ma table pour rien... Mais si tu dit qu'il est facile de supprimer les spams rapidement de la table cela me va Smiley smile
Je vais devoir approfoondire mes connaissances sql.

Heyoan a écrit :
Pour te simplifier un peu la vie il suffit de ne pas autoriser plus d'un certains nombre de commentaires par jour pour une même IP, ou plus de 2 ou 3 commentaires d'affiliée pour un même article et pour une même IP, etc.


Effectivement, j'avais pas pense a faire de cette maniere... D'ailleur je prefere la deuxieme solutions, sinon c'est trop restrictif pour l'internaute je trouve. Merci

Sinon avez-vous une preference pour la protection anti-spam de vos formulaires mise a part le systeme css avec sa case cache et les captcha?


Pour Les modo : J'ai un probleme avec l'edit sur ce post. Quand j'edit, l'edit precedent n'apparait pas dans la fenetre pour editer... C'est la premiere fois que ca me le fait.
Modifié par Dim (10 Jun 2009 - 16:47)
Bonjoir Alsanautes,

Je reviens a la "charge" avec un petit descriptif que j'aimerais me faire critique si celui-ci n'est pas bon...

En faite j'aimerais faire cela:
Heyoan a écrit :

Pour te simplifier un peu la vie il suffit de ne pas autoriser plus d'un certains nombre de commentaires par jour pour une même IP, ou plus de 2 ou 3 commentaires d'affiliée pour un même article et pour une même IP, etc.


Pour cela, voici les etapes que je pense faire :

1. Creer une table avec les champs suivants (ip_visiteur, heure, nb_commentaires, article_du_commentaire)
2. Au moment de l'envoie d'un commentaire, je verifis si celui n'as pas rempli sont quota de commentaire par rapport a l'article (disons 3commentaires par article par jour).
3. Pendant l'envoie d'un commentaire par le visiteur j'envoi dans la base d'adresse ip l'ensemble des infos (ip, heur, commentaire et article)
4. Si l'envoie est bien effectue je m'envoie un mail pour me prevenir de moderer le mail.
5. Toujours si l'envoie est ok, je redirige le visiteur sur ma page d'acceuil avec un petit message juste avant pour le remercier du commentaire et lui expliquer que celui-ci sera affiche apres moderation.
6. Si par contre le visiteur a deja poste plus de 3 commentaires, j'affiche une page en lui expliquant pourquoi cela n'as pas fonctionne et je lui donne un lien sur la page d'acceuil.

Je pense que le deroulement est un peu pres celui-ci... mais avant de me lancer j'aimerais avoir vos avis si cela est correcte, ou si il y as plus simple.

Merci d'avance a tous.
Bonne soiree
Hello Dim,

personnellement je ferais comme ça :

table commentaires :
id_commentaire
id_article
commentaire
date_comm (type DATETIME)
ip
pseudo
comm_valide (type BOOL)

Quand tous les champs du formulaire sont OK (donc au moment de faire l'INSERT) il suffit de vérifier le nombre déjà postés pour cet article :
$sql = "Select Count(*) As nb_comm From commentaires 
Where id_article = $id_article And ip = '$ip' 
And Date(date_comm) = Date(Now())"
Hello Heyoan,

Could you explain me, because my french is realy bad, mon anglais aussi d'ailleurs. Smiley decu

Non effectivement, c'est beaucoup plus simple comme tu me le propose, j'ai bien fait de demander avant de me lancer... j'aurais fait un carnage de php sinon. Mais pourquoi faire simple quand on peut faire compliqué??? Smiley lol

Bon et bein, une fois que j'ai fini mon code entier de cette partie je le posterais ici pour avoir vos avis. Soyez pas pressé je rentre en France demain pour une semaine alors je vais pas avoir trop le temps d'y toucher... j'ai d'autre chose as faire Smiley amour (y as pas que ça quand même Smiley cligne )

Merci merci merci encore et encore et toujours à la folie Heyoan Smiley prie
Bonjour a tous,

Je fait remonter ce post car j'ai un petit souci avec
a écrit :
$sql = "Select Count(*) As nb_comm From commentaires 

Where id_article = $id_article And ip = '$ip' 

And Date(date_comm) = Date(Now())"


En faite adabte a mon code cela donne
$nb_comm_pseudo = mysql_query("SELECT COUNT(*) AS nbre_comm FROM commentaires WHERE id_article = '$id_article' AND ip_comm = '$ip' AND DATE(date_commentaire) = 'DATE(NOW())'");
$nb_comms = mysql_fetch_array($nb_comm_pseudo);

Mais pour une raison que j'ignore le dernier "and" fait planter la requete.

J'ai teste la meme requete mais avec comme seul WHERE DATE(date_commentaire) = 'DATE(NOW())' et cela fonctionne pas.

J'ai verifie la correspondance entre date_commentaire de ma base et celui de la requete, j'ai le format datetime comme il m'avait ete conceille et j'ai beau cherche, je trouve pas d'ou vient le souci.
Avez-vous une idee s'il vous plaie?

[EDIT] Resolu, j'ai supprime les guillemets simple de Date(NOW()) et cela fonctionne.
Pourquoi il ne faut pas les mettre ici?
Modifié par Dim (25 Jun 2009 - 16:59)
Salut Heyoan,

Merci pour ce petit lien. Je l'avais deja lu mais j'avais pas asse ouvert les yeux en faite.

Si je peut abuser de la gentillesse de ce forum, j'aimerais bien me faire critiquer mon code, car il est certainement pas parfais meme si il ne presente aucune erreure W3C.
Il est inserer via un include dans mon index.
Voila Merci beaucoup a vous tous.

<?php
mysql_connect("mysql5-18", ".....", "....");   // Connexion à MySQL
mysql_query('SET NAMES UTF8');
mysql_select_db(".........."); // Sélection de la base pcvert   

/*-------------INITIALISATION DES VARIABLES------------------------------*/
$id_article = mysql_real_escape_string($_GET['id_article']); //Recupération de l'id de l'article qui se trouve dans l'url et protège la valeur
$requete_article = mysql_query("SELECT * FROM article WHERE id_article='$id_article'"); //Selection de la table et de l'article précis
$article = mysql_fetch_array($requete_article); // Création d'un array (tableau) contenant les infos de la table article et precisement de l'article choisi

$requete_commentaire = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM commentaires WHERE id_article='$id_article' and commentaire_valid='1'"); //Comptabilisation du nombre de commentaire que possede l'article.
$commentaires = mysql_fetch_array($requete_commentaire); //Creation d'un array (tableau) contenant les infos de la table commentaires de l'article en question.

$contenu_commentaire = mysql_query("SELECT * FROM commentaires WHERE id_article='$id_article' AND commentaire_valid='1' ORDER BY id_commentaire DESC"); //selection de la table commentaires de l'article precis dans l'ordre inverse de leur creations.

$ip = $_SERVER['REMOTE_ADDR'];
$etat="attente";

$nb_comm_pseudo = mysql_query("SELECT COUNT(*) AS nbre_comm FROM commentaires WHERE id_article = '$id_article' AND ip_comm = '$ip' AND Date(date_commentaire) = Date(NOW())");
$nb_comms = mysql_fetch_array($nb_comm_pseudo);

/*--INITIALISATION DES VARIABLES POUR MAIL---*/
	$adress = ".........";
	$pseudo = mysql_real_escape_string(htmlentities($_POST['qui_commentaire']));		// On rend inoffensifes ce que le visiteur a pu rentrer
	$commentaire = mysql_real_escape_string(htmlentities($_POST['commentaire_ajoute']));		// On rend inoffensifes ce que le visiteur a pu rentrer

	$jour = date("d");
	$mois = date("m");
	$annee = date("Y");
	$heure = date("H");
	$minute = date("i");
	
	$sujet = "Commentaire de l'article {$article['titre_article']}";
	$date = "Date: $jour/$mois/$annee\nHeure: $heure:$minute";
	$mess = "Pseudo: {$_POST['qui_commentaire']}\n $date\n";
    $entete = "Return-Path: $adress\r\n";
	$entete .= "From: ...................<$adress>\n";
	
	$errmsg=array();//initialisation de la variable pour les messages d'erreurs

/* -------------- Affichage de l'article ----------------*/
	echo "<div class='articles'>";
	echo "<h1>";
	echo "<a class='h1' href=''>".$article ['titre_article']."</a>"; 
	echo "</h1>"; 
	echo "<span class='date'>Créé le ".$article ['date_publication_article']." / ";
	echo $commentaires['nbre_entrees'];
	If ($commentaires['nbre_entrees'] <= 1) 
		echo " commentaire</span>"; 	
		else 
		echo " commentaires</span>";
	echo "<p class='texte'>";
	echo $article ['contenu_article'];
	echo "</p>";
	echo "</div>";
	
/* ---------------------- Affichage des commentaires grace a une boucle ----------------- */
	while ($donnees_commentaire=mysql_fetch_array($contenu_commentaire)) {
		echo "<div class='articles'>";
		echo "<p>";
		echo "<span class='pseudo'>";
		echo $donnees_commentaire['qui_commentaire']; 
		echo "</span> :";
		echo $donnees_commentaire['commentaire'];
		echo "</p>";
		echo "</div>";
	}

/* ---------------------- Verification du formulaire et envoie par mail et base de donnees ----------------- */
if ( strtolower( $_SERVER['REQUEST_METHOD'] ) == 'post' ) {
	if ($nb_comms['nbre_comm']>=3){
	$errmsg[] = 'Vous ne pouvez pas poster plus de trois messages par jour pour un même article. Revenez demain!';
	} else {
// Verification des donnees entrees par l'utilisateur
		if (!preg_match("#(^[A-ZÉÈÊ])\D[a-z]*(\D$)#", $pseudo))
			$errmsg[] = 'Votre pseudo doit commencer par une majuscule, ne peut comporter de numéro et doit avoir un minimum de trois lettres.';
		if (strlen($commentaire)<5)
			$errmsg[] = 'Je vous remercie de laisser un commentaire plus explicite.';
		//initialisation de la fin des variables pour l'email
		$mess .= "\n\n";
		$mess .= "Message: $commentaire\n";
	}
	
	if (empty($errmsg)){
// On ajoute une entrée avec mysql_query
mysql_query("INSERT INTO commentaires VALUES('$id_article', '', '$commentaire', NOW(), '$pseudo', '0', '$ip')");
	if (@ mail($adress, $sujet, $mess, $entete)){
	$etat="ok";
	$pseudo="";
	$commentaire="";
		}else{
		echo("ECHEC : Il y as eu un probleme lors de l'envoie du commentaire, réessayé dans 5 minutes. Merci");  //arrêt du script avec message d'erreur
		}
	}
	else{
		$etat = "erreur"; // On initialise notre etat à erreur, il sera changé à "ok" si la vérification du formulaire est un succès, sinon il reste à erreur
	}
}
?>

<!-- Le formulaire .......................................................................... -->
<?php
	// Cas où le formulaire a été soumis mais il y a des erreurs
	if (!empty($errmsg)){
	if ($etat = "erreur"){
		echo '<div class="articles"><ul class="attentionFormulaire">';
		for($i=0,$nb_element=count($errmsg);$i<$nb_element;$i++)
		echo '<li class="texte">'.$errmsg[$i]."</li>";	
		echo '</ul></div>';
	}}
?>
<div class="articles">
<form method="post" action="#"> 
<h6>Réagissez à ce post! (les commentaires seront systematiquement modérés avant affichage.)
</h6>
<p class="sansAlinea">
Pseudo<br />
<input type="text" name="qui_commentaire" value="<?php echo $pseudo;?>"/><br /><br />
Commentaire<br />
<textarea rows="5" cols="68" name="commentaire_ajoute"><?php echo $commentaire;?>

Modifié par Dim (26 Jun 2009 - 15:41)