SONDAGE - VOTE - POLL (AVEC MYSQL)

hornet_bzz Messages postés 17 Date d'inscription samedi 16 décembre 2006 Statut Membre Dernière intervention 26 décembre 2009 - 26 déc. 2009 à 03:38
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011 - 28 févr. 2010 à 02:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51017-sondage-vote-poll-avec-mysql

cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
28 févr. 2010 à 02:02
Merci, commences peut-être avec une seule main ;-) et bon courage. (j'avoue que je suis passé à autre chose depuis)
cs_harmonyk Messages postés 37 Date d'inscription samedi 16 septembre 2006 Statut Membre Dernière intervention 5 juillet 2012
28 févr. 2010 à 01:29
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 !
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
28 févr. 2010 à 00:07
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).
cs_harmonyk Messages postés 37 Date d'inscription samedi 16 septembre 2006 Statut Membre Dernière intervention 5 juillet 2012
27 févr. 2010 à 22:46
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 ?
cs_harmonyk Messages postés 37 Date d'inscription samedi 16 septembre 2006 Statut Membre Dernière intervention 5 juillet 2012
27 févr. 2010 à 22:06
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!
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
11 janv. 2010 à 13:05
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.
ccn74 Messages postés 12 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 10 janvier 2010
11 janv. 2010 à 12:40
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+
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
11 janv. 2010 à 06:43
Super ! il ne te reste plus qu'à mettre une note ;-)
ccn74 Messages postés 12 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 10 janvier 2010
10 janv. 2010 à 17:27
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.
ccn74 Messages postés 12 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 10 janvier 2010
4 janv. 2010 à 23:36
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.
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
4 janv. 2010 à 23:14
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
ccn74 Messages postés 12 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 10 janvier 2010
4 janv. 2010 à 22:46
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
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
4 janv. 2010 à 05:59
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.
ccn74 Messages postés 12 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 10 janvier 2010
3 janv. 2010 à 23:43
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
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
3 janv. 2010 à 21:55
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)
ccn74 Messages postés 12 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 10 janvier 2010
3 janv. 2010 à 20:54
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
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
3 janv. 2010 à 18:08
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+
ccn74 Messages postés 12 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 10 janvier 2010
3 janv. 2010 à 17:22
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
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
3 janv. 2010 à 14:21
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".
ccn74 Messages postés 12 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 10 janvier 2010
3 janv. 2010 à 14:00
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
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
3 janv. 2010 à 00:31
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");
}
}
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
29 déc. 2009 à 23:32
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.
cs_cocobongo Messages postés 4 Date d'inscription vendredi 6 octobre 2006 Statut Membre Dernière intervention 29 décembre 2009
29 déc. 2009 à 18:25
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
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
28 déc. 2009 à 19:33
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.
cs_cocobongo Messages postés 4 Date d'inscription vendredi 6 octobre 2006 Statut Membre Dernière intervention 29 décembre 2009
28 déc. 2009 à 19:19
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
hornet_bzz Messages postés 17 Date d'inscription samedi 16 décembre 2006 Statut Membre Dernière intervention 26 décembre 2009
26 déc. 2009 à 04:09
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 '
---- 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 '
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 '
'.mysql_error();}
return false;
}
}

function rse($var) {
return mysql_real_escape_string($var);
}
hornet_bzz Messages postés 17 Date d'inscription samedi 16 décembre 2006 Statut Membre Dernière intervention 26 décembre 2009
26 déc. 2009 à 04:00
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
hornet_bzz Messages postés 17 Date d'inscription samedi 16 décembre 2006 Statut Membre Dernière intervention 26 décembre 2009
26 déc. 2009 à 03:38
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;
}
Rejoignez-nous