begin process at 2012 05 27 20:24:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > SONDAGE SIMPLE - SANS BDD - CLASSE PHP - PROTECTION IP + COOKIE

SONDAGE SIMPLE - SANS BDD - CLASSE PHP - PROTECTION IP + COOKIE


 Information sur la source

Note :
5 / 10 - par 1 personne
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseau & Internet Classé sous :sondage, sans bdd, simple, txt, php Niveau :Débutant Date de création :08/04/2009 Date de mise à jour :10/04/2009 09:48:26 Vu / téléchargé :6 313 / 950

Auteur : mdall

Ecrire un message privé
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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&eacute;j&agrave; vot&eacute; !</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&eacute;j&agrave; vot&eacute; !</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&eacute;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&eacute;j&agrave; vot&eacute; !</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&eacute;j&agrave; vot&eacute; !</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&eacute;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 ;-)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 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

INSPECTEUR DE PAGES (VÉRIFIEZ SI DES SITES AFFICHENT UN TEXT... par pablo836
Source avec Zip Source avec une capture GÉOLOCALISATION par pgl10
Source avec Zip TAPI : METTRE EN RELATION DEUX POSTES TELEPHONIQUES par ravery
Source avec Zip CLIENT / SERVEUR : LES SOCKETS par Morphinof
Source avec Zip VALIDATEUR_3WC par lezj

 Sources en rapport avec celle ci

Source avec Zip PDS-PERTINENCE par bcmfr
Source avec Zip PDS-SONDAGES par bcmfr
Source avec une capture PAGINATION EN PHP par Orangina
SONDAGE - VOTE - POLL (AVEC MYSQL) par hornet_bzz
Source avec Zip Source avec une capture GALERIE PHOTO SIMPLE À GÉRER par francky6691

Commentaires et avis

Commentaire de Renfield le 09/04/2009 06:46:56 administrateur CS

J'ai activé ta source moi même.

Lorsque tu postes, tu cliques sur 'Prévisualiser' et tu obtiens ce message
"Attention : Votre source n'est pas encore en ligne !

Afin de finaliser votre participation veuillez ajouter au minimum 3 mots clef puis valider votre saisie en cliquant sur le bouton "Terminer" ci-dessous."

Commentaire de MoulouD1993 le 09/04/2009 16:19:18

quell q'un peut il me dire meuilleur logiciel de php merci d'avence

Commentaire de mdall le 10/04/2009 09:18:54

Merci Renfield !
C'est juste que quand j'ai cliqué sur prévisualiser, j'ai eu tout de suite un message du type "Votre source est désactivé" et je ne pouvais pas ajouter de mots clés ...

Sinon il me semble avoir décelé un bug dans ma source, je vais essayer d'en poster une correction assez rapidement ...

Commentaire de sgdfchelles77 le 19/04/2009 08:19:15

Bonjour à tous, bonjour Mdall,

Tout d’abord merci pour le script de sondage sans BDD car celui-ci fonctionne très bien et de ce fait je l’ai installé sur mon site.
Etant débutant en PHP et mes connaissances étant également très limitées, je fais appel a vous. Voilà, je voudrais adapter le formulaire sur mon site,  entre autre le centrer et mettre une couleur de fond (#3399FF) dans le formulaire résultats ainsi qu’au formulaire de vote.
Je voudrais également mettre un fond image (bleu3.jpg) sur la page principale. Ca serait sympa si quelqu’un pouvait me donner les codes à insérer dans le script.
Je vous remercie d’avance pour votre aide.
Alain

Commentaire de demenvil le 29/04/2009 13:22:41 5/10

Pas mal comme sources. Utile pour les débutant ;)
et pour  MoulouD1993  c'est pas un forum ici
Sinon je te répond quand même tu en as plusieur ;)
wamp
xamp
easyphp
swms
etc fait une recherche sur google

Commentaire de quinquin01 le 14/09/2009 11:48:57

Merci pour cette source !
Très utile dans mon cas, site sans base de donnée autre que XML.

Commentaire de homer59650 le 09/10/2009 19:47:01

Ton script est trop cool

Commentaire de tiwy57 le 18/10/2009 19:24:35

C'est parfait. Sa remplacera mon script de sondage qui me bouffe 10 requetes SQL...

Commentaire de MlKE le 27/10/2009 13:53:48

bonjour moi rien ne va j'ai cette erreur ???


Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /mnt/167/sda/2/7//vote/sondage.class.php on line 4

je suis débutant quelqu'un a une idée cordialement

Commentaire de hajourawm le 31/03/2010 12:14:12

j'utilise ce code tout va bien sauf q'un pb d'encodage
comment je peut modifier l'encodage de ce code en utf-8
merci d'avance pour votre aide

Commentaire de codestim le 23/10/2010 00:48:53

salut
1 an - 4 jours après la question de MLKE qui n'a été honorée d'aucune réponse, j'ai la même parse:error à la même ligne !!

Y a t'il un pilote dans l'avion ?
Tout cela n'est-il qu'un bobard ?
ou bien faut-il raquer quelque part ?

Puisqu'il y aurait des spécialistes ici (je n'en doute pas), en une année il aurait été apprécié que kelkun d'eux se penche sur la question, ou ait au moins un petit mot de sympathie.

Est ce une question de netiquette ou simplement de politesse ?
A vous de voir.

Marc. 92

Commentaire de mdall le 11/12/2010 15:56:32

Est-ce que vous utilisez php 4 ?
Le problème vient peut-être de là (le code est fait pour php 5)

 Ajouter un commentaire


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 &#224; tous,apres de nombreuses recherches, je n'ai jamais vraiment pu comprendre l'erreur..En effet, lorsque je cr&#233;&#233; 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales