Il existe toutes sortes de sondage. La plupart sont conçus
autour d'une base de données. Si celles-ci apportent des
avantages indéniables (stockage centralisé, archivage,
gestion des accès concurrents), elles ne sont pourtant pas
nécessaires dans tous les cas. Pour un petit site dont l'hébergement
ne permet pas l'utilisation d'"Access" ou "Sql Server"
par exemple, le fichier texte peut constituer une solution de secours.
Le but ici n'est pas de construire un sondage évolué
doté d'une multitude d'outils, mais de construire un système
minimal en manipulant principalement deux thèmes : Les accès
fichier (lecture / écriture), et la gestion des cookies.
Le reste du code, moins problématique, est néanmoins
fourni en intégralité avec ses commentaires.
Principe et fonctionnalités
Quels sont nos besoins ? Un système suffisamment simple
pour être modifié facilement, qui permette de recueillir
les votes des internautes, et affiche le résultat des votes
recueillis. Disons, une question, et trois propositions.
Certains sondages permettent de prendre connaissance des résultats
avant de voter, d'autres pas (afin de ne pas influencer l'internaute
dans ses choix). Nous choisissons de laisser l'accès libre
aux résultats du vote. Suite au vote d'un internaute, nous
le remercions puis affichons les derniers résultats du sondage.
Est-ce suffisant ? Il nous manque un moyen "d'empêcher"
un internaute de voter deux fois. Nous utiliserons un cookie afin
de détecter si une personne a déjà voté
ou non.
Enfin, il nous faut choisir une question et des propositions. Profitons-en
pour définir la structure de notre fichier texte, il ressemblera
à ceci :
(sondage.txt)
1*La température de l'eau ?*Un peu fraîche*Pas
mal*Glaciale*0*0*0
Nous le verrons par la suite, les caractères " * "
délimitent les champs qui composent notre fichier
texte. Reprenons-les un par un :
- 1 : C'est l'identifiant unique de notre sondage.
- "La température de l'eau ?" : Voici la question
du sondage.
- "Un peu fraîche", "Pas mal", "Glaciale"
: Les trois choix possibles pour l'internaute.
- 0*0*0 : Ce sont les nombres de réponses pour chacune de
nos propositions.
Par exemple, si nous avions 4*7*30, cela signifierait que quatre
internautes ont déjà voté pour la proposition
"Un peu fraîche", sept ont voté pour "Pas
mal" et trente pour la proposition "Glaciale".
Lire et écrire dans notre fichier
texte
Afin d'afficher la question et les propositions de notre
sondage, nous devons lire celles-ci dans notre fichier texte :
strTextFile = Server.MapPath("sondage.txt")
set objFSO = Server.CreateObject("Scripting.FileSystemObject")
set objTStream = objFSO.OpenTextFile(strTextFile)
ContenuFichier = objTStream.ReadAll
La première ligne nous renseigne sur le chemin physique
de notre fichier "sondage.txt". Nous utilisons une méthode,
"MapPath", de l'objet Server d'ASP.
Si cette notion "d'objet" vous semble floue, consultez
notre tutoriel "Les
objets ASP".
La seconde ligne fait appel à un objet proposé par
l'environnement de script d'ASP, appelé "bibliothèque
d'exécution de scripts". "FileSystemObject"
nous permet d'accéder au système de fichiers. Nous
instancions l'objet en question grâce à la méthode
"CreateObject", accessible par l'objet Server.
Il est encore question de méthode dans la ligne suivante,
"OpenTextFile" en est une, disponible à partir
de "FileSystemObject" (via "objFSO", notre instance).
Elle renvoie un objet "TextStream" qui, enfin, va nous
permettre d'utiliser la méthode "ReadAll". Celle-ci
lit la totalité de notre fichier "sondage.txt"
et renvoie le fruit de sa lecture sous forme de chaîne de
caractères. Nous stockons ce résultat dans une variable
nommée "ContenuFichier".
Nous n'en avons pas terminé avec notre fichier "sondage.txt".
En effet, telle quelle, la chaîne stockée dans "ContenuFichier"
n'est pas facilement exploitable. Cette difficultée n'en
est plus une grâce à nos délimiteurs "
* " et à la fonction "Split()".
Celle-ci prend en entrée une chaîne de caractères
et produit un tableau à une dimension dont les éléments
sont constitués des morceaux de la chaîne initiale,
découpée selon le délimiteur choisi. Le troisième
paramètre permet de renvoyer la totalité des sous-chaînes.
Dim MyArray, Total
MyArray = Split(ContenuFichier, "*", -1, 1)
objTStream.Close()
SondageID = MyArray(0)
SondageQuestion = MyArray(1)
Nous l'avions défini dans notre fichier "sondage.txt",
les deux premiers champs sont respectivement l'identifiant du sondage
et la question.
Plus tard, nous écraserons le contenu de notre fichier afin
de mettre à jour le nombre de réponses qu'il contient
pour la proposition choisie par l'internaute :
(L'avant-dernière ligne tient normalement sur une seule
ligne)
set objTStream = objFSO.CreateTextFile(strTextFile,
True)
objTStream.WriteLine(MyArray(0)&"*"&MyArray(1)&"*"&MyArray(2)&"*"&MyArray(3)
&"*"&MyArray(4)&"*"&MyArray(5)&"*"&MyArray(6)&"*"&MyArray(7))
objTStream.Close()
La méthode "CreateTextFile" couplée au
paramètre "True" permet de remplacer notre
fichier "sondage.txt" par un nouveau. Un seul champ est
modifié (le nombre de réponses lié à
une proposition), mais afin de simplifier la procédure nous
écrasons tout l'ancien contenu.
Les cookies à la rescousse
Nous savons désormais lire et écrire dans notre fichier
"sondage.txt". Nous aurions pu nous arrêter là
et permettre aux internautes de voter plusieurs fois. Cela n'est
pas très souhaitable, ajoutons alors une touche plus professionnelle
à notre petit système, en implémentant un contrôle
des votes basé sur un cookie.
Ecrire un cookie n'est pas très compliqué, la collection
"Cookies" de l'objet "Request" nous facilite
le travail :
Response.Cookies("SondageCook").Expires
= Now() + 30
Response.Cookies("SondageCook")("SondageID")
= SondageID
Ces deux lignes permettent de définir un cookie permanent,
d'une durée de vie de trente jours. Lorsque l'internaute
fermera son navigateur, le cookie subsistera sur son disque
dur et nous pourrons le lire (à condition qu'il ne l'efface
pas) s'il revient sur notre sondage.
Voyons où ces lignes de code prennent place dans l'ensemble
de notre système :
If Request.QueryString("PassTwo")
= "true" then
If Request.Cookies("SondageCook")("SondageID")
<> SondageID then
MyArray(Request.QueryString("SondageChoix"))
= Int(MyArray(Request.QueryString("SondageChoix")))
+ 1
strTextFile
= Server.MapPath("sondage.txt")
set
objFSO = Server.CreateObject("Scripting.FileSystemObject")
set
objTStream = objFSO.CreateTextFile(strTextFile, True)
objTStream.WriteLine(MyArray(0)&"*"&MyArray(1)&"*"&MyArray(2)&"*"&MyArray(3)
&"*"&MyArray(4)&"*"&MyArray(5)&"*"&MyArray(6)&"*"&MyArray(7))
objTStream.Close()
Response.Cookies("SondageCook").Expires
= Now() + 30
Response.Cookies("SondageCook")("SondageID")
= SondageID
Response.Write("Merci
d'avoir participé !")
Else
Response.Write("Vous
avez déjà voté pour ce sondage.")
End if
End if
(Rappel : Pour de plus amples commentaires sur le code, reportez-vous
au listing commenté complet disponible au téléchargement
en fin d'article.)
Après s'être assuré que nous étions
dans une phase de traitement d'un vote, ("Request.QueryString"
permet de récupérer une variable postée par
l'internaute via le formulaire), on regarde si la valeur de "SondageID"
contenue dans notre cookie est identique à l'identifiant
du sondage en cours (premier champ de notre fichier "sondage.txt").
Si c'est le cas, alors l'internaute a déjà voté,
nous lui rappelons.
Sinon, on écrase notre fichier, puis nous traitons le cookie.
Nous le créeons et lui attribuons la valeur de SondageID
lue dans le fichier "sondage.txt".
Le reste du code est plus classique, il nécessite quelques
connaissances en transmission de variable. Quelques tests habituels
sont aussi effectués :
On s'assure qu'un internaute choisi au moins une proposition avant
de valider son vote, on prévoit également le cas où
une personne souhaite consulter les résultats du sondage
alors qu'il n'y a pas encore de votes.
Enfin, des liens contextuels permettent de naviguer aisément
au sein des quelques pages que comportent ce petit système
de sondage.
Ce sondage a été testé sous Windows 2000 et
IIS. Rappel : pour démarrer votre serveur web, allez dans
le panneau de configuration, puis "Outils d'administration",
"Gestionnaire Web personnel", puis "Démarrer".
Placez alors le fichier "sondage.txt"
ainsi que "sondage.asp"
dans un répertoire de votre choix sous "\Inetpub\wwwroot".
Exécutez le tout sur votre navigateur en vous inspirant de
l'url de la page d'accueil indiquée par le "Gestionnaire
Web personnel" à laquelle vous concaténez le
nom du répertoire que vous avez choisi. Rajoutez "\sondage.asp"
et cela devrait fonctionner.
|