Accueil > > > SONDAGE - VOTE - POLL (AVEC MYSQL)
SONDAGE - VOTE - POLL (AVEC MYSQL)
Information sur la source
Description
Vous souhaitez inclure un sondage en ligne sur votre site. Certes, l'interface admin n'est pas de toute beauté mais ça fonctionne ;-) - Gestion/stockage des données par MySql (il faudra adapter la fonction de connection) - Création/génération des sondages (thème et questions inhérentes) par l'admin - Changement automatique du sondage actif (au délà de n votes, passage au sondage suivant) - Affichage des résultats en Live (utilisation de la librairie php-gd qui doit donc être active) - Pas de Javascript (et donc pas d'Ajax) ni de POO, rien que du vrai procédural d'époque Il est probable que vous ayez à adapter les chemins des includes selon l'arborescence de votre site sauf si vous respectez celle que je vous indique.
Source
- Génération des Thèmes dans la dB (/root_de_votre_site_par_ex_www/admin/script_crea_sondages.php
- <?php
-
- // **************************************************************************************
- // INSERER SONDAGE ds dB
- // Creation 24/12/2009 - PhB
- // **************************************************************************************
-
- // **************************************************************************************
- // INCLUDES (chemins à adapter selon votre config)
- // **************************************************************************************
- session_start();
- require_once("../lib/fonctions_db.php"); // ou créer ici une fonction connect_db() pour la connection à votre dB
-
- // **************************************************************************************
- // SECU
- // **************************************************************************************
- error_reporting(NULL);
-
- // **************************************************************************************
- // INIT
- // **************************************************************************************
- define('NB_QUEST_MAX', 10); // nbre max de questions par theme
- define('NB_REP_MAX', 5); // echelle des reponses par questions (1 à NB_REP_MAX)
- define('NB_QUEST_DEF', 3); // Nbre de questions selectionné par defaut
- define('NB_REP_DEF', 5); // Nbre de reponses/question selectionné par defaut (1= mauvais 2, 3= moyen, 4, 5=excellent)
- define('ACTIF_DEF', true); // Nouveaux Sondages actifs par défaut
- define('NB_MAX_THEMES', 1000); // limitation à NB_MAX_THEMES themes de sondage
-
- // **************************************************************************************
- // RECUP POST
- // **************************************************************************************
- $_SESSION['theme'] = (isset($_POST['theme']) && !empty($_POST['theme']))? htmlspecialchars($_POST['theme']) : $_SESSION['theme'] ;
- $_SESSION['nb_questions'] = (isset($_POST['nb_questions']))? htmlspecialchars($_POST['nb_questions']) : $_SESSION['nb_questions'] ;
-
- for ($i=0 ; $i < NB_QUEST_MAX ; $i++) {
- if (isset($_POST['question_'. $i]) && !empty($_POST['question_'. $i])) {
- $_SESSION['sondage'][] = array( htmlspecialchars($_POST['question_'. $i]) , htmlspecialchars($_POST['nb_reponses_'.$i]) ) ;
- }
- }
-
- if (isset($_POST['reset']) && $_POST['reset'] == 'RESET') {
- unset($_POST['reset']);
- $_SESSION = array();
- }
-
- // **************************************************************************************
- // 4- SAUVEGARDE dB
- // **************************************************************************************
- if ( isset($_POST['validation_sondage']) && $_POST['validation_sondage'] == 'ok' ) {
-
- // Connexion à la dB
- $my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
- $table_sondage = 'sondage_list';
- $table_questions= 'sondage_question';
-
- // Vérif du nombre de themes (sondages) déjà existants
- $count = 0;
- $requete = "SELECT COUNT(*) AS existing_themes FROM '%s' "; // AJOUTER TEST selon Vote/theme ?
- $retour = @mysql_query(sprintf($requete, rse($table_sondage) ) );
- $resultat = @mysql_fetch_array( $retour );
- $count = $resultat['existing_themes'] ;
- if ($count >= NB_MAX_THEMES) {
- $ok_for_new_theme = false;
- }
- else{
- $ok_for_new_theme = true;
- }
-
- if ($ok_for_new_theme) {
- // Ajout du nouveau theme si NB_MAX_THEMES n'est pas atteint
- $data = array('sondage_id' => '', 'sondage_theme' => $_SESSION['theme'], 'sondage_actif' => true);
- $add_dB = dB_ArrayToDB($table_sondage, $champs_exclus = '', $data, $sql_type = 'insert', NULL , $debug=false);
- if ($add_dB == false){
- die("erreur sql sur $table_sondage");
- mysql_close();
- exit;
- }
-
- // Recup de l'id du theme qui vient juste d'être ajouté
- $last_id= mysql_insert_id();
-
- // Ajout des questions à la table 'sondage_questions' pour $last_id
- foreach ($_SESSION['sondage'] as $key => $set_of_data) {
- $question = $set_of_data[0] ;
- $reponse = intval($set_of_data[1]) ;
- $data = array('id_sondage' => $last_id, 'id_question' => '', 'text_question' => $question, 'digit_reponse' => $reponse ) ;
- //var_dump($data);
- $add_dB = dB_ArrayToDB($table_questions, $champs_exclus = '', $data, $sql_type = 'insert', NULL , $debug=false);
- if ($add_dB == false) die("erreur sql sur $table_questions");
- }
- }
-
- // Fermeture dB
- mysql_close();
- }
-
-
- // **************************************************************************************
- // 3- VALIDATION SONDAGE
- // **************************************************************************************
- if (isset($_POST['creer_questions']) && $_POST['creer_questions'] == 'ok') {
- echo '<form method="post" action="script_crea_sondages.php">';
- echo ' <fieldset>';
- echo '<legend>VALIDATION FINALE DU SONDAGE avant creation dB <b>' . strtoupper($_SESSION['theme']) . ' ('. $_SESSION['nb_questions'] . ' question(s))</b>:</legend>';
- echo ' <br/><br/>';
- foreach($_SESSION['sondage'] as $key => $value) {
- echo "<br/>texte et nbre de rep de la question : " ;
- if (is_array($value)) {
- foreach ($value as $k => $v) {
- echo "$v, ";
- }
- }
- }
- echo '<input type="submit" name="validation_sondage" value="ok" /><input type="submit" name="reset" value="RESET" /></p>';
- echo '</fieldset>';
- echo '</form>';
- }
-
-
- // **************************************************************************************
- // 2- CREA QUESTIONS
- // **************************************************************************************
- if (isset($_POST['creer_sondage']) && isset($_POST['theme']) && !empty($_POST['theme']) && $_POST['creer_sondage'] == "ok") {
-
- // raz des questions
- $_SESSION['sondage']=array();
-
- echo '<form method="post" action="script_crea_sondages.php">';
- echo ' <fieldset>';
- echo '<legend>CREATION DES QUESTIONS pour le thème <b>' . strtoupper($_SESSION['theme']) . '</b>:</legend>';
- echo ' <br/><br/>';
- for ($i=0 ; $i < $_POST['nb_questions'] ; $i++) {
-
- echo ' <label for="question_"'. $i .'">QUESTION '. ($i+1) . '</label><br/>
- <input type="text" name="question_'. $i .'" maxlength="50" size="30" />';
-
- echo '<label for="nb_reponses"> => Echelle des reponses possibles:</label>
- <select name="nb_reponses_'.$i.'" size="1" maxlength="5" tabindex="20">';
- for ($j= 1 ; $j <= NB_REP_MAX ; $j++) {
- $selected = ( NB_REP_DEF == $j )? 'selected="selected"' : '' ;
- echo '<option value="' . $j . '" '. $selected . '>'. $j . '</option>';
- }
- echo ' </select><br/>';
- }
- echo ' <p><input type="submit" name="creer_questions" value="ok" /><input type="submit" name="reset" value="RESET" /></p>';
- echo ' </fieldset>';
- echo '</form>';
- }
-
-
- // **************************************************************************************
- // 1- CREA THEME
- // **************************************************************************************
- if ( (!isset($_POST['creer_sondage']) || !isset($_POST['theme']) || empty($_POST['theme'])) && (!isset($_POST['creer_questions']) ) ) {
- echo '<form method="post" action="script_crea_sondages.php">';
- echo ' <fieldset>';
- echo '<legend>CREATION THEME DU SONDAGE</legend>';
- echo ' <br/><br/>';
-
- echo ' <label for="theme">THEME</label><br/>';
- echo ' <input type="text" name="theme" maxlength="30" size="30" tabindex="10"/><br/>';
-
- echo ' <p>
- <label for="nb_questions">Nbre de questions pour le theme :</label><br />
- <select name="nb_questions" size="1" maxlength="5" tabindex="20">';
- for ($i= 1 ; $i <= NB_QUEST_MAX ; $i++) {
- $selected = ( NB_QUEST_DEF == $i )? 'selected="selected"' : '' ;
- echo '<option value="' . $i . '" ' . $selected. '>'. $i . '</option>';
- }
-
- echo ' </select>
- </p>';
-
- echo ' <p><input type="submit" name="creer_sondage" value="ok" /><input type="submit" name="reset" value="RESET" /></p>';
- echo ' </fieldset>';
- echo '</form>';
- }
- ?>
-
- la page principale "page_115.php" à placer dans "/www/dir_des_pages/"
- Il faudra simplement mettre un lien dans votre index.html qui pointe vers cette page.
- Par exemple : <a href="http://www.votre_site.fr/dir_des_pages/page_115.php"><img src="images/sondage.jpg" alt="Sondage" title="<?php echo $_SESSION['title'][115];?>"></a>
- Il faudra aussi
-
- <?php
- // ******************************************************************************************************
- // PAGE DE MINI SONDAGE
- // Création PhB 24/12/2009
- // Exploitation php des Sondages sources créés par script_crea_sondages.php dans la dB
- // Enregistrement dB, Affichage et exploitation des résultats
- ******************************************************************************************************
-
- // code page
- session_start();
- $_SESSION['cle_de_page']="dd1ccc261d55604d5b01e10190adef91";
-
- // INCLUDES & CLASSES
- require_once("lib/fonctions_db.php");
- require_once("lib/fonctions_survey.php");
-
- // INIT & CONSTANTES
- define('NB_MIN_VOTES_SIGNIFICATIFS', 100); // au dela de n votes, on passe au sondage suivant
- define('NB_MAX_THEMES', 1000); // maximiser pour la recherche du theme actif
- define('DEBUG', false);
- $current_ip = (!isset($current_ip))? !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'] : $current_ip ;
-
- // SECU
- if (DEBUG) {
- error_reporting(E_ALL ^ E_NOTICE);
- }
- else{
- error_reporting(NULL);
- }
-
- // RECUP de l'id du sondage actif
- if (DEBUG) { unset($_SESSION['id_survey_actif']) ;}
- $_SESSION['id_survey_actif'] = (!isset($_SESSION['id_survey_actif']))? GetActiveSurveyID($current_id=1, $smallest_id=NB_MAX_THEMES, $nb_votes_significatifs=NB_MIN_VOTES_SIGNIFICATIFS, !DEBUG) : $_SESSION['id_survey_actif'];
-
- // RECUP DU SONDAGE actif dans un array
- if (DEBUG) { unset($_SESSION['sondage_array']);}
- $_SESSION['sondage_array'] = (!isset($_SESSION['sondage_array']))? GetActiveSurveyQuestion($_SESSION['id_survey_actif'], !DEBUG) : $_SESSION['sondage_array'] ;
-
- // TRAITEMENT DU VOTE
- ComputeVotes($current_ip, DEBUG);
-
- // VERIF DOUBLE VOTE/QUESTION : 1 seul vote par IP et par question (et donc par theme)
- $sondage_aff = RemoveAlreadyVotedQuestions($current_ip, $_SESSION['sondage_array'], DEBUG ) ;
-
- // HEADERS
- //echo $_SESSION['titre_page'][115];
-
- // FORM OU RESULT SONDAGE
- if ($sondage_aff[0]['already_voted_by_this_ip'] == 'false' ){
- // FORM
- ShowSurvey($sondage_aff, DEBUG);
- }
- else{
- // VISU RESULTS (nota: selon la mise en cache, dernier vote pas pris en compte sans faire un "refresh")
- echo "<br/>On vous remercie,<br/>vous avez répondu à l'ensemble des questions du sondage en cours d'évaluation.<br/>";
- $result_votes = ComputeResults($_SESSION['id_survey_actif'], DEBUG);
- ShowResults($result_votes, $_SESSION['sondage_array'], DEBUG);
- }
- ?>
-
-
-
-
- Et enfin, les fonctions à placer dans "www_ou_root_de_votre_site/lib/functions_survey.php"
-
-
- <?php
-
- // ***********************************************
- // FONCTIONS DE SONDAGE
- // Création PhB 24/12/2009
- // ***********************************************
-
- // -----------------------------------------------
- function GetActiveSurveyID($current_id, $smallest_id, $nb_votes_significatifs, $debug=false) {
- // -----------------------------------------------
- // RECHERCHE ITERATIVE du SONDAGE dB actif
- // Le sondage actif est le plus petit id parmi les sondages,
- // et qui n'a pas déjà atteint le nbre de votes significatifs
- // Le premier appel à la fonction récurisive doit se faire avec $smallest_id = NB_MAX_THEMES;
-
- // Init
- if (!isset($smallest_id) || $smallest_id == 0 ) $smallest_id = 1000; // on admet 1000 sondages
- if (!isset($nb_votes_significatifs) || $nb_votes_significatifs == 0 ) $nb_votes_significatifs = 1000; // on admet qu'à partir de 1000 votes on passe au sondage suivant
-
- // Connexion à la dB
- $my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
- $table_sondage = 'sondage_list';
- $table_questions= 'sondage_question';
- $table_resultats= 'sondage_results';
-
-
- // DEFINITION SONDAGE ACTIF: si plusieurs sondages sont actifs, on prend le plus petit id tant que le nombre de votes pour CE sondage est inférieur à NB_MIN_VOTES_SIGNIFICATIFS
-
- // Recherche du plus petit "sondage_id" parmi les Thème(s) actif(s)
- $requete = "SELECT sondage_id FROM %s WHERE sondage_actif = '%d' ";
- $retour = @mysql_query(sprintf($requete, rse($table_sondage), true ) );
- while ($resultat= @mysql_fetch_array( $retour )){
- if (!empty ($resultat['sondage_id'])) {
- $smallest_id = ($resultat['sondage_id'] < $smallest_id && $resultat['sondage_id'] > $current_id) ? $resultat['sondage_id'] : $smallest_id ;
- }
- }
-
- // Vérification du nombres de votes pour CE sondage "sondage_id"
- // id de la 1ere question de ce sondage
- $requete = "SELECT id_question FROM %s WHERE id_sondage = '%d' LIMIT 1";
- $retour = @mysql_query(sprintf($requete, rse($table_questions), $smallest_id ) );
- $resultat = @mysql_fetch_array( $retour );
- $question_id= $resultat[0];
-
- // Nbre de votes pour cette question à comparer avec le nbre max significatif de votes
- $count_vote = 0;
- $requete = "SELECT COUNT(*) AS nbre_votes FROM %s WHERE id_question = '%d' ";
- $retour = @mysql_query(sprintf($requete, rse($table_resultats), $question_id ) );
- $resultat = @mysql_fetch_array( $retour );
- $count_vote = $resultat['nbre_votes'] ;
-
- // debug
- if ($debug) echo "<br/>DEBUG : sondage_id=$smallest_id, question_id=". $question_id . ', nbre de votes: ' . $count_vote ;
-
- // Détermination du sondage actif:
- // si le nb vote < NB_MIN_VOTES_SIGNIFICATIFS => on choisit ce sondage
- if ($count_vote < $nb_votes_significatifs) {
- $id_sondage_actif = $smallest_id;
- }
- // sinon on recherche récursivement le sondage actif suivant (si existant) par décrémentation de $smallest_id
- else {
- $id_sondage_actif = $smallest_id + 1 ;
- // Avant l'appel récursif, on s'assure que le nouvel id existe ds la dB et qu'il est actif
- $requete = "SELECT sondage_actif FROM %s WHERE sondage_id = '%d' LIMIT 1";
- $retour = @mysql_query(sprintf($requete, rse($table_sondage), $id_sondage_actif ) );
- $resultat = @mysql_fetch_array( $retour );
- $sondage_Ok = $resultat[0];
-
- // Si le sondage suivant existe et qu'il est actif alors on lance l'appel récursif
- if ($sondage_Ok) {
- GetActiveSurveyID($current_id= $smallest_id, $id_sondage_actif, $nb_votes_significatifs, $debug=false) ;
- }
- // Sinon on s'arrete là
- else{
- $id_sondage_actif = $smallest_id ;
- }
- }
-
- @mysql_close();
-
- return $id_sondage_actif;
-
- } /* fin de GetActiveSurveyID */
-
-
- // -----------------------------------------------
- function GetActiveSurveyQuestion($id_sondage_actif, $debug=false) {
- // -----------------------------------------------
- // Recupération des questions du sondage actif $id_sondage_actif
-
- // Init
- $survey_array = array();
-
- // Connexion à la dB
- $my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
- $table_sondage = 'sondage_list';
- $table_questions= 'sondage_question';
- $table_resultats= 'sondage_results';
-
- // Theme du sondage
- $requete = "SELECT sondage_theme FROM %s WHERE sondage_id = '%d' LIMIT 1";
- $retour = @mysql_query(sprintf($requete, rse($table_sondage), $id_sondage_actif ) );
- $resultat = @mysql_fetch_array( $retour );
- $theme = $resultat[0];
-
- // Questions et leur format pour les réponses
- $requete = "SELECT id_question, text_question, digit_reponse FROM %s WHERE id_sondage = %d ORDER BY id_question ASC"; //
- $retour = @mysql_query(sprintf($requete, rse($table_questions), $id_sondage_actif ) );
- for($i = 0; $questions[$i] = @mysql_fetch_array($retour); $i++) ;
- array_pop($questions);
-
-
-
- // Formatage tableau: virer les clés numériques redondantes
- $tmp = array();
- foreach($questions as $key => $value) {
- if (is_array($value)) {
- foreach($value as $k => $v) {
- if (!is_numeric($k)) {
- $tmp[$key][$k] = $v ;
- }
- }
- }
- }
- // Ajouter le theme en entete du tableau
- array_unshift($tmp, $theme);
-
- // Tableau final à retourner
- $survey_array= $tmp;
- unset($tmp);
-
- // Debug
- if ($debug) {
- echo "<br/>DEBUG GetActiveSurveyQuestion: ";
- echo "<br/>id du sondage actif: $id_sondage_actif";
- echo "<br/>theme du sondage actif: $theme";
- echo "<br/>Questions du sondage actif:";
- echo '<pre>'; print_r($survey_array); echo '</pre>';
- }
-
- // Cloture dB
- mysql_free_result($retour);
- mysql_close();
-
- return $survey_array;
-
- } /* fin de GetActiveSurveyQuestion */
-
-
- // -----------------------------------------------
- function RemoveAlreadyVotedQuestions($ip_client, $survey_array, $debug=false) {
- // -----------------------------------------------
- // Objectif: ajouter une clé au tableau $survey_array qui représente l'état "a déjà voté" pour ne pas autoriser la même IP de revoter 2 fois pour la même question
-
-
- // Nbre total de questions du sondage actif
- $nb_quest = count($survey_array) - 1 ; // car la premiere clé est le theme du sondage et non une question
-
- // Connexion à la dB
- $my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
- $table_sondage = 'sondage_list';
- $table_questions= 'sondage_question';
- $table_resultats= 'sondage_results';
-
- // Vérif dans la table "results" si l'IP a déjà voté la question du survey
- $tmp = array();
- $cumul = 0;
-
- foreach($survey_array as $key => $value) {
-
- $id_question = $value['id_question'];
-
- $requete = "SELECT COUNT(*) AS question_already_voted FROM %s WHERE IP_vote = '%s' AND id_question = %d "; // AJOUTER TEST selon Vote/theme ?
- $retour = @mysql_query(sprintf($requete, rse($table_resultats), rse($ip_client), $id_question ) );
- $resultat = @mysql_fetch_array( $retour );
- $voted = ($resultat['question_already_voted'] != 0 )? 'true' : 'false' ;
- $cumul += ($resultat['question_already_voted'] != 0 )? 1 : 0 ;
-
- $tmp[$key] = array($survey_array[$key] , 'already_voted_by_this_ip' => $voted );
- }
-
- // Status de cette ip pour l'ensemble des questions du sondage actif: si ttes les questions sont à true => tout le sondage a déjà été répondu par cette IP
- if ($cumul == $nb_quest) {
- $tmp[0]['already_voted_by_this_ip'] = 'true';
- }
- else{
- $tmp[0]['already_voted_by_this_ip'] = 'false';
- }
-
- // Debug
- if ($debug) {
- echo "<br/>DEBUG RemoveAlreadyVotedQuestions: ";
- echo "<br/>ip client: $ip_client";
- echo "<br/>Status des Questions du sondage actif pour cette IP:";
- echo '<pre>'; print_r($tmp); echo '</pre>';
- }
-
- // Cloture dB
- mysql_free_result($retour);
- mysql_close();
-
- return $tmp;
-
- } /* fin de RemoveAlreadyVotedQuestions */
-
-
- // -----------------------------------------------
- function ShowSurvey($survey_array, $debug=false) {
- // -----------------------------------------------
-
- // Form
- echo '<form method="post" action="index.php?page=115">';
- echo '<fieldset>';
- echo '<h3><legend>THEME DU SONDAGE : "<b>' . $survey_array[0][0] . '</b>"</legend></h3>';
- echo '<br/><br/>';
- echo '<table>';
-
- // ENTETE
- echo '<thead>';
- echo '<tr>';
- echo '<th></th><th>plutôt non'.str_repeat(' ',10).'plutôt oui</th>';
- echo '</tr>';
- echo '</thead>';
-
- // CORPS
- echo '<tbody>';
-
- for ($i=1 ; $i < count($survey_array) ; $i++) {
-
- // On affiche la question ssi l'IP connectée n'a pas déjà voté pour cette question
- if ($survey_array[$i]['already_voted_by_this_ip'] == 'false') {
- // La ligne de tableau
- echo '<tr>';
-
- // La question dans la première colonne
- echo '<td>';
- echo ' <label for="question_"'. $i .'">'. $survey_array[$i][0]['text_question'] . '</label>';
- echo '</td>';
-
- // Les boutons radio dans la deuxième colonne
- echo '<td>';
- for ($j=0 ; $j < $survey_array[$i][0]['digit_reponse']; $j++) {
- echo '<input type="radio" name="question_'. $survey_array[$i][0]['id_question'] . '" value="'. $j. '" />';
- }
- echo '</td>';
-
- echo '</tr>';
- }
- }
-
- echo '</tbody>';
- echo '</table>';
-
- echo '<p>'.str_repeat(' ', 55);
- echo '<input type="submit" name="reset" value="RESET" />'. str_repeat(' ', 5) .'<input type="submit" name="voter" value="VOTER" /></p>';
- echo '</fieldset>';
- echo '</form>';
-
-
-
- } /* fin de ShowSurvey */
-
-
- // -----------------------------------------------
- function ComputeVotes($ip_client, $debug=false) {
- // -----------------------------------------------
- // Recup des votes ($_POST), traitement/formatage et Save dB
- // Nota: les champs du tableau $result_votes correspondent aux champs de la table 'sondage_results' de la dB
-
- if (isset($_POST['voter']) && $_POST['voter'] == 'VOTER') {
-
- //if ($debug) var_dump($_POST);
-
- // INIT
- $result_votes = array() ;
- $pattern_question = '/^question_([0-9]{1,4})$/';
- $indice = 0;
-
- // Connexion à la dB
- $my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
- $table_sondage = 'sondage_list';
- $table_questions= 'sondage_question';
- $table_resultats= 'sondage_results';
-
- // RECUP DES VOTES => Tableau de la forme (id_question, ip_client, vote_client) avec ip_client ajoutée a posteriori
- foreach ($_POST as $key => $value) {
- // Construction du tableau data pour la dB
- if ( preg_match($pattern_question, $key, $match) ) {
-
- // Avant de stocker les resultats, on checke qu'ils ne sont pas déjà dans la dB
- // Vérif avant Save dB: si l'utilisateur n'a pas POSTER mais a fait un REFRESH du navigateur, il ne faut pas ré enregistrer dans la dB
- $requete = "SELECT COUNT(*) AS question_already_voted FROM %s WHERE IP_vote = '%s' AND id_question = %d "; // AJOUTER TEST selon Vote/theme ?
- $retour = @mysql_query(sprintf($requete, rse($table_resultats), rse($ip_client), $match[1] ) );
- $resultat = @mysql_fetch_array( $retour );
- $ok_to_store= ($resultat['question_already_voted'] == 0 )? true : false ;
-
- // On store le vote dans le tbl si pas déjà dans la dB
- if ($ok_to_store) {
- $result_votes[$indice]['id_question'] = $match[1];
- $result_votes[$indice]['IP_vote'] = $ip_client ;
- $result_votes[$indice]['resultat_vote'] = htmlspecialchars($_POST[$key]) + 1;
- $indice++;
- }
-
- }
- }
-
- // DEBUG
- if ($debug) {
- echo "<br/>DEBUG ComputeVotes:<pre>";
- print_r($result_votes);
- echo '</pre>';
- }
-
- // SAVE to dB
- if (is_array($result_votes) && !empty($result_votes)) {
- foreach($result_votes as $key => $data) {
- if (is_array($data)) {
- $add_dB = dB_ArrayToDB($table_resultats, $champs_exclus = '', $data, $sql_type = 'insert', $sql_cond=NULL , $debug);
- if ($add_dB == false){
- die("fonctions_survey: erreur sql sur $table_resultats");
- mysql_close();
- return false;
- exit;
- }
- }
- }
- }
-
- // Cloture
- mysql_close();
- unset($_POST['voter']);
- $_POST = array();
- return $result_votes;
- }
- else{
- unset($_POST['voter']);
- $_POST = array();
- return false;
- }
- } /* fin de ComputeVotes */
-
- // -----------------------------------------------
- function ComputeResults($survey_id, $debug=false) {
- // -----------------------------------------------
-
- // Connexion à la dB
- $my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
- $table_sondage = 'sondage_list';
- $table_questions= 'sondage_question';
- $table_resultats= 'sondage_results';
-
- // Recup des id_question correpondants au sondage actif
- $requete = "SELECT id_question FROM %s WHERE id_sondage = %d ORDER BY id_question ASC"; //
- $retour = @mysql_query(sprintf($requete, rse($table_questions), $survey_id ) );
- while ($row = @mysql_fetch_array($retour, MYSQL_NUM)) {
- $id_question[] = $row[0] ;
- }
- @mysql_free_result($retour);
-
- // DEBUG
- /*
- if ($debug) {
- echo '<br/>DEBUG ComputeResults';
- echo '<pre>'; print_r($id_question); echo '</pre>';
- }
- */
-
- // Récup resultats par question du sondage actif
- foreach($id_question as $id_quest) {
- // Recup resultats
- $requete = "SELECT resultat_vote FROM %s WHERE id_question = %d ORDER BY id_question ASC"; //
- $retour = @mysql_query(sprintf($requete, rse($table_resultats), $id_quest ) );
- while ($row = @mysql_fetch_array($retour, MYSQL_NUM)) {
- $results[$id_quest][] = $row[0] ;
- }
- // Récup du type de chaque question et échelle de notation: type Y/N ou Note
- $requete = "SELECT digit_reponse FROM %s WHERE id_question = %d ORDER BY id_question ASC"; //
- $retour = @mysql_query(sprintf($requete, rse($table_questions), $id_quest ) );
- while ($row = @mysql_fetch_array($retour, MYSQL_NUM)) {
- $results[$id_quest]['scale'] = $row[0] ;
- }
- }
- @mysql_free_result($retour);
-
-
-
-
- // DEBUG
- if ($debug) {
- echo '<br/>DEBUG ComputeResults - RECAP DES VOTES';
- echo '<pre>'; print_r($results); echo '</pre>';
- }
-
- // Traitement Stat des résultats:
-
- // nbre total de votes pour le sondage actif
- //$nb_total_votes = somme des votes pour chaque question
- $nb_total_votes = 0;
-
- // Statistiques par question
- foreach($results as $id_quest => $result_array) {
-
- // Init
- $somme = 0;
-
- // Nbre de votes pour la question en cours
- $nb_votes = count($result_array) - 1; // soustraire la clé 'scale'
-
- // Nbre de votes pour le sondage en cours
- $nb_total_votes += $nb_votes;
-
- // Type de la question: "notée de 1 à n" ou "Y/N"
- $cas = ($result_array['scale'] > 2)? 1 : 2 ;
-
- switch ($cas) {
-
- // CAS 1 : Questions notées: Moyenne des notes obtenues par question
- case 1:
- // Somme des notes obtenues
- foreach($result_array as $key => $note) {
- if (is_numeric ($key)) { // on exclut la clé 'scale' de la somme
- $somme += $note;
- }
- }
-
- // Pourcentage Résultat par question
- $moyenne = $somme / $nb_votes ;
- $pourcent = round(100* ($moyenne / $result_array['scale']) , 1) ;
-
- break;
-
-
- // CAS 2 : Questions Y/N: nbre de "oui", nbre de "non"
- case 2:
- // Somme des notes obtenues
- foreach($result_array as $key => $note) {
- if (is_numeric ($key)) { // on exclut la clé 'scale' de la somme
- $somme += $note - 1 ;
- }
- }
-
- // Pourcentage Résultat par question
- $moyenne = $somme / $nb_votes ;
- $pourcent = round(100* $moyenne , 1) ;
-
-
- break;
-
- // Debug
- /*
- if ($debug) {
- echo "<br/>DEBUG ComputeResults: id_question= $id_quest, votes=$nb_votes, moyenne=$moyenne, Result=$pourcent %";
- }
- */
- }
-
- // Store Resultat de la question en cours
- $storage_questions[$id_quest] = array('votes'=> $nb_votes, 'average_rate' => $moyenne, 'rating' => $pourcent ) ;
-
- }
-
- // Cloture dB
- mysql_close();
-
-
- // DEBUG
- if ($debug) {
- echo '<br/>DEBUG ComputeResults - TBL FINAL DES RESULTATS';
- echo '<br/><pre>'; print_r ($storage_questions) ; echo '</pre>' ;
- }
-
- // Memo Nbre Votes
- $_SESSION['nb_votes'] = $nb_votes;
-
- return $storage_questions;
-
-
- } /* fin de ComputeResults */
-
-
- // -----------------------------------------------
- function ShowResults($votes_computed, $survey_array, $debug=false) {
- // -----------------------------------------------
-
- // Formatage rapide de survey_array: y a surement plus propre .. :-)
- $question_list=array();
- foreach ($survey_array as $key => $val_array) {
- if (is_array($val_array)) {
- foreach($val_array as $cle => $val) {
- if ($cle == 'text_question') {
- $text_quest = $val;
- }
- if ($cle == 'id_question') {
- $id_quest = $val;
- }
- if (isset($text_quest)) {
- $question_list[$id_quest] = $text_quest ;
- }
- }
- }
- }
-
- // DEBUG
- if ($debug) {
- echo '<br/>DEBUG ShowResults - Tableau SURVEY brut';
- echo '<br/><pre>'; print_r ($survey_array) ; echo '</pre><br/>' ;
- echo '<br/>DEBUG ShowResults - Liste des questions';
- echo '<br/><pre>'; print_r ($question_list) ; echo '</pre>' ;
- }
-
- // AFFICHAGE RESULTS
- $indice_img = 0;
-
- echo '<br/><h3>RESULTAT DU SONDAGE "'. $survey_array[0] . '"</h3>';
-
- // Barre Graphique d'entete
- $text = 'plutôt non plutôt oui';
- $file_img= 'images/survey_title' ;
- $img = CreateBarGraph(100, $text, $file_img, false);
- echo '<img src="'. $img . '"/></br>';
-
- // BARGRAPH des Resultats
- foreach($votes_computed as $id_quest => $result_array) {
- //echo '<br/>Question '. $id_quest . ': ';
- $file_img= 'images/survey_bar_'. $indice_img ;
- $text = $question_list[$id_quest] . ' ('. $result_array['rating'] . ' %)' ;
- $percent = $result_array['rating'] ;
- $img = CreateBarGraph($percent, $text, $file_img, false);
- echo '<img src="'. $img . '"/></br></br>';
- $indice_img++;
- }
- echo '<br/>Nombre de votes: '. $_SESSION['nb_votes'] ;
-
- } /* fin de ComputeResults */
-
- // -----------------------------------------------
- function CreateBarGraph($percent, $text, $path_to_root_file_img, $debug=false) {
- // -----------------------------------------------
- $color = array(
- "aqua" => "145,187,234",
- "blue" => "73,96,214",
- "brown" => "176,112,86",
- "darkgreen" => "18,117,53",
- "gold" => "220,170,75",
- "green" => "30,191,56",
- "grey" => "207,188,192",
- "orange" => "240,131,77",
- "pink" => "244,109,188",
- "purple" => "149,57,214",
- "red" => "205,31,119",
- "yellow" => "240,213,67",
- "white" => "255,255,255",
- "black" => "0,0,0"
- );
-
- // Files et extensions
- $file_img_fond = $path_to_root_file_img .'_fond.png' ;
- $file_img_bar = $path_to_root_file_img .'_bar.png' ;
- $file_bargraph = $path_to_root_file_img .'_final.png' ;
-
- // La max largeur dispo
- $longueur_bar = 550;
- $largeur_bar = 25 ;
- $base_100 = $longueur_bar;
-
- // La barre de fond ($fond)
- $fond = imagecreate($longueur_bar , $largeur_bar);
- $blanc = imagecolorallocate($fond, 255, 255, 255 ); // couleur de fond
- $noir = imagecolorallocate($fond, 0, 0, 0); // couleur du texte
- imagestring($fond, 2, 10, 7, $text , $noir);
-
- imagepng($fond, $file_img_fond );
-
- // La barre resultat ($bar)
- if ($percent == 0) $percent = 1;
- $bar = imagecreate($percent , $largeur_bar );
- $bleu = imagecolorallocate($bar, 0, 0, 255); // couleur de fond
- imagepng($bar, $file_img_bar );
-
- // Merge des 2 barres
- $source = imagecreatefrompng($file_img_bar);
- $destination = imagecreatefrompng($file_img_fond);
-
- $transparence = 50;
- $long_bar = $percent * $base_100 / 100 ;
- imagecopymerge($destination, $source, 0, 2, 0, 2, $long_bar , $largeur_bar*0.8, $transparence);
- imagepng($destination, $file_bargraph );
-
- return $file_bargraph;
-
- } /* fin de GetBarGraph */
-
- ?>
Génération des Thèmes dans la dB (/root_de_votre_site_par_ex_www/admin/script_crea_sondages.php
<?php
// **************************************************************************************
// INSERER SONDAGE ds dB
// Creation 24/12/2009 - PhB
// **************************************************************************************
// **************************************************************************************
// INCLUDES (chemins à adapter selon votre config)
// **************************************************************************************
session_start();
require_once("../lib/fonctions_db.php"); // ou créer ici une fonction connect_db() pour la connection à votre dB
// **************************************************************************************
// SECU
// **************************************************************************************
error_reporting(NULL);
// **************************************************************************************
// INIT
// **************************************************************************************
define('NB_QUEST_MAX', 10); // nbre max de questions par theme
define('NB_REP_MAX', 5); // echelle des reponses par questions (1 à NB_REP_MAX)
define('NB_QUEST_DEF', 3); // Nbre de questions selectionné par defaut
define('NB_REP_DEF', 5); // Nbre de reponses/question selectionné par defaut (1= mauvais 2, 3= moyen, 4, 5=excellent)
define('ACTIF_DEF', true); // Nouveaux Sondages actifs par défaut
define('NB_MAX_THEMES', 1000); // limitation à NB_MAX_THEMES themes de sondage
// **************************************************************************************
// RECUP POST
// **************************************************************************************
$_SESSION['theme'] = (isset($_POST['theme']) && !empty($_POST['theme']))? htmlspecialchars($_POST['theme']) : $_SESSION['theme'] ;
$_SESSION['nb_questions'] = (isset($_POST['nb_questions']))? htmlspecialchars($_POST['nb_questions']) : $_SESSION['nb_questions'] ;
for ($i=0 ; $i < NB_QUEST_MAX ; $i++) {
if (isset($_POST['question_'. $i]) && !empty($_POST['question_'. $i])) {
$_SESSION['sondage'][] = array( htmlspecialchars($_POST['question_'. $i]) , htmlspecialchars($_POST['nb_reponses_'.$i]) ) ;
}
}
if (isset($_POST['reset']) && $_POST['reset'] == 'RESET') {
unset($_POST['reset']);
$_SESSION = array();
}
// **************************************************************************************
// 4- SAUVEGARDE dB
// **************************************************************************************
if ( isset($_POST['validation_sondage']) && $_POST['validation_sondage'] == 'ok' ) {
// Connexion à la dB
$my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
$table_sondage = 'sondage_list';
$table_questions= 'sondage_question';
// Vérif du nombre de themes (sondages) déjà existants
$count = 0;
$requete = "SELECT COUNT(*) AS existing_themes FROM '%s' "; // AJOUTER TEST selon Vote/theme ?
$retour = @mysql_query(sprintf($requete, rse($table_sondage) ) );
$resultat = @mysql_fetch_array( $retour );
$count = $resultat['existing_themes'] ;
if ($count >= NB_MAX_THEMES) {
$ok_for_new_theme = false;
}
else{
$ok_for_new_theme = true;
}
if ($ok_for_new_theme) {
// Ajout du nouveau theme si NB_MAX_THEMES n'est pas atteint
$data = array('sondage_id' => '', 'sondage_theme' => $_SESSION['theme'], 'sondage_actif' => true);
$add_dB = dB_ArrayToDB($table_sondage, $champs_exclus = '', $data, $sql_type = 'insert', NULL , $debug=false);
if ($add_dB == false){
die("erreur sql sur $table_sondage");
mysql_close();
exit;
}
// Recup de l'id du theme qui vient juste d'être ajouté
$last_id= mysql_insert_id();
// Ajout des questions à la table 'sondage_questions' pour $last_id
foreach ($_SESSION['sondage'] as $key => $set_of_data) {
$question = $set_of_data[0] ;
$reponse = intval($set_of_data[1]) ;
$data = array('id_sondage' => $last_id, 'id_question' => '', 'text_question' => $question, 'digit_reponse' => $reponse ) ;
//var_dump($data);
$add_dB = dB_ArrayToDB($table_questions, $champs_exclus = '', $data, $sql_type = 'insert', NULL , $debug=false);
if ($add_dB == false) die("erreur sql sur $table_questions");
}
}
// Fermeture dB
mysql_close();
}
// **************************************************************************************
// 3- VALIDATION SONDAGE
// **************************************************************************************
if (isset($_POST['creer_questions']) && $_POST['creer_questions'] == 'ok') {
echo '<form method="post" action="script_crea_sondages.php">';
echo ' <fieldset>';
echo '<legend>VALIDATION FINALE DU SONDAGE avant creation dB <b>' . strtoupper($_SESSION['theme']) . ' ('. $_SESSION['nb_questions'] . ' question(s))</b>:</legend>';
echo ' <br/><br/>';
foreach($_SESSION['sondage'] as $key => $value) {
echo "<br/>texte et nbre de rep de la question : " ;
if (is_array($value)) {
foreach ($value as $k => $v) {
echo "$v, ";
}
}
}
echo '<input type="submit" name="validation_sondage" value="ok" /><input type="submit" name="reset" value="RESET" /></p>';
echo '</fieldset>';
echo '</form>';
}
// **************************************************************************************
// 2- CREA QUESTIONS
// **************************************************************************************
if (isset($_POST['creer_sondage']) && isset($_POST['theme']) && !empty($_POST['theme']) && $_POST['creer_sondage'] == "ok") {
// raz des questions
$_SESSION['sondage']=array();
echo '<form method="post" action="script_crea_sondages.php">';
echo ' <fieldset>';
echo '<legend>CREATION DES QUESTIONS pour le thème <b>' . strtoupper($_SESSION['theme']) . '</b>:</legend>';
echo ' <br/><br/>';
for ($i=0 ; $i < $_POST['nb_questions'] ; $i++) {
echo ' <label for="question_"'. $i .'">QUESTION '. ($i+1) . '</label><br/>
<input type="text" name="question_'. $i .'" maxlength="50" size="30" />';
echo '<label for="nb_reponses"> => Echelle des reponses possibles:</label>
<select name="nb_reponses_'.$i.'" size="1" maxlength="5" tabindex="20">';
for ($j= 1 ; $j <= NB_REP_MAX ; $j++) {
$selected = ( NB_REP_DEF == $j )? 'selected="selected"' : '' ;
echo '<option value="' . $j . '" '. $selected . '>'. $j . '</option>';
}
echo ' </select><br/>';
}
echo ' <p><input type="submit" name="creer_questions" value="ok" /><input type="submit" name="reset" value="RESET" /></p>';
echo ' </fieldset>';
echo '</form>';
}
// **************************************************************************************
// 1- CREA THEME
// **************************************************************************************
if ( (!isset($_POST['creer_sondage']) || !isset($_POST['theme']) || empty($_POST['theme'])) && (!isset($_POST['creer_questions']) ) ) {
echo '<form method="post" action="script_crea_sondages.php">';
echo ' <fieldset>';
echo '<legend>CREATION THEME DU SONDAGE</legend>';
echo ' <br/><br/>';
echo ' <label for="theme">THEME</label><br/>';
echo ' <input type="text" name="theme" maxlength="30" size="30" tabindex="10"/><br/>';
echo ' <p>
<label for="nb_questions">Nbre de questions pour le theme :</label><br />
<select name="nb_questions" size="1" maxlength="5" tabindex="20">';
for ($i= 1 ; $i <= NB_QUEST_MAX ; $i++) {
$selected = ( NB_QUEST_DEF == $i )? 'selected="selected"' : '' ;
echo '<option value="' . $i . '" ' . $selected. '>'. $i . '</option>';
}
echo ' </select>
</p>';
echo ' <p><input type="submit" name="creer_sondage" value="ok" /><input type="submit" name="reset" value="RESET" /></p>';
echo ' </fieldset>';
echo '</form>';
}
?>
la page principale "page_115.php" à placer dans "/www/dir_des_pages/"
Il faudra simplement mettre un lien dans votre index.html qui pointe vers cette page.
Par exemple : <a href="http://www.votre_site.fr/dir_des_pages/page_115.php"><img src="images/sondage.jpg" alt="Sondage" title="<?php echo $_SESSION['title'][115];?>"></a>
Il faudra aussi
<?php
// ******************************************************************************************************
// PAGE DE MINI SONDAGE
// Création PhB 24/12/2009
// Exploitation php des Sondages sources créés par script_crea_sondages.php dans la dB
// Enregistrement dB, Affichage et exploitation des résultats
******************************************************************************************************
// code page
session_start();
$_SESSION['cle_de_page']="dd1ccc261d55604d5b01e10190adef91";
// INCLUDES & CLASSES
require_once("lib/fonctions_db.php");
require_once("lib/fonctions_survey.php");
// INIT & CONSTANTES
define('NB_MIN_VOTES_SIGNIFICATIFS', 100); // au dela de n votes, on passe au sondage suivant
define('NB_MAX_THEMES', 1000); // maximiser pour la recherche du theme actif
define('DEBUG', false);
$current_ip = (!isset($current_ip))? !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'] : $current_ip ;
// SECU
if (DEBUG) {
error_reporting(E_ALL ^ E_NOTICE);
}
else{
error_reporting(NULL);
}
// RECUP de l'id du sondage actif
if (DEBUG) { unset($_SESSION['id_survey_actif']) ;}
$_SESSION['id_survey_actif'] = (!isset($_SESSION['id_survey_actif']))? GetActiveSurveyID($current_id=1, $smallest_id=NB_MAX_THEMES, $nb_votes_significatifs=NB_MIN_VOTES_SIGNIFICATIFS, !DEBUG) : $_SESSION['id_survey_actif'];
// RECUP DU SONDAGE actif dans un array
if (DEBUG) { unset($_SESSION['sondage_array']);}
$_SESSION['sondage_array'] = (!isset($_SESSION['sondage_array']))? GetActiveSurveyQuestion($_SESSION['id_survey_actif'], !DEBUG) : $_SESSION['sondage_array'] ;
// TRAITEMENT DU VOTE
ComputeVotes($current_ip, DEBUG);
// VERIF DOUBLE VOTE/QUESTION : 1 seul vote par IP et par question (et donc par theme)
$sondage_aff = RemoveAlreadyVotedQuestions($current_ip, $_SESSION['sondage_array'], DEBUG ) ;
// HEADERS
//echo $_SESSION['titre_page'][115];
// FORM OU RESULT SONDAGE
if ($sondage_aff[0]['already_voted_by_this_ip'] == 'false' ){
// FORM
ShowSurvey($sondage_aff, DEBUG);
}
else{
// VISU RESULTS (nota: selon la mise en cache, dernier vote pas pris en compte sans faire un "refresh")
echo "<br/>On vous remercie,<br/>vous avez répondu à l'ensemble des questions du sondage en cours d'évaluation.<br/>";
$result_votes = ComputeResults($_SESSION['id_survey_actif'], DEBUG);
ShowResults($result_votes, $_SESSION['sondage_array'], DEBUG);
}
?>
Et enfin, les fonctions à placer dans "www_ou_root_de_votre_site/lib/functions_survey.php"
<?php
// ***********************************************
// FONCTIONS DE SONDAGE
// Création PhB 24/12/2009
// ***********************************************
// -----------------------------------------------
function GetActiveSurveyID($current_id, $smallest_id, $nb_votes_significatifs, $debug=false) {
// -----------------------------------------------
// RECHERCHE ITERATIVE du SONDAGE dB actif
// Le sondage actif est le plus petit id parmi les sondages,
// et qui n'a pas déjà atteint le nbre de votes significatifs
// Le premier appel à la fonction récurisive doit se faire avec $smallest_id = NB_MAX_THEMES;
// Init
if (!isset($smallest_id) || $smallest_id == 0 ) $smallest_id = 1000; // on admet 1000 sondages
if (!isset($nb_votes_significatifs) || $nb_votes_significatifs == 0 ) $nb_votes_significatifs = 1000; // on admet qu'à partir de 1000 votes on passe au sondage suivant
// Connexion à la dB
$my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
$table_sondage = 'sondage_list';
$table_questions= 'sondage_question';
$table_resultats= 'sondage_results';
// DEFINITION SONDAGE ACTIF: si plusieurs sondages sont actifs, on prend le plus petit id tant que le nombre de votes pour CE sondage est inférieur à NB_MIN_VOTES_SIGNIFICATIFS
// Recherche du plus petit "sondage_id" parmi les Thème(s) actif(s)
$requete = "SELECT sondage_id FROM %s WHERE sondage_actif = '%d' ";
$retour = @mysql_query(sprintf($requete, rse($table_sondage), true ) );
while ($resultat= @mysql_fetch_array( $retour )){
if (!empty ($resultat['sondage_id'])) {
$smallest_id = ($resultat['sondage_id'] < $smallest_id && $resultat['sondage_id'] > $current_id) ? $resultat['sondage_id'] : $smallest_id ;
}
}
// Vérification du nombres de votes pour CE sondage "sondage_id"
// id de la 1ere question de ce sondage
$requete = "SELECT id_question FROM %s WHERE id_sondage = '%d' LIMIT 1";
$retour = @mysql_query(sprintf($requete, rse($table_questions), $smallest_id ) );
$resultat = @mysql_fetch_array( $retour );
$question_id= $resultat[0];
// Nbre de votes pour cette question à comparer avec le nbre max significatif de votes
$count_vote = 0;
$requete = "SELECT COUNT(*) AS nbre_votes FROM %s WHERE id_question = '%d' ";
$retour = @mysql_query(sprintf($requete, rse($table_resultats), $question_id ) );
$resultat = @mysql_fetch_array( $retour );
$count_vote = $resultat['nbre_votes'] ;
// debug
if ($debug) echo "<br/>DEBUG : sondage_id=$smallest_id, question_id=". $question_id . ', nbre de votes: ' . $count_vote ;
// Détermination du sondage actif:
// si le nb vote < NB_MIN_VOTES_SIGNIFICATIFS => on choisit ce sondage
if ($count_vote < $nb_votes_significatifs) {
$id_sondage_actif = $smallest_id;
}
// sinon on recherche récursivement le sondage actif suivant (si existant) par décrémentation de $smallest_id
else {
$id_sondage_actif = $smallest_id + 1 ;
// Avant l'appel récursif, on s'assure que le nouvel id existe ds la dB et qu'il est actif
$requete = "SELECT sondage_actif FROM %s WHERE sondage_id = '%d' LIMIT 1";
$retour = @mysql_query(sprintf($requete, rse($table_sondage), $id_sondage_actif ) );
$resultat = @mysql_fetch_array( $retour );
$sondage_Ok = $resultat[0];
// Si le sondage suivant existe et qu'il est actif alors on lance l'appel récursif
if ($sondage_Ok) {
GetActiveSurveyID($current_id= $smallest_id, $id_sondage_actif, $nb_votes_significatifs, $debug=false) ;
}
// Sinon on s'arrete là
else{
$id_sondage_actif = $smallest_id ;
}
}
@mysql_close();
return $id_sondage_actif;
} /* fin de GetActiveSurveyID */
// -----------------------------------------------
function GetActiveSurveyQuestion($id_sondage_actif, $debug=false) {
// -----------------------------------------------
// Recupération des questions du sondage actif $id_sondage_actif
// Init
$survey_array = array();
// Connexion à la dB
$my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
$table_sondage = 'sondage_list';
$table_questions= 'sondage_question';
$table_resultats= 'sondage_results';
// Theme du sondage
$requete = "SELECT sondage_theme FROM %s WHERE sondage_id = '%d' LIMIT 1";
$retour = @mysql_query(sprintf($requete, rse($table_sondage), $id_sondage_actif ) );
$resultat = @mysql_fetch_array( $retour );
$theme = $resultat[0];
// Questions et leur format pour les réponses
$requete = "SELECT id_question, text_question, digit_reponse FROM %s WHERE id_sondage = %d ORDER BY id_question ASC"; //
$retour = @mysql_query(sprintf($requete, rse($table_questions), $id_sondage_actif ) );
for($i = 0; $questions[$i] = @mysql_fetch_array($retour); $i++) ;
array_pop($questions);
// Formatage tableau: virer les clés numériques redondantes
$tmp = array();
foreach($questions as $key => $value) {
if (is_array($value)) {
foreach($value as $k => $v) {
if (!is_numeric($k)) {
$tmp[$key][$k] = $v ;
}
}
}
}
// Ajouter le theme en entete du tableau
array_unshift($tmp, $theme);
// Tableau final à retourner
$survey_array= $tmp;
unset($tmp);
// Debug
if ($debug) {
echo "<br/>DEBUG GetActiveSurveyQuestion: ";
echo "<br/>id du sondage actif: $id_sondage_actif";
echo "<br/>theme du sondage actif: $theme";
echo "<br/>Questions du sondage actif:";
echo '<pre>'; print_r($survey_array); echo '</pre>';
}
// Cloture dB
mysql_free_result($retour);
mysql_close();
return $survey_array;
} /* fin de GetActiveSurveyQuestion */
// -----------------------------------------------
function RemoveAlreadyVotedQuestions($ip_client, $survey_array, $debug=false) {
// -----------------------------------------------
// Objectif: ajouter une clé au tableau $survey_array qui représente l'état "a déjà voté" pour ne pas autoriser la même IP de revoter 2 fois pour la même question
// Nbre total de questions du sondage actif
$nb_quest = count($survey_array) - 1 ; // car la premiere clé est le theme du sondage et non une question
// Connexion à la dB
$my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
$table_sondage = 'sondage_list';
$table_questions= 'sondage_question';
$table_resultats= 'sondage_results';
// Vérif dans la table "results" si l'IP a déjà voté la question du survey
$tmp = array();
$cumul = 0;
foreach($survey_array as $key => $value) {
$id_question = $value['id_question'];
$requete = "SELECT COUNT(*) AS question_already_voted FROM %s WHERE IP_vote = '%s' AND id_question = %d "; // AJOUTER TEST selon Vote/theme ?
$retour = @mysql_query(sprintf($requete, rse($table_resultats), rse($ip_client), $id_question ) );
$resultat = @mysql_fetch_array( $retour );
$voted = ($resultat['question_already_voted'] != 0 )? 'true' : 'false' ;
$cumul += ($resultat['question_already_voted'] != 0 )? 1 : 0 ;
$tmp[$key] = array($survey_array[$key] , 'already_voted_by_this_ip' => $voted );
}
// Status de cette ip pour l'ensemble des questions du sondage actif: si ttes les questions sont à true => tout le sondage a déjà été répondu par cette IP
if ($cumul == $nb_quest) {
$tmp[0]['already_voted_by_this_ip'] = 'true';
}
else{
$tmp[0]['already_voted_by_this_ip'] = 'false';
}
// Debug
if ($debug) {
echo "<br/>DEBUG RemoveAlreadyVotedQuestions: ";
echo "<br/>ip client: $ip_client";
echo "<br/>Status des Questions du sondage actif pour cette IP:";
echo '<pre>'; print_r($tmp); echo '</pre>';
}
// Cloture dB
mysql_free_result($retour);
mysql_close();
return $tmp;
} /* fin de RemoveAlreadyVotedQuestions */
// -----------------------------------------------
function ShowSurvey($survey_array, $debug=false) {
// -----------------------------------------------
// Form
echo '<form method="post" action="index.php?page=115">';
echo '<fieldset>';
echo '<h3><legend>THEME DU SONDAGE : "<b>' . $survey_array[0][0] . '</b>"</legend></h3>';
echo '<br/><br/>';
echo '<table>';
// ENTETE
echo '<thead>';
echo '<tr>';
echo '<th></th><th>plutôt non'.str_repeat(' ',10).'plutôt oui</th>';
echo '</tr>';
echo '</thead>';
// CORPS
echo '<tbody>';
for ($i=1 ; $i < count($survey_array) ; $i++) {
// On affiche la question ssi l'IP connectée n'a pas déjà voté pour cette question
if ($survey_array[$i]['already_voted_by_this_ip'] == 'false') {
// La ligne de tableau
echo '<tr>';
// La question dans la première colonne
echo '<td>';
echo ' <label for="question_"'. $i .'">'. $survey_array[$i][0]['text_question'] . '</label>';
echo '</td>';
// Les boutons radio dans la deuxième colonne
echo '<td>';
for ($j=0 ; $j < $survey_array[$i][0]['digit_reponse']; $j++) {
echo '<input type="radio" name="question_'. $survey_array[$i][0]['id_question'] . '" value="'. $j. '" />';
}
echo '</td>';
echo '</tr>';
}
}
echo '</tbody>';
echo '</table>';
echo '<p>'.str_repeat(' ', 55);
echo '<input type="submit" name="reset" value="RESET" />'. str_repeat(' ', 5) .'<input type="submit" name="voter" value="VOTER" /></p>';
echo '</fieldset>';
echo '</form>';
} /* fin de ShowSurvey */
// -----------------------------------------------
function ComputeVotes($ip_client, $debug=false) {
// -----------------------------------------------
// Recup des votes ($_POST), traitement/formatage et Save dB
// Nota: les champs du tableau $result_votes correspondent aux champs de la table 'sondage_results' de la dB
if (isset($_POST['voter']) && $_POST['voter'] == 'VOTER') {
//if ($debug) var_dump($_POST);
// INIT
$result_votes = array() ;
$pattern_question = '/^question_([0-9]{1,4})$/';
$indice = 0;
// Connexion à la dB
$my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
$table_sondage = 'sondage_list';
$table_questions= 'sondage_question';
$table_resultats= 'sondage_results';
// RECUP DES VOTES => Tableau de la forme (id_question, ip_client, vote_client) avec ip_client ajoutée a posteriori
foreach ($_POST as $key => $value) {
// Construction du tableau data pour la dB
if ( preg_match($pattern_question, $key, $match) ) {
// Avant de stocker les resultats, on checke qu'ils ne sont pas déjà dans la dB
// Vérif avant Save dB: si l'utilisateur n'a pas POSTER mais a fait un REFRESH du navigateur, il ne faut pas ré enregistrer dans la dB
$requete = "SELECT COUNT(*) AS question_already_voted FROM %s WHERE IP_vote = '%s' AND id_question = %d "; // AJOUTER TEST selon Vote/theme ?
$retour = @mysql_query(sprintf($requete, rse($table_resultats), rse($ip_client), $match[1] ) );
$resultat = @mysql_fetch_array( $retour );
$ok_to_store= ($resultat['question_already_voted'] == 0 )? true : false ;
// On store le vote dans le tbl si pas déjà dans la dB
if ($ok_to_store) {
$result_votes[$indice]['id_question'] = $match[1];
$result_votes[$indice]['IP_vote'] = $ip_client ;
$result_votes[$indice]['resultat_vote'] = htmlspecialchars($_POST[$key]) + 1;
$indice++;
}
}
}
// DEBUG
if ($debug) {
echo "<br/>DEBUG ComputeVotes:<pre>";
print_r($result_votes);
echo '</pre>';
}
// SAVE to dB
if (is_array($result_votes) && !empty($result_votes)) {
foreach($result_votes as $key => $data) {
if (is_array($data)) {
$add_dB = dB_ArrayToDB($table_resultats, $champs_exclus = '', $data, $sql_type = 'insert', $sql_cond=NULL , $debug);
if ($add_dB == false){
die("fonctions_survey: erreur sql sur $table_resultats");
mysql_close();
return false;
exit;
}
}
}
}
// Cloture
mysql_close();
unset($_POST['voter']);
$_POST = array();
return $result_votes;
}
else{
unset($_POST['voter']);
$_POST = array();
return false;
}
} /* fin de ComputeVotes */
// -----------------------------------------------
function ComputeResults($survey_id, $debug=false) {
// -----------------------------------------------
// Connexion à la dB
$my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;
$table_sondage = 'sondage_list';
$table_questions= 'sondage_question';
$table_resultats= 'sondage_results';
// Recup des id_question correpondants au sondage actif
$requete = "SELECT id_question FROM %s WHERE id_sondage = %d ORDER BY id_question ASC"; //
$retour = @mysql_query(sprintf($requete, rse($table_questions), $survey_id ) );
while ($row = @mysql_fetch_array($retour, MYSQL_NUM)) {
$id_question[] = $row[0] ;
}
@mysql_free_result($retour);
// DEBUG
/*
if ($debug) {
echo '<br/>DEBUG ComputeResults';
echo '<pre>'; print_r($id_question); echo '</pre>';
}
*/
// Récup resultats par question du sondage actif
foreach($id_question as $id_quest) {
// Recup resultats
$requete = "SELECT resultat_vote FROM %s WHERE id_question = %d ORDER BY id_question ASC"; //
$retour = @mysql_query(sprintf($requete, rse($table_resultats), $id_quest ) );
while ($row = @mysql_fetch_array($retour, MYSQL_NUM)) {
$results[$id_quest][] = $row[0] ;
}
// Récup du type de chaque question et échelle de notation: type Y/N ou Note
$requete = "SELECT digit_reponse FROM %s WHERE id_question = %d ORDER BY id_question ASC"; //
$retour = @mysql_query(sprintf($requete, rse($table_questions), $id_quest ) );
while ($row = @mysql_fetch_array($retour, MYSQL_NUM)) {
$results[$id_quest]['scale'] = $row[0] ;
}
}
@mysql_free_result($retour);
// DEBUG
if ($debug) {
echo '<br/>DEBUG ComputeResults - RECAP DES VOTES';
echo '<pre>'; print_r($results); echo '</pre>';
}
// Traitement Stat des résultats:
// nbre total de votes pour le sondage actif
//$nb_total_votes = somme des votes pour chaque question
$nb_total_votes = 0;
// Statistiques par question
foreach($results as $id_quest => $result_array) {
// Init
$somme = 0;
// Nbre de votes pour la question en cours
$nb_votes = count($result_array) - 1; // soustraire la clé 'scale'
// Nbre de votes pour le sondage en cours
$nb_total_votes += $nb_votes;
// Type de la question: "notée de 1 à n" ou "Y/N"
$cas = ($result_array['scale'] > 2)? 1 : 2 ;
switch ($cas) {
// CAS 1 : Questions notées: Moyenne des notes obtenues par question
case 1:
// Somme des notes obtenues
foreach($result_array as $key => $note) {
if (is_numeric ($key)) { // on exclut la clé 'scale' de la somme
$somme += $note;
}
}
// Pourcentage Résultat par question
$moyenne = $somme / $nb_votes ;
$pourcent = round(100* ($moyenne / $result_array['scale']) , 1) ;
break;
// CAS 2 : Questions Y/N: nbre de "oui", nbre de "non"
case 2:
// Somme des notes obtenues
foreach($result_array as $key => $note) {
if (is_numeric ($key)) { // on exclut la clé 'scale' de la somme
$somme += $note - 1 ;
}
}
// Pourcentage Résultat par question
$moyenne = $somme / $nb_votes ;
$pourcent = round(100* $moyenne , 1) ;
break;
// Debug
/*
if ($debug) {
echo "<br/>DEBUG ComputeResults: id_question= $id_quest, votes=$nb_votes, moyenne=$moyenne, Result=$pourcent %";
}
*/
}
// Store Resultat de la question en cours
$storage_questions[$id_quest] = array('votes'=> $nb_votes, 'average_rate' => $moyenne, 'rating' => $pourcent ) ;
}
// Cloture dB
mysql_close();
// DEBUG
if ($debug) {
echo '<br/>DEBUG ComputeResults - TBL FINAL DES RESULTATS';
echo '<br/><pre>'; print_r ($storage_questions) ; echo '</pre>' ;
}
// Memo Nbre Votes
$_SESSION['nb_votes'] = $nb_votes;
return $storage_questions;
} /* fin de ComputeResults */
// -----------------------------------------------
function ShowResults($votes_computed, $survey_array, $debug=false) {
// -----------------------------------------------
// Formatage rapide de survey_array: y a surement plus propre .. :-)
$question_list=array();
foreach ($survey_array as $key => $val_array) {
if (is_array($val_array)) {
foreach($val_array as $cle => $val) {
if ($cle == 'text_question') {
$text_quest = $val;
}
if ($cle == 'id_question') {
$id_quest = $val;
}
if (isset($text_quest)) {
$question_list[$id_quest] = $text_quest ;
}
}
}
}
// DEBUG
if ($debug) {
echo '<br/>DEBUG ShowResults - Tableau SURVEY brut';
echo '<br/><pre>'; print_r ($survey_array) ; echo '</pre><br/>' ;
echo '<br/>DEBUG ShowResults - Liste des questions';
echo '<br/><pre>'; print_r ($question_list) ; echo '</pre>' ;
}
// AFFICHAGE RESULTS
$indice_img = 0;
echo '<br/><h3>RESULTAT DU SONDAGE "'. $survey_array[0] . '"</h3>';
// Barre Graphique d'entete
$text = 'plutôt non plutôt oui';
$file_img= 'images/survey_title' ;
$img = CreateBarGraph(100, $text, $file_img, false);
echo '<img src="'. $img . '"/></br>';
// BARGRAPH des Resultats
foreach($votes_computed as $id_quest => $result_array) {
//echo '<br/>Question '. $id_quest . ': ';
$file_img= 'images/survey_bar_'. $indice_img ;
$text = $question_list[$id_quest] . ' ('. $result_array['rating'] . ' %)' ;
$percent = $result_array['rating'] ;
$img = CreateBarGraph($percent, $text, $file_img, false);
echo '<img src="'. $img . '"/></br></br>';
$indice_img++;
}
echo '<br/>Nombre de votes: '. $_SESSION['nb_votes'] ;
} /* fin de ComputeResults */
// -----------------------------------------------
function CreateBarGraph($percent, $text, $path_to_root_file_img, $debug=false) {
// -----------------------------------------------
$color = array(
"aqua" => "145,187,234",
"blue" => "73,96,214",
"brown" => "176,112,86",
"darkgreen" => "18,117,53",
"gold" => "220,170,75",
"green" => "30,191,56",
"grey" => "207,188,192",
"orange" => "240,131,77",
"pink" => "244,109,188",
"purple" => "149,57,214",
"red" => "205,31,119",
"yellow" => "240,213,67",
"white" => "255,255,255",
"black" => "0,0,0"
);
// Files et extensions
$file_img_fond = $path_to_root_file_img .'_fond.png' ;
$file_img_bar = $path_to_root_file_img .'_bar.png' ;
$file_bargraph = $path_to_root_file_img .'_final.png' ;
// La max largeur dispo
$longueur_bar = 550;
$largeur_bar = 25 ;
$base_100 = $longueur_bar;
// La barre de fond ($fond)
$fond = imagecreate($longueur_bar , $largeur_bar);
$blanc = imagecolorallocate($fond, 255, 255, 255 ); // couleur de fond
$noir = imagecolorallocate($fond, 0, 0, 0); // couleur du texte
imagestring($fond, 2, 10, 7, $text , $noir);
imagepng($fond, $file_img_fond );
// La barre resultat ($bar)
if ($percent == 0) $percent = 1;
$bar = imagecreate($percent , $largeur_bar );
$bleu = imagecolorallocate($bar, 0, 0, 255); // couleur de fond
imagepng($bar, $file_img_bar );
// Merge des 2 barres
$source = imagecreatefrompng($file_img_bar);
$destination = imagecreatefrompng($file_img_fond);
$transparence = 50;
$long_bar = $percent * $base_100 / 100 ;
imagecopymerge($destination, $source, 0, 2, 0, 2, $long_bar , $largeur_bar*0.8, $transparence);
imagepng($destination, $file_bargraph );
return $file_bargraph;
} /* fin de GetBarGraph */
?>
Conclusion
Adapter le minimum (créer la fonction connect_db() de connection à votre dB), Insérer un lien vers la page "page_115.php" dans votre site et le tour est joué.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
sondage en php mysql [ par ghodhban ]
salut tout le monde; j'ai un problème au niveau de compilation d'un code sondage AJAX POLL, mais j'ai rencontré erreurs ( ligne 23), svp quelqu'un m'
Php ou javascript ???????? gros pb [ par elisabeth_nov ]
Bonjour, voilà je débute depuis un moment déjà mais j'ai toujours autant de difficultés!!!!Mon problème à l'heure actuelle est que je dois créer une p
probleme de tchat php [ par linkinpar236737 ]
j'ai un probleme de tchat dans mon site, j'ai acheté un flashchat, utilisant le php, et quand j'essaye de l'installer, il faut mettre : Database Name,
sondage php mysql [ par yassine56 ]
bonjour, je travail sur un projet " sondage" le but est de créer une apllication qui permet de faire le sondage.j'aimerai quelqu'un m'aider pour créer
Gros probleme avec php [ par nico20011caus ]
Bonjour,J'ai un gros problème avec la programation en php.mon but est d'afficher juste une enregistrement je m'explique.quand je tape http://nico20011
demande aide pour php/mysql [ par frostfire ]
Bonjour ,Voila je voudrais de l'aide pour complété un code php/mysql que je n'arrive pas a finir ^^ demande aide de toute urgence XDVoila merci d'avan
Question MySQL / PHP [ par sbool ]
Bonsoir;Je créér en ce moment un site de jeux avec acces membre.J'ai une table avec id (auto increment) login pas mail ...J'espère pouvoir réaliser un
variable [ par cobra176 ]
j'ai un soucis pour une variable bien précisema requete est bonne mais mon code php me fait des misiére $connect=mysql_connect("127.0.0.1", "root",
Tableau Mysql en php [ par rems02 ]
Bonjour,Je m'adresse à vous car j'ai besoins d'un avis des expert:j'ai une table mysql de typeid | photo | lien_photoet je voudrais afficher toutes le
Procedure pti projet en PHP &MySQL [ par FredDeBrux ]
<span style="FONT-SIZE: 12pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-fon
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|