 |
Un sondage en PHP/MySQL |

|
Tutorial écrit par : Ordimania - Web
Ressources et Fabien Daniel - Script Masters
|
|
Introduction |
|
|
Dans ce tutorial, nous allons apprendre à créer notre
propre sondage à l’aide du couple PHP/MySQL. Ce tutorial
n’a pas l’ambition de fournir la solution unique à
ce genre de problème, mais plutôt des pistes afin de vous
permettre de développer votre propre application. Nous avons choisi
de simplifier son fonctionnement afin de vous permettre de personnaliser
ce script et ainsi approfondir vos connaissances.
Le script complet est néanmoins disponible en téléchargement.
Il est accompagné de ce tutorial au format imprimable.
|
|
Structure du script |
|
|
Notre sondage utilise le couple PHP/MySQL. Pour bien assimiler ce
tutorial, je vous prie d'aller voir ce
cours sur MySQL.
De plus, il est préférable d’avoir quelques notions
de requêtes MySQL (que nous approfondirons dans un prochain tutorial)
Voici la composition du script :
- Création d'une table MySQL (ou seront stockées les votes
et les ip des participants)
- Un fichier configuration.php (permet l’administration de votre
sondage)
- Un fichier form.php (script générant le formulaire de
vote)
- Un fichier voter.php (permettant l’insertion d’un nouveau
vote dans notre table)
- Un fichier result.php (où seront affichés les résultats
des votes)
- Un fichier init.php pour réinitialisé le sondage.
Nous allons dans un premier temps détaillé le fonctionnement
de chacun de ces fichiers avant de faire quelques remarques permettant
de sécuriser l’application.
|
 |
La table MySQL |
| |
Nous allons créer la table nécessaire au sondage dans
laquelle nous enregistrerons les votes. Selon les hébergeurs, vous
pouvez avoir différents scripts de gestion des bases de données;
cependant PhpMyAdmin est le plus utilisé.
| Structure de la table MySQL : |
DROP TABLE IF EXISTS sondage;
CREATE TABLE sondage (
ip char(50),
vote int(11),
PRIMARY KEY(ip)
); |
Remarquez que nous définissons deux champs : ip et vote. L’ip
nous permettra d’identifier le votant pour limiter le nombre de
vote par une même personne. Cependant, bien que restrictive, cette
technique n’est pas optimale. En effet, il est tout a fait possible
de changer d’ip plusieurs fois dans la journée. Au contraire,
deux personnes se connectant d’un même ordinateur public (université
par exemple) ne pourront pas voter chacun leur tour. Pour optimiser cette
technique, il pourrait être intéressant de rajouter un cookie.
Nous n’aborderons pas ce point ici. Néanmoins un tutorial
sur les cookies est dores et déjà disponible sur le
site.
|
 |
Fichier de configuration |
| |
Ce fichier que nous nommerons « configuration.php » présente
deux intérêts :
- Définir les variables de connexion à la base
- Configurer le sondage
Nous allons donc diviser l’étude de ce fichier en deux points.
a- Variables de connexions
Les variables de connexions dépendent de la configuration de votre
serveur. Celles définies ci-dessous peuvent être utilisé
en local avec une configuration par défaut.
| Variables de connexions : |
<?php
// Adresse de votre serveur sql (free : sql.free.fr, en local : localhost)
$hote = "localhost"; // Votre login
$login = "root";
// Votre mot de passe correspondant à ce login
$mot_passe = "";
// Nom de votre base MySQL
$nom_base = "test";
// Nom de la table (sondage par défaut)
$table = "sondage";
?>
|
b- Configuration du sondage
Ici, il s’agit de la configuration du sondage proprement dit. Vous
pouvez configurer votre question ainsi que les différentes réponses
possibles. Vous n’êtes pas limité en quantité
de réponse, il vous suffit d’ajouter des éléments
à votre tableau.
Ces informations nous permettrons également de générer
le formulaire associé.
| Configuration du sondage : |
<?
// Votre question
$question = "Que pensez-vous de ce tuto ?"; //Vos propositions
$rep[0] = "Très bon";
$rep[1] = "Bon";
$rep[2] = "Moyen";
$rep[3] = "Mauvais";
?>
|
|
 |
