Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Dreamgratuit - Philosophie
5 mai 2008

Créer un sondage en PHP avec Dreamweaver – 4e partie

Nous allons dans la 4e partie de ce tutorial voir comment empêcher un internaute de voter plusieurs fois.
J’évoque ici les 2 méthodes (à ma connaissance !) permettant d’éviter les doublons de vote :

  • Installer un cookie sur le poste utilisateur au moment du vote pour interdire le vote si le cookie existe déjà.
  • Stocker en base l’adresse IP de l’utilisateur pour interdire le vote si cette adresse est déjà en base.

Chacune de ces deux méthodes a un inconvénient :

  • le cookie : l’utilisateur peut supprimer le cookie
  • l’adresse IP : les adresses IP partagées (notamment dans le cadre professionnel ou pour les FAI, les adresses IP flottantes) n’autoriseront le vote que d’une seule personne au sein d’une organisation ou plusieurs votes pour une personne.

Nous utiliserons ici la méthode de l’adresse IP, celle du cookie étant à la merci de l’astuce du votant, elle me semble moins sécure (l’adresse IP étant, elle, stockée sur VOTRE serveur)…

Pour stocker l’adresse IP de l’utilisateur, nous allons donc créer une table tb_ipl dans notre base de données.

CREATE TABLE ` tb_ip` (
`id_secur` int(11) NOT NULL auto_increment,
`adr_ip` varchar(20) default NULL,
PRIMARY KEY (`id_secur`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Revenons maintenant à notre page PHP. Nous allons insérer l’adresse IP de l’utilisateur s’il vote. Intégrez le code suivant en dessous de la ligne $Result1 = mysql_query($insertSQL, $ nom_de_ma_connexion) or die(mysql_error()); (à l’intérieur du code indiquant que si le formulaire est posté, il faut insérer le vote dans la table tb_sondage) :

/* STOCKAGE IP POUR EVITER LES DOUBLONS DE VOTE */
$ip = $_SERVER["REMOTE_ADDR"]; //on recupère l'ip
$insertSQL2 = "INSERT INTO tb_ip (adr_ip) VALUES ('$ip')"; // On l'insère dans la table des IP
mysql_select_db($database_nom_de_ma_base, $nom_de_ma_connexion); // récupérez les noms de variables dans la ligne correspondante d’un jeu d’enregistrement de la page
$Result2 = mysql_query($insertSQL2, $nom_de_ma_connexion) or die(mysql_error());

Faite quelques tests de vote pour vérifier que votre adresse IP est bien insérée dans la base.

Maintenant il faut tester si l’adresse IP est présente dans la base avant d’autoriser de poster le vote. Pour cela nous allons utiliser le code de l’extension de FelixOne, Check New Element (disponible gratuitement en utilisant le lien dans la colonne de droite de ce site). Je vous donne ici le code tout préparé car les modifications que nous avons apportées précédemment au code de Dreamweaver et l’utilisation de la variable d’adresse IP rendent l’extension inutilisable ici. Il faut donc le copier/coller en l’état :

// *** TEST DES DOUBLONS DANS LES IP ***
$FX_flag = "MM_insert";
$FX_found = false;
if (isset($_POST [$FX_flag])) {
$FX_dupKeyRedirect = "erreur.php";
$FX_dupKeyValue = $_SERVER["REMOTE_ADDR"];
$FX_dupKeySQL = "SELECT adr_ip FROM tb_ip WHERE adr_ip = '" . $FX_dupKeyValue . "'";
mysql_select_db($database_nom_de_ma_base, $nom_de_ma_connexion); // récupérez les noms de variables dans la ligne correspondante d’un jeu d’enregistrement de la page
$FX_rsKey=mysql_query($FX_dupKeySQL, $nom_de_ma_connexion) or die(mysql_error());
if(mysql_num_rows($FX_rsKey) > 0) {
$FX_found = true;
$FX_dupValue = "IP (" . $FX_dupKeyValue . ") ";
}
if($FX_found) {
$FX_dupValue .= "Ce vote ne peut être pris en compte !";
$FX_qsChar = "?";
if ($FX_dupKeyRedirect == "") $FX_dupKeyRedirect = substr($_SERVER["PHP_SELF"], strrpos($_SERVER["PHP_SELF"], "/")+1);
if (strpos($FX_dupKeyRedirect, "?")) $FX_qsChar = "&";
$FX_dupKeyRedirect = $FX_dupKeyRedirect . $FX_qsChar . "FX_ReqValue=" . urlencode($FX_dupValue);
header ("Location: " . $FX_dupKeyRedirect);
exit;
}
mysql_free_result($FX_rsKey);
}

Il ne vous reste plus qu’à créer la page erreur.php avec le message indiquant à l’utilisateur qu’il a déjà voté et ne peut donc revoter !

Le prochain billet sera consacré à l’affichage conditionnel des résultats du vote.

Publicité
Commentaires
Archives
Publicité
Publicité