Accueil > > > SONDAGE SIMPLE - SANS BDD - CLASSE PHP - PROTECTION IP + COOKIE
SONDAGE SIMPLE - SANS BDD - CLASSE PHP - PROTECTION IP + COOKIE
Information sur la source
Description
N'ayant pas trouvé de script de ce genre sur le web, j'ai décidé de le créer vite fait moi même. ^^ Donc c'est une classe de sondage très simpliste ayant pour but le fait de pouvoir être adaptée sur un site existant très rapidement (un seul fichier et non pas de multiples fichiers dans plusieurs dossiers comme certains scripts (qui sont néanmoins plus complets)). Les résultats ainsi que les IP sont stockés dans 2 fichiers textes ayant pour extension php et débutant par <?php exit(); ?>, ce qui devrait surtout empêcher les visiteurs de pouvoir voir les IPs des votants. Les résultats sont stockés dans le fichier dans l'ordre des réponses du sondage et sont séparés par des ";" donc attention si vous changez de vote : pensez à effacer les anciens fichiers contenant les ips et les résultats. (Par contre, par défaut, on ne peux pas mettre deux sondages sur la même page avec cette classe (les boutons radio des 2 formulaires de vote auraient le même nom) , pour cela, il devrait être possible de rajouter un paramètre dans le constructeur qui prendrait pour valeur le "name" du <input type="radio"/>. Enfin c'est dur à expliquer. ^^) Pour les barres de résultats, j'utilise tout simpleemnt une image gif de taille 10x1px dont la largeur est proportionnelle au pourcentage de résultats.
Source
- <?php
- class Sondage
- {
- public $Question = "" ;//Question du sondage
- public $Choix = array() ;//Contient les différents choix possibles du sondage
- public $DejaVote = false;//True si le visiteur a déjà voté, false (par défaut) sinon
- public $ListeIp = array() ;//Contient l'IP des visiteurs ayant déjà voté (extrait de $this->FichierIp)
- public $Resultats = array() ;//Contient les résultats des votes (extrait de $this->FichierResultats)
-
- public $FichierIp ;//Adresse du fichier (avec .php pour extension impérativement) contenant les IP des visiteurs ayant déjà votés (séparées par des ;)
- public $FichierResultats ;//Adresse du fichier (avec .php pour extension impérativement) contenant les résultats du sondage (séparés par des ; et dans l'ordre de l'array $this->Choix)
-
- //Constructeur de la classe
- public function __construct ( $Question, $Choix, $FichierIp, $FichierResultats )
- {
- $this->Question = $Question ;
- $this->Choix = $Choix ;
- $this->FichierIp = $FichierIp ;
- $this->FichierResultats = $FichierResultats ;
-
- //Si les fichiers IP et Resultats n'existent pas : les crée (possibilité de supprimer cette partie si vous créez les fichiers manuellement)
- if(!file_exists($FichierIp) OR !file_exists($FichierResultats)) {
- touch($FichierIp) ;
- touch($FichierResultats) ;
- }
-
- //Vérifie si le visiteur a déjà voté (Vérification Cookie + IP)
- if(isset($_COOKIE['vote']) OR $this->VerifierIp($_SERVER["REMOTE_ADDR"]) === false) {
- $this->DejaVote = true ;
- }
- }
- //Vérifie si l'IP du visiteur est déjà présente dans dans le fichier $FichierResultats
- private function VerifierIp ($ip)
- {
- $this->ListeIp = explode(";", file_get_contents($this->FichierIp, NULL, NULL, 16));
- if(!empty($this->ListeIp) AND in_array($ip, $this->ListeIp)){
- return false ;
- }
- return true ;
- }
- //Comptabilise le vote du Choix n° $NumVote : A UTILISER AVANT toute sortie (avant les balises <html><head> ...) car utilisation de la fonction setcookie()
- public function AjoutVote ($NumVote)
- {
- if($this->DejaVote === true) {
- return false ;
- }
- $this->Resultats = explode(";", file_get_contents($this->FichierResultats, NULL, NULL, 16));
- //Si premier vote : initialisation de $this->Resultats avec 0 votes pour chaque choix
- if(!isset($this->Resultats[0]{0})) {
- $Nb = sizeof($this->Choix) ;
- for($n=0;$n<$Nb;$n++) $this->Resultats[$n] = '0';
- }
- $this->Resultats[$NumVote]++ ;//Incrémentation du choix pour lequel le visiteur a voté
-
- $this->ListeIp[] = $_SERVER["REMOTE_ADDR"] ;//Ajout de l'IP du votant à la liste
-
- //Ecriture des Résultats et des IP dans les fichiers
- if( !file_put_contents($this->FichierResultats, '<?php exit(); ?>'.implode(";", $this->Resultats) )
- OR !file_put_contents($this->FichierIp, '<?php exit(); ?>'.implode(";", $this->ListeIp) ) ) {
- return false ;
- }
- $this->DejaVote = true ;
- setcookie('vote', true, time()+3*30*24*60*60) ; //Mise en place d'un cookie valide 3 mois
- return true;
- }
- //Affiche les résultats du vote
- public function AfficherResultats ()
- {
- //Si $this->Resultats est vide : il n'a pas encore été recherché dans le fichier $this->FichierResultats (ou 0 votes : voir ci-dessous)
- if(empty($this->Resultats))
- {
- $this->Resultats = explode(";", file_get_contents($this->FichierResultats, NULL, NULL, 16));
-
- //Si $this->Resultats est toujours vide : 0 votes : initialisation de $this->Resultats
- if(empty($this->Resultats)) {
- $Nb = sizeof($this->Choix) ;
- for($n=0;$n<$Nb;$n++) $this->Resultats[] = 0;
- }
- }
- $TotalVotes = array_sum($this->Resultats) ;//Fait la somme de tous les valeurs de $this->Resultats pour avoir le nombre total de votant
-
- echo '<div style="border:1px solid black;padding:0 10px;width:450px;"><p<b>'.$this->Question.'</b></p><table style="margin-left:10px;">' ;
-
- //Parcourt l'array $this->Choix afin d'écrire les résultats en utilisant $id pour obtenir le résultat correspondant au choix
- foreach($this->Choix as $id=>$choix)
- {
- @$pourcentage = $this->Resultats[$id]*100/$TotalVotes ;
- echo '<tr><td><u>'.$choix.'</u> : </td><td><img src="bar.gif" height="10" width="'.(2*$pourcentage).'" /> '.number_format($pourcentage, 2, ',', '').' % ('.$this->Resultats[$id].')</td></tr>' ;
- }
- echo '</table><p><b>Total des votes : </b> '.$TotalVotes.'</p>' ;
- if($this->DejaVote === true) {
- echo '<p>Vous avez déjà voté !</p>' ;
- }
- else {
- echo '<p><a href="?">Retourner au formulaire de vote</a></p>';
- }
- echo '</div>' ;
- }
- //Affiche le formulaire du vote
- public function AfficherFormulaire ()
- {
- echo '<div style="border:1px solid black;padding:0 10px;width:450px;"><form method="post"><p><b>'.$this->Question.'</b></p><table style="margin-left:10px;">' ;
- $disable = '';
- if($this->DejaVote === true) {
- $disable = ' disabled="disabled"';//Si le visiteur a déjà voté : grise le formulaire si nécessaire
- echo '<p>Vous avez déjà voté !</p>' ;
- }
- foreach($this->Choix as $id=>$choix)
- {
- echo '<tr><td><input type="radio" name="choix" value="'.$id.'"'.$disable.' /></td><td><u>'.$choix.'</u></td></tr>' ;
- }
- echo '</table><p><input type="submit" value="Votez!" '.$disable.'/></p><p><a href="?resultats=1">Voir les résultats</a></p></form></div>' ;
- }
- }
- /*
- * Exemple d'utilisation
- */
- $sondage = new Sondage('Quelle est votre couleur favorite ?', array('Vert', 'Jaune', 'Bleu'), 'ip.php', 'resultats.php') ;
-
- if( isset($_POST['choix']) ){
- $sondage->AjoutVote(intval($_POST['choix']));
- }
- echo '<html><body>' ;
- if($sondage->DejaVote === true OR isset($_GET['resultats'])){
- $sondage->AfficherResultats() ;
- }
- else {
- $sondage->AfficherFormulaire();
- }
<?php
class Sondage
{
public $Question = "" ;//Question du sondage
public $Choix = array() ;//Contient les différents choix possibles du sondage
public $DejaVote = false;//True si le visiteur a déjà voté, false (par défaut) sinon
public $ListeIp = array() ;//Contient l'IP des visiteurs ayant déjà voté (extrait de $this->FichierIp)
public $Resultats = array() ;//Contient les résultats des votes (extrait de $this->FichierResultats)
public $FichierIp ;//Adresse du fichier (avec .php pour extension impérativement) contenant les IP des visiteurs ayant déjà votés (séparées par des ;)
public $FichierResultats ;//Adresse du fichier (avec .php pour extension impérativement) contenant les résultats du sondage (séparés par des ; et dans l'ordre de l'array $this->Choix)
//Constructeur de la classe
public function __construct ( $Question, $Choix, $FichierIp, $FichierResultats )
{
$this->Question = $Question ;
$this->Choix = $Choix ;
$this->FichierIp = $FichierIp ;
$this->FichierResultats = $FichierResultats ;
//Si les fichiers IP et Resultats n'existent pas : les crée (possibilité de supprimer cette partie si vous créez les fichiers manuellement)
if(!file_exists($FichierIp) OR !file_exists($FichierResultats)) {
touch($FichierIp) ;
touch($FichierResultats) ;
}
//Vérifie si le visiteur a déjà voté (Vérification Cookie + IP)
if(isset($_COOKIE['vote']) OR $this->VerifierIp($_SERVER["REMOTE_ADDR"]) === false) {
$this->DejaVote = true ;
}
}
//Vérifie si l'IP du visiteur est déjà présente dans dans le fichier $FichierResultats
private function VerifierIp ($ip)
{
$this->ListeIp = explode(";", file_get_contents($this->FichierIp, NULL, NULL, 16));
if(!empty($this->ListeIp) AND in_array($ip, $this->ListeIp)){
return false ;
}
return true ;
}
//Comptabilise le vote du Choix n° $NumVote : A UTILISER AVANT toute sortie (avant les balises <html><head> ...) car utilisation de la fonction setcookie()
public function AjoutVote ($NumVote)
{
if($this->DejaVote === true) {
return false ;
}
$this->Resultats = explode(";", file_get_contents($this->FichierResultats, NULL, NULL, 16));
//Si premier vote : initialisation de $this->Resultats avec 0 votes pour chaque choix
if(!isset($this->Resultats[0]{0})) {
$Nb = sizeof($this->Choix) ;
for($n=0;$n<$Nb;$n++) $this->Resultats[$n] = '0';
}
$this->Resultats[$NumVote]++ ;//Incrémentation du choix pour lequel le visiteur a voté
$this->ListeIp[] = $_SERVER["REMOTE_ADDR"] ;//Ajout de l'IP du votant à la liste
//Ecriture des Résultats et des IP dans les fichiers
if( !file_put_contents($this->FichierResultats, '<?php exit(); ?>'.implode(";", $this->Resultats) )
OR !file_put_contents($this->FichierIp, '<?php exit(); ?>'.implode(";", $this->ListeIp) ) ) {
return false ;
}
$this->DejaVote = true ;
setcookie('vote', true, time()+3*30*24*60*60) ; //Mise en place d'un cookie valide 3 mois
return true;
}
//Affiche les résultats du vote
public function AfficherResultats ()
{
//Si $this->Resultats est vide : il n'a pas encore été recherché dans le fichier $this->FichierResultats (ou 0 votes : voir ci-dessous)
if(empty($this->Resultats))
{
$this->Resultats = explode(";", file_get_contents($this->FichierResultats, NULL, NULL, 16));
//Si $this->Resultats est toujours vide : 0 votes : initialisation de $this->Resultats
if(empty($this->Resultats)) {
$Nb = sizeof($this->Choix) ;
for($n=0;$n<$Nb;$n++) $this->Resultats[] = 0;
}
}
$TotalVotes = array_sum($this->Resultats) ;//Fait la somme de tous les valeurs de $this->Resultats pour avoir le nombre total de votant
echo '<div style="border:1px solid black;padding:0 10px;width:450px;"><p<b>'.$this->Question.'</b></p><table style="margin-left:10px;">' ;
//Parcourt l'array $this->Choix afin d'écrire les résultats en utilisant $id pour obtenir le résultat correspondant au choix
foreach($this->Choix as $id=>$choix)
{
@$pourcentage = $this->Resultats[$id]*100/$TotalVotes ;
echo '<tr><td><u>'.$choix.'</u> : </td><td><img src="bar.gif" height="10" width="'.(2*$pourcentage).'" /> '.number_format($pourcentage, 2, ',', '').' % ('.$this->Resultats[$id].')</td></tr>' ;
}
echo '</table><p><b>Total des votes : </b> '.$TotalVotes.'</p>' ;
if($this->DejaVote === true) {
echo '<p>Vous avez déjà voté !</p>' ;
}
else {
echo '<p><a href="?">Retourner au formulaire de vote</a></p>';
}
echo '</div>' ;
}
//Affiche le formulaire du vote
public function AfficherFormulaire ()
{
echo '<div style="border:1px solid black;padding:0 10px;width:450px;"><form method="post"><p><b>'.$this->Question.'</b></p><table style="margin-left:10px;">' ;
$disable = '';
if($this->DejaVote === true) {
$disable = ' disabled="disabled"';//Si le visiteur a déjà voté : grise le formulaire si nécessaire
echo '<p>Vous avez déjà voté !</p>' ;
}
foreach($this->Choix as $id=>$choix)
{
echo '<tr><td><input type="radio" name="choix" value="'.$id.'"'.$disable.' /></td><td><u>'.$choix.'</u></td></tr>' ;
}
echo '</table><p><input type="submit" value="Votez!" '.$disable.'/></p><p><a href="?resultats=1">Voir les résultats</a></p></form></div>' ;
}
}
/*
* Exemple d'utilisation
*/
$sondage = new Sondage('Quelle est votre couleur favorite ?', array('Vert', 'Jaune', 'Bleu'), 'ip.php', 'resultats.php') ;
if( isset($_POST['choix']) ){
$sondage->AjoutVote(intval($_POST['choix']));
}
echo '<html><body>' ;
if($sondage->DejaVote === true OR isset($_GET['resultats'])){
$sondage->AfficherResultats() ;
}
else {
$sondage->AfficherFormulaire();
}
Conclusion
Je précise que c'est la première source que je poste ici et que je ne l'ai pas encore testée en approfondi. Donc si vous avez la moindre remarque, suggestion, question ou décelez le moindre bug, n'hésitez pas ^^. Enjoy ;-)
Historique
- 10 avril 2009 09:48:27 :
- - Le "if(is_null($this->Resultats[0]))" ne marchait pas comme il le faut, ce qui entrainait des erreurs de votes dans certains cas. Il a été remplacé par "if(!isset($this->Resultats[0]{0}))".
- Correction de quelques erreurs du type "Notice"
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Prise en compte d'un cookie et rafraichissement fenêtre [ par joel64 ]
bonjour,merci à celui ou celle qui me donnera la solution au problème suivant.il s'agit d'un script php de sondage qui affiche la possibilité de vote
Problème de caractères dans le liens... (ex: mapage.php?mavar=hello) [ par Rabba ]
Hello!J'ai une page web codée en php et en javascript... J'ai des liste déroulantes et quand j'applique un onchange qui appelle la procédure Jump_Menu
Help me....travaille en php "simple" mais payé.....!! [ par Maniac ]
Salut,voila je n'y connais rien du tout en php, mais je dois "simplement" faire un forum pour un client pour qui je developpe son site...Si qq1 savait
PHP & WANADOO... [ par lard ]
Bonjour !Simple question:Pour l'instant, je suis abonné à Wanadoo (personne n'est parfait...) et j'ai voulu mettre en ligne une simple page Web conten
Plein de ptits Pbs sur un chat flash/php/txt ... [ par patochdu77 ]
Salutations ! Je suis débutant dans le php et j'ai crée un chat en flash/php/txt, il y a plein de ptit problèmes, comme la variable pseudo ki vient s'
php:c'est simple,j'arrive à rien! [ par peterbud ]
Bonjour à tous,Celà fait quelques jours que j'ai décidé de me mettre au php et j'utilise easy php1.7....et là ca va plus du tout.En effet je teste des
PHP to Flash [ par nashoy ]
Bonsoir à tous,apres de nombreuses recherches, je n'ai jamais vraiment pu comprendre l'erreur..En effet, lorsque je créé un simple scri
pb de variable undefined (facile a resoudre...j'espere) [ par Goodfellas_42 ]
salut mon pb est le suivant:Je realise un sondage en php/mysql et je veux recuperer des variables dans un autre fichier ke celui ou elle sont declarée
Sondage en PHP [ par LaTatadu91 ]
Salut , voila je suis debutant et je me lance dans la programmation d'un site et sur ce site j'aimerais qu'il y ai un petit sondage un peu comme celu
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|