Formulaire |
| |
Ce fichier récupère la configuration vu précédemment
(contenu dans configuration.php) et de générer le formulaire
associé. Vous pouvez aisément modifier le code html pour
l’adapter à vote site. Remarquer que le formulaire pointe
vers le fichier « voter.php ». Celui-ci est charger d’analyser
le vote et de l’enregistrer dans la base si celui-ci est valide.
| Génération du formulaire : |
<?php require ("configuration.php"); ?> <table
width="200" border="0" cellspacing="0"
cellpadding="2"> <form method='post' action='voter.php'>
<tr> <td align="center"><?php echo $question;
?></td> </tr> <?php
// Affichage des propositions de réponses
for($i=0;$i<count($rep);$i++)
echo " <tr><td><input type=radio name=\"vote\"
value=\"".$i."\"> ".$rep[$i]."</td></tr>\n";
?> <tr> <td align="center"><input
type="submit" value="voter"></td>
</tr> </form> </table> |
Pour vous aidez à comprendre ce que nous faisons ici, voici le
code html que génère ce script avec le fichier de configuration
donner plus haut (à ne pas sauvegarder pour votre sondage)
| Résultat du script précédent : |
<table width="200" border="0" cellspacing="0"
cellpadding="2"> <form method='post'
action='voter.php'> <tr>
<td align="center">Que
pensez-vous de ce tuto ?</td> </tr>
<tr><td><input type=radio name="vote"
value="0"> Tres bon</td></tr> <tr><td><input
type=radio name="vote" value="1"> Bon</td></tr>
<tr><td><input type=radio name="vote"
value="2"> Moyen</td></tr> <tr><td><input
type=radio name="vote" value="3"> Mauvais</td></tr>
<tr> <td
align="center"><input type="submit" value="voter"></td>
</tr> </form>
</table> |
|
 |
