begin process at 2012 05 27 20:24:36
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > SONDAGE - VOTE - POLL (AVEC MYSQL)

SONDAGE - VOTE - POLL (AVEC MYSQL)


 Information sur la source

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseau & Internet Classé sous :sondage, database, php, mysql, poll Niveau :Débutant Date de création :26/12/2009 Vu :5 110

Auteur : hornet_bzz

Ecrire un message privé
Commentaire sur cette source (28)
Ajouter un commentaire et/ou une note

 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">&nbsp; => 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('&nbsp;',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('&nbsp;', 55);
  • echo '<input type="submit" name="reset" value="RESET" />'. str_repeat('&nbsp;', 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">&nbsp; => 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('&nbsp;',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('&nbsp;', 55);
		echo '<input type="submit" name="reset" value="RESET" />'. str_repeat('&nbsp;', 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

INSPECTEUR DE PAGES (VÉRIFIEZ SI DES SITES AFFICHENT UN TEXT... par pablo836
Source avec Zip Source avec une capture GÉOLOCALISATION par pgl10
Source avec Zip TAPI : METTRE EN RELATION DEUX POSTES TELEPHONIQUES par ravery
Source avec Zip CLIENT / SERVEUR : LES SOCKETS par Morphinof
Source avec Zip VALIDATEUR_3WC par lezj

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture EL COYOTOS LIVRE D'OR PHP 5 par elcoyotos
Source avec Zip CLASS MYSQL 5/PHP5 AVEC GESTION DES EXCEPTION ET DES REQUÊTE... par devil_may_cry
Source avec Zip Source avec une capture PAGINATION JAVASCRIPT PHP MYSQL par cod57
Source avec Zip Source avec une capture GESTION DE SCOLARITÉ [PHP] ET [MYSQL] par ayoubshadow
CLASSE DATABASE POUR CONNECTION ET MODIFICATION D'UNE BDD MY... par franco_se

Commentaires et avis

Commentaire de hornet_bzz le 26/12/2009 03:38:26

Pour faire simple et éviter les adaptations multiples, je vous suggère de créer un fichier "/root_de_votre_site/lib/functions_db.php" qui contienne la fonction de connexion à votre base de données (appelée connect_db() dans les 3 scripts)

Par exemple :

function connect_db($admin=false) {
$serv = $param['serveur']; // à remplacer par vos propres paramètres bien sûr
$log = $param['log'];
$pwd = $param['pwd'];
$db     = $param['db'];

mysql_connect($serv,$log,$pwd) or die("erreur de connexion au serveur");
$connexion=mysql_select_db($db) or die("erreur de connexion à la db");
return $connexion;
}

Commentaire de hornet_bzz le 26/12/2009 04:00:28

J'ai omis un léger détail: il faut créer au préalable vos 3 tables dans votre base de données MySql avec la structure suivante :

Table "sondage_list":
Field Type Null Key Default Extra
sondage_id tinyint(4) NO PRI NULL auto_increment
sondage_theme text         NO    NULL
sondage_actif tinyint(1) NO    1

Table "sondage_question":
Field Type Null Key Default Extra
id_sondage tinyint(4) NO    NULL
id_question tinyint(4) NO PRI NULL auto_increment
text_question text         NO    NULL
digit_reponse tinyint(4) NO    NULL

La table "sondage_results"
Field Type Null Key Default Extra
id_question tinyint(4) NO    NULL
IP_vote varchar(15) NO    NULL
resultat_vote tinyint(4) NO    NULL

Commentaire de hornet_bzz le 26/12/2009 04:09:46

Re oops. A la relecture, je vois qu'il va aussi vous manquer les fonctions "dB_ArrayToDB" et "rse", qu'il faut que vous copiez/collez dans le fichier "/root_de_votre_site/lib/functions_db.php" :

function dB_ArrayToDB($table, $champs_exclus = '', $array_assoc, $sql_type = 'insert', $sql_condition = NULL, $debug=false) { // INSERT or UPDATE $array into dB
// source : http://fr.php.net/manual/fr/function.mysql-query.php#84962

  // assume that dB already connected

  // define some vars
  $fields = '';
  $values = '';

  // format input fields into sql (explode du tableau associatif en requete SQL)
  foreach ($array_assoc as $field => $value) {
  
if (!strstr($champs_exclus, $field)) {

  $value = rse($value);

if ($debug) {
echo '<br/> ---- dB_ArrayToDB : Field= '.$field.'('.gettype($field).') Value= '.$value.'('.gettype($value).')';
}
// construction de la sql pour INSERT // TESTEE avec les fonctions xhr_create_master.php
  if ($sql_type == 'insert') {
$fields .= "$field, ";
$values .= "'$value', ";
  }
  else {
  // construction de la sql pour UPDATE // TESTEE avec le formulaire de gestion de compte (page 865)
if (!is_numeric($value)) {
$fields .= "$field = '$value', "; // string
}
else {
// exceptions: pour le num de tel qui commence par un zero et peut ainsi être assimilé à un numeric, ce qui n'est pas le cas ds la dB
if ($field != 'telephone' ) {
$fields .= "$field = $value, "; // numeric
}
else {
$fields .= "$field = '$value', ";// si tel => string
}
}
  }
}
  }

  // remove trailing ", " from $fields and $values
  $fields = preg_replace('/, $/', '', $fields);
  $values = preg_replace('/, $/', '', $values);

  // create sql statement
  if ($sql_type == 'insert') {
    $sql = "INSERT INTO $table ($fields) VALUES ($values)";
  }
  elseif ($sql_type == 'update') {
    if (!isset($sql_condition)) {
      echo 'ERROR: You must enter a sql condition!';
      exit;
    }
    $sql = "UPDATE $table SET $fields WHERE $sql_condition";
if ($debug) { echo '<br/>Requete SQL: '.$sql;}
  }
  else {
    echo 'ERROR: Invalid input for argument $sql_type: must be "insert" or "update"';
    exit;
  }

  // execute sql
  if (mysql_query($sql)) {
    return true;
  }
  else {
    if ($debug) {echo '<br/>'.mysql_error();}
    return false;
  }
}

function rse($var) {
return mysql_real_escape_string($var);
}

Commentaire de cocobongo le 28/12/2009 19:19:01

Bonjour,

je viens de tester ton code, mais il ne fonctionne pas (chez moi du reste...) :-(


Question :
Dans : script_crea_sondages.php => 4- SAUVEGARDE dB => "$retour = mysql_query(sprintf($requete, rse($table_sondage) ) );" (ligne n° 60 de ton code)

Qu'es-ce que "rse" et à quoi sert-il dans la requête ?
Es-ce une constante ou une var avec un oublie de $ ?

Merci de m'éclairer

Christian

Commentaire de hornetbzz le 28/12/2009 19:33:28

Salut

Ce n'est pas une erreur, "rse" est une fonction simple (en fait c'est juste un my_real_string_escape que j'utilise souvent, d'où la petite fonction rse) que tu dois inclure dans "/root_de_votre_site/lib/functions_db.php" comme précisé a posteriori (désolé) :

Re oops. A la relecture, je vois qu'il va aussi vous manquer les fonctions "dB_ArrayToDB" et "rse", qu'il faut que vous copiez/collez dans le fichier "/root_de_votre_site/lib/functions_db.php" : ...

Idem pour la fonction "dB_ArrayToDB".

Fais moi savoir si tu as toujours un problème.

Commentaire de cocobongo le 29/12/2009 18:25:51

Re bonjour,

J'avais effectivement copié les fonctions manquantes et "function rse($var){..." est bien présentye dans le script.

J'ai corrigé les lignes 59 et 62 de ton code car tu fais référence à "existing_themes" qui n'est pas présent dans les tables.
Je l'ai donc remplacé par "sondage_theme" qui elle est dans la table "sondage_list".

Description du bug :
A la création d'un sondage j'ai ce message d'erreur "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ..../DEV/Php/Sondage/Appli/script_crea_sondages.php on line 68
erreur sql sur sondage_list"

" on line 68 " correspond à la ligne 61 de ton code : "$resultat = mysql_fetch_array( $retour );". Donc mysql ne renvoi rien...
Par contre l'enregistrement du sondage et de la question se fait bien dans mysql. (vérif via PhpMyAdmin)

Autre question : Il n'y a pas d'index ni de champ auto-incréméntable dans la table "sondage_results". Es-ce normal ?

Merci

Christian

Commentaire de hornetbzz le 29/12/2009 23:32:53

Hum, oui en fait je crois que l'erreur produite dépend en fait de ta version MYSQL. Je n'ai pas cette erreur avec MySQL 5.0.45. Dans les lignes en question, "existing_themes" est un alias, c'est donc normal qu'il ne soit pas existant comme un champs dans les tables. Mais c'est vrai aussi que cela peut être sujet à confusion: voir http://dev.mysql.com/doc/refman/5.0/en/select.html

En même temps, tu as peut-être lancé le script sans les @ devant les commandes et/ou avec un error_reporting(E_ALL) dans ton php.ini, or à la première exécution, il n'y a pas de valeur retournée, d'où cette erreur je pense. Mais tu as raison, il faudrait la traiter autrement.

Oui pour les "sondages_results", c'est volontaire car je ne voyais pas l'utilité de l'indexage pour cette table. Et il n'y a pas besoin non plus de d'AutoIncrement.

Commentaire de hornetbzz le 03/01/2010 00:31:49

Une petite remarque sur la Ligne 463 :
echo '<form method="post" action="index.php?page=115">';

=> Pensez à changer cette ligne pour :
echo '<form method="post" action="/la_directory_de_la_page_115/page_115.php">';

ou bien,

=> en conservant la ligne 463 telle quelle, pensez à insérer dans votre index.php :
if (isset($_GET['page'])) {
$page=htmlspecialchars($_GET['page']);
if ($page=115) {
  include ("/directory_de_la_page_115/page_115.php");
}
}

Commentaire de ccn74 le 03/01/2010 14:00:16

Bonjour et en tout premier "Bonne année" à tous les membres du forum

Nouveau en PHP et fortement interesé pas ce script de gestion de songage j'ai installé et découpé votre modele pour le tester chez moi
je ne comprend pas comment sont initialisées les variables $my_connexion et $admin de la ligne 49 :
$my_connexion = (!isset($my_connexion))? connect_db($admin=false) : $my_connexion ;

celle-ci provoque "chez moi" l'erreur suivante
Fatal error: Call to undefined function connect_db() in ........\Sondage\script_crea_sondages.php on line 49

Merci de votre réponse

Commentaire de hornetbzz le 03/01/2010 14:21:50

Bonjour et meilleurs voeux également,

Je pense que tu veux parler de la ligne 53 (et non 49): L'erreur générée chez toi montre que soit :
- tu n'as pas ajouté la fonction connect_db() à la page des fonctions "functions_db.php",
- ou voir mon commentaire "Re oops": il faut copier/coller dans le fichier "/root_de_votre_site/lib/functions_db.php" : ... voir la suite du commentaire ...
- ou bien si tu as réalisé les 2 points précédents, tu peux avoir à adapter le chemin du "require_once" de la ligne 13, mais je te conseille plutôt de suivre les indications de directory que j'ai mis, ça t'évitera d'avoir à ré-adapter d'autres chemins (path) dans les "include" et autres "require_once".

Commentaire de ccn74 le 03/01/2010 17:22:19

Merci  hornetbzz
effectivement je n'avait pas crée la foction connect_db()
maibtenant c'est OK je peux creer mon sondage.

comme tout blaireau qui se respect un Merci engendre une nouvelle
quetion...
quand je lamce la page 115 (comme indique dans le script) la page retournée me donne une liste de Debug mais pas les questions que je voudrai voir
de plus mais cela est peut-être normal aucun affichage de réponse. Uniquement des lignes d'erreur du type :
Warning: imagepng() [function.imagepng]: Unable to open 'images/survey_title_fond.png' for writing: No such file or directory in .......\Sondage\lib\fonctions_survey.php on line 538
ou cela vient-il de la bib "php_gd+ qui n'existe pas j'ai seulement la "php_gd2"

encore merci de prendre du temps pour un débutant
PS vu mon niveau PHP je ne me permet pas de mettre une note à ton script même si pour moi cela ne peut correspondre qu'a un 10




Commentaire de hornetbzz le 03/01/2010 18:08:47

Bon il semble quand même que ça progresse :-)

Pour la liste de "debug", il suffit de remplacer tous les "!DEBUG" passés en paramètres dan sla page_115.php par des "DEBUG" (sans la négation)

La librairie php_gd2, c'est bon. A priori d'après ce que tu décrit, elle est activée (cochée). Si c'est bien le cas, il faut que tu mettes une directory valable (existante) dans la ligne 777 (du code ci-dessus)

Dans la ligne 777: "$file_img= 'images/survey_bar_'. $indice_img ;"

=> remplacer 'images/survey_bar_' par une directory existante sur ton site.

A+

Commentaire de ccn74 le 03/01/2010 20:54:08

j'ai fais ce que tu m'as dis et OK pour la php_gd2
... plus message ... blaireau heureux !!!!

donc ... encore merci ... donc .... encore question(s)
aurai-je eu les yeux beaucoup trop gros ?

Toujours idem pour l'affichage des questions. voila ce que j'affiche :
DEBUG GetActiveSurveyQuestion .. :
id du sondage actif .............: 1000
theme du sondage actif ..........:
Questions du sondage actif:
Array
(
    [0] =>
)

si j'ai bien compris à 1000 on change de theme
mais je n'ai enregistré qu'un seul theme de 3 questions pour le moment cette règle ne devrait donc pas s'appliquer. et pourquoi n'y at-til pas de valeur pour le thème ?
la variable $my_connexion est bien à "True" donc mes tables sont bien visible.

je ne connais pas la syntaxe SQL utilisée :
"SELECT sondage_actif FROM %s WHERE sondage_id = '%d' LIMIT 1"
Comment s'interprètent les %s et %d ?

Je te promet, l'année prochaine, le pere Noèl sera obligatoirement généreux avec toi ...
Bonne soirée


Commentaire de hornetbzz le 03/01/2010 21:55:17

Euh.. Non, 1000 est seulement une limitation du nombre de thèmes que l'on peut insérer dans la dB.

Si le "DEBUG" ne te sort rien alors que la connexion est établie, ... c'est qu'il n'y a rien dans la dB. Penses à créer les tables au préalable à l'exécution des scripts. Regardes mon post du 26/12/2009 04:00:28. ça se fait manuellement sur ton interface (par exemple l'interface web phpMySQL si tu utilises MySQL).

Pour comprendre la syntaxe des requêtes SQL, c'est plutôt la syntaxe de sprintf qu'il te faut regarder. Vois les informations à la source : http://fr.php.net/manual/fr/function.sprintf.php (Mais attention, il n'y a rien à modifier dans les requêtes)

Commentaire de ccn74 le 03/01/2010 23:43:12

C'est reparti
Les tables sont bien créées comme indiqué dans les divers Posts et elle fonctionnent parfaitement pour la création. 1 theme et 3 question pourc theme.

ce qui ne fonctionne pas... chez moi (enfin dans le script) c'est que après insersion de lignes d'"Echo" jne comprend pas les résultats que voici :

$resultat[sondage_id]= :1        (echo ajouté entre ligne 284 et 285)
$smallest_id ........ = :1000    (echo ajouté ligne 288)
$question_id ........ = :        (echo ajouté ligne 295)
$count_vote ........ = :0        (echo ajouté ligne 302)

- pour la ligne 295 cela me semble logique puisque l'"id sondage" de la ligne 288 est à 1000 donc inconu dans mes tables.
- pour la ligne 302 logique puisque pas encore de vote enregistré.
- mais pourquoi la variable $smallest_id est à 1000 puisqu'il existe un $resultat[sondage_id] à 1. Cette valeur 1000 est créée dans la partie Init mais devrait être modifiée en ligne 285 ? Non ?

peux-tu réallumer ta lampe torche pour moi une fois encore.
Merci

Commentaire de hornetbzz le 04/01/2010 05:59:54

Non, il n'y a rien à changer. Pour comprendre, il faut que tu regardes la fonction "GetActiveSurveyID", où $smallest_id est utilisé comme une valeur de départ. Son nom n'est effectivement peut-être pas judicieux.

Commentaire de ccn74 le 04/01/2010 22:46:37

Bonsoir
Désolé de n'avoir répondu + vite mais pas eu le temp ce jour de tester.
mais c'est bon maintenant

j'ai bien compris le la valeur de $smallest_id à 1000.

Ce que je ne comprend pas c'est que si à la ligne 288 du script ci-dessus je force $smallest_id en mettant $smallest_id = 1; tout semble rentrer dans l'ordre et le debug m'affiche bien la valeur pour le theme, les 3 questions que j'ai enregistrées et j'ai bien l'affichage des boutons radio pour chacunes de mes questions.

je ne vois pas ou ça peche et pourquoi la ligne 285
$smallest_id = ($resultat['sondage_id'] < $smallest_id && $resultat['sondage_id'] > $current_id) ? $resultat['sondage_id'] : $smallest_id ; ne me retourne pas la valeur 1 qui devrait être l'ID de mon seul theme enregistré.

As-tu une explication à mon problème ?
Merci



Commentaire de hornetbzz le 04/01/2010 23:14:41

Je crois que tu parles de :

# 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 ;
#    }
# }

C'est un tri par bulle (Google est ton ami) :
- je balaye les valeurs recueilles de la dB au travers de la boucle 'while' sur $resultat
- si il y a bien une valeur d'id sondage dans $resultat['sondage_id'] alors :

- on mémorise l'id trouvé le plus petit grâce à l'opérateur ternaire. A ton air dubitatif, je te sens confusé là ;-) . Alors qu'est ce qu'il veut dire cet opérateur ternaire :

$smallest_id = ($resultat['sondage_id'] < $smallest_id && $resultat['sondage_id'] > $current_id) ? $resultat['sondage_id'] : $smallest_id ;

On pourrait schématiser ça sous la forme :
$VALEUR = ($TEST VRAI)? $si_oui_NOUVELLE_VALEUR : $si_non_MEME_VALEUR ;

d'abord la première partie :
($resultat['sondage_id'] < $smallest_id && $resultat['sondage_id'] > $current_id) ?

c'est un test qui renvoie 'vrai' si l'id de la dB que l'on est en train de balayer est plus grand que l'id courant $current_id et plus petit que le plus petit id trouvé $smallest_id.

Si ce test est vrai (si ces conditions sont remplies, le test renvoie TRUE), alors on change la valeur de $smallest_id  pour lui mettre la valeur trouvée dans la dB, c'est à dire $resultat['sondage_id'].

Sinon (si le test renvoie FALSE), on ne change pas la valeur de $smallest_id.

Et ainsi de suite jusqu'à ce que l'on ait fini de balayer le tableau contenant les id de la dB.

Je te laisse chercher plus  d'explications chez ton meilleur ami, car je ne peux pas non plus rédiger un tuto en ligne.

Penses bien à regarder la doc : http://fr.php.net/manual/fr/language.operators.comparison.php

99% des réponses à tes questions sont là. Le 1% restant est en général entre le clavier et ton PC ;-)

Bon courage





Commentaire de ccn74 le 04/01/2010 23:36:35

Hello

merci de tout ce temp passé.
J'avais compris le sens de la comparaison mais pas son résultat.

je vais mettre en echo toutes les variables de cette partie du code et je verrai bien ou ça peche puisque n'ayant qu'un seul enregistrement dans ma table cela ne devrait pas prendre trop de temp.

Encore mille remerciements pout toutes tes réponses.


Commentaire de ccn74 le 10/01/2010 17:27:09

hello

Ce petit message pour te dire que tout fonctionne il fallait juste qu'il existe au moins 2 enregistrements dans la table liste des sondages. ler premier étant tout simplement ignoré. mystère !

Voila encore merci pour ton aide.

Commentaire de hornetbzz le 11/01/2010 06:43:41

Super ! il ne te reste plus qu'à mettre une note ;-)

Commentaire de ccn74 le 11/01/2010 12:40:42 10/10

10
mais -0.5 virtuel pour ne pas m'avoir dit que le 1er enregistrement n'était pas pris en compte ce qui nous aurait probablemnt évité les 9 derniers échanges

merci encore
A+

Commentaire de hornetbzz le 11/01/2010 13:05:51

Yep, désolé, ce n'était pas volontaire. Mais bon, il faut voir le côté positif:  ça t'aura aussi permis de rentrer dans le code sans juste faire un copier/coller. Ce que tu as très bien fait !

Donc merci à toi.

Commentaire de harmonyk le 27/02/2010 22:06:20

Bonjour,
tout d'abord merci pour cette source plutot bien expliquée au fur et à mesure du script.
Etant débutant avec le mysql, je n'arrive pas à créer les tables correctement, surtout la 1ère, sondage_id.
Impossible de la passer en NULL...
De meme je ne comprend pas à quoi correspondent les "NO" ...
Merci d'avance pour ces quelques précisions!

Commentaire de harmonyk le 27/02/2010 22:46:16

Ok désolé pour ces précédentes questions un peu idiotes, je m'en suis sorti avec la doc'...
Par contre j'en ai une autre :
Comment faire pour diriger le visiteur vers tous les sondages, jusqu'à ce qu'il n'y en ai plus, avant de lui afficher le message de remerciement ?

Commentaire de hornetbzz le 28/02/2010 00:07:51

Bonjour,

Si j'ai bien compris la question, ce n'est pas l'esprit original du script, puisqu'un seul sondage est actif à la fois, et justement, c'est l'intérêt. En effet, il n'y a rien d'autre à faire pour le webmaster que de créer des sondages. Le script active tout seul le sondage suivant une fois que l'on estime disposer de suffisamment de votes pour qu'ils soient significatifs.

Ceci dit, le code est relativement modulaire pour du procédural et il te suffit de le refondre à ta convenance (voir les lignes 216 à 244 mais il faut plonger les mains dedans).

Commentaire de harmonyk le 28/02/2010 01:29:32 9/10

Merci pour la réponse ;)
Plonger les mains dedans, je pense que ca va me plaire =)
Merci pour l'indication des lignes, ca va m'éviter de chercher pas mal de temps.
Je mets un 9/10, parce que j'ai un peu pataugé au niveau de l'arborescence des fichiers, et pour les tables...
Sinon ca marche du tonnerre !

Commentaire de hornetbzz le 28/02/2010 02:02:52

Merci, commences peut-être avec une seule main ;-)  et bon courage. (j'avoue que je suis passé à autre chose depuis)

 Ajouter un commentaire


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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales