TUTORIELS 
Construire un sondage en ASP sans base de données
Un sondage ajoute de l'interactivité à votre site, construisez le vôtre, en ASP, sans passer par une base de données. Le serveur web IIS et un simple fichier texte suffisent. Démonstration.  ( 3 novembre 2001)
 

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.

 
[ Arnaud GadalJDNet
 
Accueil | Haut de page