Comment faire un sondage en PHP

Le sondage, tout comme le forum, les news, fait partie des scripts PHP les plus usités sur les différents sites WEB.

Nous allons donc voir comment réaliser un tel script, et ce, toujours en adoptant la méthode la plus simple possible.

Pour cela, réfléchissons aux pages dont nous allons avoir besoin pour réaliser un sondage (je vous rappelle qu'avant de se lancer dans la composition d'un script, une petite réflexion sur papier s'impose toujours : il faut savoir résister à l'appel du clavier).



On aura alors :
- la page qui contiendra le sondage, qui permettra également aux visiter de voter pour le sondage (donc la page index.php).
- une page qui servira à voir les résultats du sondage (que l'on nommera par exemple sondage_resultats.php et qui sera également présente dans le même répertoire que les deux précédentes).
- une page permettant au webmaster d'insérer un sondage (la page insert_sondage.php, page que l'on placera dans un répertoire admin par exemple)

Et voila :)

Ensuite, en ce qui concerne les tables SQL, faisons également une petite réflexion pour savoir combien de tables nous allons avoir besoin.

A priori, vu qu'un sondage comporte d'une part des questions, et d'autres part des réponses, on peut dire que l'on aura besoin de deux tables :
- une table qui contiendra toutes les questions du sondage (que l'on nommera sondage_questions).
- une table qui contiendra toutes les différentes réponses possibles aux différentes questions (table que l'on nommera sondage_reponses).

Détaillons alors le contenu de ces tables.
La table sondage_questions contiendra :
- un attribut id de type INT avec une option de type AUTO_INCREMENT : cet attribut fera la distinction entre nos différents sondages.
- un attribut question de type VARCHAR(150) : cet attribut donnera la question du sondage (150 caractères devraient largement suffire pour une question).

En ce qui concerne la table sondage_reponses on aura :
- un attribut id de type INT avec une option de type AUTO_INCREMENT : l'attribut qui nous permettra de distinguer les réponses à nos sondages.
- un attribut id_sondage de type INT: l'attribut qui nous permettra de rattacher la réponse au sondage auquel se rapporte cette question.
- un attribut reponse de type VARCHAR(100) : cet attribut donnera une des réponses du sondage (100 caractères devraient largement suffire pour une réponse).
- un attribut nb_reponses de type INT : attribut qui donnera le nombre de vote pour cette réponse.

Voici alors le schéma SQL de nos deux tables (donc à insérer dans votre PHPMyAdmin par exemple).

La table sondage_questions :

table sondage_questions
  1. CREATE TABLE sondage_questions (
  2.    id int(6) NOT NULL auto_increment,
  3.    question VARCHAR(150) NOT NULL,
  4.    PRIMARY KEY (id)
  5. ) TYPE=MyISAM; 


La table sondage_reponses :

table sondage_reponses
  1. CREATE TABLE sondage_reponses (
  2.    id int(6) NOT NULL auto_increment,
  3.    id_sondage INT(6) NOT NULL,
  4.    reponse VARCHAR(100) NOT NULL,
  5.    nb_reponses INT(6) NOT NULL,
  6.    PRIMARY KEY (id)
  7. ) TYPE=MyISAM; 


Avant de poursuivre notre algorithme (en fait, juste pour vous donner une idée de ce que contiendra les tables pour mieux comprendre le code que nous allons écrire pour notre index.php), nous allons prendre l'exemple d'un sondage composé d'une question et de plusieurs réponses possibles.

Voici par exemple le contenu de la table sondage_questions :

idQuestion
1Que pensez-vous de mon site ?


Et celui de la table sondage_reponses :

idid_sondagereponsenb_reponses
11Je kiff :)25
21Sympa :)14
31Po mal...8
41Po terrible :(3


Que contiendra alors notre index.php ?

Il faudra tout d'abord sélectionner la question du sondage en cours, c'est-à-dire la question de notre table sondage_sondages qui aura l'id le plus grand, puis les réponses correspondantes à ce même sondage, c'est-à-dire les éléments de la table sondage_reponses qui auront l'attribut id_sondage égal à l'id du sondage que l'on vient de sélectionner.

Après cela, on affichera notre formulaire permettant aux visiteurs de voter.

Et, c'est tout pour notre index.php :)

On aura alors, par exemple, pour notre page index.php :

  1. <?php
  2. // on teste si formulaire de vote a été validé
  3. if (isset($_POST['go']) && $_POST['go']=='Vote') { 
  4.    if (!isset($_POST['choix']) || !isset($_POST['sondage_en_cours'])) { 
  5.       $erreur = 'Aucune réponse n\'a été choisie.'; 
  6.    } 
  7.    // on teste si le visiteur a bien choisi une réponse avant d'avoir clické sur "Vote". On teste aussi si la variable $_POST['sondage_en_cours'] n'est pas vide
  8.    if (empty($_POST['choix']) || empty($_POST['sondage_en_cours'])) { 
  9.       $erreur = 'Au moins un des champs est vide.'; 
  10.    } 
  11.    else { 
  12.       // là le visiteur à choisi une réponse
  13.       // on se connecte à notre base
  14.       $base = mysql_connect ('serveur','login','pawword'); 
  15.       mysql_select_db ('nom_base',$base); 
  16.  
  17.       // on prépare notre requête : on ajoute un vote pour la réponse choisie par le votant
  18.       $sql ='UPDATE sondage_reponses SET nb_reponses = nb_reponses + 1 WHERE id_sondage="'.$_POST['sondage_en_cours'].'" AND id="'.$_POST['choix'].'"'; 
  19.  
  20.       // on lance la requête
  21.       mysql_query ($sql) or die ('Erreur SQL !'.$sql2.'<br />'.mysql_error()); 
  22.  
  23.       // on ferme la connexion à la base de donnée
  24.       mysql_close (); 
  25.  
  26.       $erreur = 'Merci d\'avoir voté :)'; 
  27.    }  
  28. }  
  29. ?> 
  30.  
  31. <html>
  32. <head>
  33. <title>Index de notre sondage :)</title>
  34. </head>
  35.  
  36. <body>
  37. <?php
  38. // on se connecte à notre base de données
  39. $base = mysql_connect ('localhost','root','');  
  40. mysql_select_db ('howto_sondage',$base);  
  41.  
  42. // on prépare une requête pour sélectionner l'id et la question du dernier sondage (on sélectionne les questions, et on en prend qu'une (le LIMIT 0,1) et ce, dans un ordre décroissent (DESC), soit en fait, la dernière question posée).
  43. $sql = 'SELECT id, question FROM sondage_questions ORDER BY id DESC LIMIT 0,1';  
  44.  
  45. // on lance la requête
  46. $req = mysql_query ($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  47.  
  48. // on récupère le résultat dans un tableau associatif
  49. $data = mysql_fetch_array ($req);  
  50.  
  51. $nb_sondage = mysql_num_rows($req);  
  52.  
  53. if ($nb_sondage == 0) { 
  54.    echo 'Aucun sondage.';  
  55. }  
  56. else { 
  57.    // on libère l'espace mémoire alloué à cette requête
  58.    mysql_free_result ($req); 
  59.  
  60.    // on affiche la question
  61.    echo stripslashes(htmlentities(trim($data['question']))),'<br />'; 
  62.  
  63.    // on prepare l'affichage de notre formulaire permettant de voter
  64.    echo '<form action = "index.php" method = "post">'; 
  65.  
  66.    // on prépare une requête permettant de sélectionner les réponses possibles se rapportant à ce même sondage
  67.    $sql = 'SELECT id, reponse FROM sondage_reponses WHERE id_sondage="'.$data['id'].'"'; 
  68.  
  69.    // on lance la requête
  70.    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
  71.  
  72.    // on prépare notre boucle pour afficher les différents choix possibles de réponses
  73.    while ($donnees = mysql_fetch_array($req)) { 
  74.       // on affiche des boutons radio pour les différents choix de réponses possibles
  75.       echo '<input type="radio" name="choix" value="' , $donnees['id'] , '"> ' , stripslashes(htmlentities(trim($donnees['reponse']))) , '<br />'; 
  76.    } 
  77.    ?>
  78.    <input type = "hidden" name = "sondage_en_cours" value = "<?php echo $data['id']; ?>">
  79.    <input type = "submit" name="go" value = "Vote">
  80.    </form>
  81.    <?php
  82. }  
  83.  
  84. // on libère l'espace mémoire alloué à cette requête
  85. mysql_free_result ($req);  
  86.  
  87. // on ferme la connection à notre base de données
  88. mysql_close ();  
  89. ?>
  90. <br /><br />
  91. <a href="sondage_resultats.php">Voir les résultats</a>
  92. <?php
  93. // on affiche les erreurs éventuelles
  94. if (isset($erreur)) echo '<br /><br />',$erreur;  
  95. ?>
  96. </body>
  97. </html> 



Le sondage est alors déjà opérationnel.

En effet, nous pouvons déjà afficher le formulaire nous permettant de voter, nous pouvons même voter, mais il nous reste tout de même la page sondage_resultats.php à écrire, page qui nous permettra de voir les résultats du sondage en cours.

Dans cette page, nous allons placer les différentes réponses les unes à la suite des autres, placer en face de chaque réponse le pourcentage de vote pour cette réponse, et enfin, en bas de la page, nous allons afficher le nombre de votre total pour ce sondage.


Nous aurons alors, par exemple, pour la page sondage_resultats.php :

sondage_resultats.php
  1. <html>
  2. <head>
  3. <title>Résultats des votes</title>
  4. </head>
  5.  
  6. <body>
  7. <?php
  8. // on se connecte à notre base de données
  9. $base = mysql_connect ('localhost','root','');  
  10. mysql_select_db ('howto_sondage',$base);  
  11.  
  12. // on selectionne la question et l'id du sondage en cours
  13. $sql = 'SELECT id, question FROM sondage_questions ORDER BY id DESC LIMIT 0,1';  
  14.  
  15. // on lance la requête
  16. $req = mysql_query ($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
  17.  
  18. // on récupère le résultat dans un tableau associatif
  19. $data = mysql_fetch_array ($req);  
  20.  
  21. // on libère l'espace mémoire alloué à cette requête
  22.  
  23. $nb_sondage = mysql_num_rows($req);  
  24. mysql_free_result ($req);  
  25.  
  26. if ($nb_sondage == 0) { 
  27.    echo 'Aucun sondage.';  
  28. }  
  29. else { 
  30.  
  31.    // on affiche la question
  32.    echo stripslashes(htmlentities(trim($data['question']))),'<br />'; 
  33.  
  34.    // on déclare un tableau qui contiendra les réponses de notre sondage
  35.    $tableau_reponses = array(); 
  36.  
  37.    // on déclare un tableau qui contiendra le nombre de réponse à chaque question
  38.    $tableau_nb_reponses = array(); 
  39.  
  40.    // on selectionne les reponses de ce sondage
  41.    $sql = 'SELECT reponse, nb_reponses FROM sondage_reponses WHERE id_sondage="'.$data['id'].'"'; 
  42.  
  43.    // on lance la requête
  44.    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
  45.  
  46.    // on prépare notre boucle pour récupérer les différents choix possibles de réponses
  47.    while ($data = mysql_fetch_array($req)) { 
  48.       // on place ces valeurs dans nos deux tableaux
  49.       $tableau_reponses[] = $data['reponse']; 
  50.       $tableau_nb_reponses[] = $data['nb_reponses']; 
  51.    } 
  52.  
  53.    // on libère l'espace mémoire alloué à cette requête
  54.    mysql_free_result ($req); 
  55.  
  56.    // on ferme la connection à notre base de données
  57.    mysql_close (); 
  58.  
  59.    // on compte le nombre de réponses possible de notre sondage
  60.    $nb_reponses_du_sondage = count ($tableau_reponses); 
  61.  
  62.    // on compte le nombre total de réponses pour ce sondage
  63.    $nb_total_reponse = array_sum ($tableau_nb_reponses); 
  64.  
  65.    // on teste le nombre de vote
  66.    if ($nb_total_reponse == 0) { 
  67.       // cas où personne n'a voté
  68.       echo 'Aucun vote pour l'instant';
  69.    }
  70.    else {
  71.       // cas où quelqu'un a déjà voté 
  72.       for ($i = 0; $i < $nb_reponses_du_sondage; $i++) { 
  73.          // on affiche une réponse
  74.          echo $tableau_reponses[$i]; 
  75.  
  76.          // on calcul le pourcentage de cette réponse
  77.          $pourcentage = ($tableau_nb_reponses[$i] * 100) / $nb_total_reponse; 
  78.  
  79.          // on arrondi ce calcul à un chiffre après la virgule
  80.          $pourcentage = round ($pourcentage, 1); 
  81.  
  82.          // on affiche le pourcentage
  83.          echo ' ',$pourcentage,' %<br />'; 
  84.       } 
  85.  
  86.       // on affiche le nombre total de votes
  87.       echo '<br /><br />Nombre de votes : ', $nb_total_reponse; 
  88.    }  
  89. }  
  90. ?> 
  91. </body>
  92. </html> 


Enfin, il nous reste à écrire la page de la partie admin permettant d'enregistrer un nouveau sondage.
Cette page sera un peu spécial, puisqu'elle utilise des variables dynamiques.

En effet, combien de réponses possibles aura notre nouveau sondage ?
On ne peut le savoir, et par conséquent, il va falloir générer autant de champ de formulaire de type text que de réponses possibles.

admin.php
  1. <?php
  2. // on teste si l'utilisateur a validé le formulaire et qu'il cherche à insérer le sondage dans la base, et non à ajouter une réponse au sondage
  3. if (isset($_POST['go']) && $_POST['go']=='Valider') { 
  4.    if (!isset($_POST['question']) || empty($_POST['question'])) { 
  5.       $erreur = 'Votre question est vide.'; 
  6.    } 
  7.    else { 
  8.       // on va regarder si l'utilisateur n'a pas laissé un champ vide
  9.       $valid_form = 1; 
  10.       for ($i=1; $i<=$_POST['nb_reponses']; $i++){ 
  11.          $temp = "reponse_$i"; 
  12.          if (isset($_POST[$temp])) $value=$_POST[$temp]; 
  13.          if (empty($value)) $valid_form = 0; 
  14.       } 
  15.       if ($valid_form == 0) { 
  16.          $erreur = 'Au moins une de vos réponse est vide.'; 
  17.       } 
  18.       else { 
  19.          // on se connecte à notre base de données
  20.          $base = mysql_connect ('serveur', 'login', 'password'); 
  21.          mysql_select_db('nom_base', $base); 
  22.          
  23.          // on insère notre question
  24.          $sql = 'INSERT INTO sondage_questions VALUES("","'.mysql_escape_string($_POST['question']).'")'; 
  25.          mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); 
  26.  
  27.          $id_sondage = mysql_insert_id(); 
  28.          
  29.          // on insère les réponses possibles à ce sondage
  30.          for ($i=1; $i<=$_POST['nb_reponses']; $i++){ 
  31.             $temp = "reponse_$i"; 
  32.             if (isset($_POST[$temp])) $value=$_POST[$temp]; 
  33.  
  34.             $sql = 'INSERT INTO sondage_reponses VALUES("","'.$id_sondage.'","'.mysql_escape_string($value).'", "0")'; 
  35.             mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); 
  36.  
  37.          } 
  38.          // on redirige l'utilisateur à l'accueil du sondage
  39.          header("location: ../index.php"); 
  40.          exit(); 
  41.       } 
  42.    }  
  43.  
  44. }  
  45. ?>
  46. <html>
  47. <head>
  48. <title>Insertion d'un nouveau sondage</title>
  49. </head>
  50.  
  51. <body>
  52.  
  53. <form action="insert_sondage.php" method="post">
  54. <table>
  55. <tr><td>
  56. <span class="gras">Question :</span>
  57. </td><td>
  58. <input type="text" name="question" value="<?php if (isset($_POST['question'])) echo stripslashes(htmlentities(trim($_POST['question']))); ?>">
  59. </td></tr>
  60. <?php
  61. // on teste si la variable $_POST['nb_reponses'] est définie ou pas. Si elle ne l'est pas, on la défini à 1 (un sondage aura au moins une reéponse possible :)
  62. if (!isset($_POST['nb_reponses'])) $_POST['nb_reponses'] = 1;  
  63.  
  64. // si l'utilisateur a clické sur 'Ajouter une réponse' on incrémente la variable $_POST['nb_reponses'], ce qui va nous permettre de rajouter un champ de type text (pour la nouvelle réponse possible) à notre formulaire
  65. if (isset($_POST['go']) && $_POST['go']=='Ajouter une réponse') $_POST['nb_reponses']++;  
  66.  
  67. for ($i=1; $i<=$_POST['nb_reponses']; $i++){ 
  68.    $temp = "reponse_$i"; 
  69.    if (isset($_POST[$temp])) $value=$_POST[$temp]; 
  70.    echo '<tr><td><td><input type="text" name="reponse_'.$i.'" value="'; 
  71.    if (isset($value)) echo stripslashes(htmlentities(trim($value))); 
  72.    echo '"></td></tr>'; 
  73.    unset($value);  
  74. }  
  75.  
  76. // on passe à notre formulaire le nombre de réponse au sondage
  77. echo '<input type="hidden" name="nb_reponses" value="'.$_POST['nb_reponses'].'">';  
  78. echo '<tr><td><input type="submit" name="go" value="Ajouter une réponse"></td></tr>';  
  79. echo '<tr><td>&nbsp;</td></tr>';  
  80. echo '<tr><td><input type="submit" name="go" value="Valider"></td></tr>';  
  81.  
  82. ?>
  83. </table>
  84. </form>
  85. <?php
  86. if (isset($erreur)) echo '<br /><br />',$erreur;  
  87. ?>
  88. </body>
  89. </html> 


Et voila :)

Notre sondage est à présent terminé.
Il ne reste plus qu'à rédiger l'interface d'administration permettant d'ajouter des nouveaux sondages, des nouvelles réponses.
Interface que je vous laisse réaliser :)

Que faire en plus ?

Afin d'améliorer ce sondage, vous pouvez pourquoi pas établir un système retenant l'adresse IP d'un votant (afin qu'il ne puisse pas voter plusieurs fois), voir même l'utilisation d'un cookie se souvenant que le visiteur à déjà voté.

Et pourquoi ne pas tenter de faire un graphique en barre comme sur lephpfacile dont la taille des barres varient suivant le nombre de votes ?

A vos claviers.

Auteur : LA GLOBULE
Dernière révision du comment faire : le 12/07/2007 à 00:59
pdfTélécharger ce comment faire au format PDF

Remonter Remonter
Jamma Play - L'éditeur javascript - CSS - Tutoriaux PHP - Tutoriels PHP - Bretagne - php - Moto - Kit graphique