Fichier de vote |
| |
Comme expliquer plus haut, nous enregistrons le script dans le fichier
« voter.php ». Voici le script que nous utilisons. Pour faciliter
la compréhension, nous allons décomposer le script en 3 parties
: La première partie consiste en l’initialisation de notre
script, a savoir la récupération des paramètres de
configuration, la connexion à la base de données. Par ailleurs,
on récupère des informations issues du client (le votant)
: son vote ainsi que son adresse IP.
| <?php
// On insère le fichier de configuration
require("configuration.php");
// On se connecte au serveur MySQL de notre hébergeur
mysql_connect($hote,$login,$mot_passe);
mysql_select_db($nom_base);
// On récupère le vote et l'ip du visiteur
$vote = $_POST['vote'];
$ip = $_SERVER['REMOTE_ADDR'];
?> |
La seconde partie a pour objectif de vérifier si l’adresse
IP se trouve déjà dans notre table. Pour ce faire, on effectue
une requête sélectionnant tout les lignes contenant cette
IP. Bien sur, ce nombre ne peut être qu’égale à
0 (aucun vote pour cette IP) ou 1 (IP présente dans la base de
donnée. La valeur 1 (true) entraîne un traitement d’erreur
qui affiche un message d’erreur et oblige le script à se
terminer.
| <?php // On vérifie si l'ip est déjà
présente dans la base de données
$query = "SELECT * FROM ".$table." WHERE ip='$ip'";
$result = mysql_query($query);
$num = mysql_num_rows($result);
// Message d'erreur et fin du script si une ip est déjà
présente
if($num)
{
echo "Il n'est possible de voter qu'une seule fois.";
exit;
}
?> |
Si le programme ne s’est pas terminé, on peut enregistrer
le vote. On insère la l’identifiant de la réponse
et l’adresse IP du votant. On n’oublie pas de fermer la connexion
mysql. Enfin, on invite le votant à visualiser les résultats
en pointant un lien vers la page result.php qui contient l’affichage
graphique des résultats.
<?php
// On insère le vote dans la base de données
$sql = "INSERT INTO $table (vote,ip) VALUES ('$vote','$ip')";
mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
mysql_close();
echo 'Merci d\'avoir voté !!<br><a href="result.php">Voir
les résultats</a>';
?>
|
|
 |
L'affichage des résultats |
| |
Enfin, nous allons voir comment afficher les résultats du sondage,
en montrant le nombre de vote et le pourcentage. Je vais traiter le sujet
de façon très basique en premier lieu puis nous verrons
comment personnaliser un peu l'affichage des résultats.
| <?php
// On insère le fichier de configuration
require ("configuration.php");
// On se connecte eu serveur MySQL de notre hébergeur
mysql_connect($hote,$login,$mot_passe);
mysql_select_db($nom_base);
// On recupere les nombre total de votes
$query = "SELECT count(*) as nbVote FROM ".$table;
$row = mysql_query($query);
while($data = mysql_fetch_array($row))
$total = $data["nbVote"];
echo "<table width=\"200\" cellspacing=\"0\"
cellpading=\"0\">\n";
for($i=0;$i<sizeof($rep);$i++)
{
// Pour chaque reponse, on affiche le nombre de vote
$query = "SELECT count(*) nbVote FROM ".$table."
WHERE vote='$i'";
$row = mysql_query($query);
while($data = mysql_fetch_array($row))
$pourcentage = $data["nbVote"] * 100 / $total;
echo "\t<tr><td>".$rep[$i]." : </td><td>".round($pourcentage)."
%</td></tr>\n";
}
echo "</table>\n";
// On affiche le nombre total de sondés
echo "<table width=\"100%\" cellspacing=\"0\"
cellpading=\"0\">\n";
echo "\t<tr><td>Nombres total des votes : $total</td></tr>\n</table>";
// On ferme la connection au serveur MySQL
mysql_close();
?>
|
En exercice, vous pouvez ajouter un affichage graphique des résultats
sous forme de diagramme, pour cela, vous pouvez utilisé l’une
de ces deux images et ajoutez cette ligne au bon endroit du script précédent
:
<img src='barre_horizon.jpg' height='10' width='".round($pourcentage)."'>
|
|
 |
Réinitialisation du sondage |
| |
Si vous décidez de changer de sondage (en modifiant le fichier
configuration.php), il peut être utile de remettre tout les résultats
à 0. Pour ce faire, on peut imaginer un fichier init.php qui exécute
la requête suivante :
Cette requête efface simplement le contenu de la table sondage.
Vous pouvez alors créer un sondage tout neuf :)
Si vous avez bien compris le reste du tutorial, vous n’aurez aucune
difficulté à implémenter ce script.
|
 |
Sécurité de l’application |
| |
Le script détaillé dans cette page est constitué
de deux fichiers dont le contenu doit être protégé.
Il s’agit des fichiers « configuration.php » qui contient
les informations relatives à votre serveur mySQL et le fichier
« init.php » qui peut réinitialiser votre table sondage.
Il est donc fortement conseillé de protéger ces fichiers
en les copiant dans un répertoire protégés par un
fichier « .htaccess ». Bien sûr, si vous changer de
répertoire au fichier de configuration, pensez également
à répercuter le chemin dans chaque portion de code qui l’appel.
|

|
Conclusion |
| |
Nous avons vu ensemble les bases pour élaborer un sondage simple
mais efficace. Vous pouvez bien évidemment y apporter des modifications.
Notamment en développant une interface d’administration plus
élaboré pour faciliter la mise à jour du sondage.
Si vous le désirez, l’intégralité du script
est disponible en téléchargement. Il est accompagné
de ce tutorial de 9 pages au format imprimable (pdf).
|