Sondage - vote - poll (avec mysql)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 437 fois - Téléchargée 16 fois

Contenu du snippet

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 / Exemple :

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é.

A voir également

Ajouter un commentaire Commentaires
Messages postés
60
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
3 janvier 2011

Merci, commences peut-être avec une seule main ;-) et bon courage. (j'avoue que je suis passé à autre chose depuis)
Messages postés
37
Date d'inscription
samedi 16 septembre 2006
Statut
Membre
Dernière intervention
5 juillet 2012

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 !
Messages postés
60
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
3 janvier 2011

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).
Messages postés
37
Date d'inscription
samedi 16 septembre 2006
Statut
Membre
Dernière intervention
5 juillet 2012

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 ?
Messages postés
37
Date d'inscription
samedi 16 septembre 2006
Statut
Membre
Dernière intervention
5 juillet 2012

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!
Afficher les 28 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.