[Pb] Afficher les résultats de sondages

Afficher les résultats de sondages [Pb] - PHP - Programmation

Marsh Posté le 23-10-2007 à 15:57:44    

Salut à tous,
 
Après avoir pas mal cherché les problèmes dans mon code, je me suis finalement rendu compte qu'en plus d'être bourré de fautes, il ne marchait même pas. Et je dois avouer que je vois pas d'autre solution que de vous demander humblement votre très profitable aide :)
 
Bon, trêve de palabres, il s'agit d'une page de mon site où je souhaite afficher les résultats du sondage en cours, ainsi que de tous les sondages créés auparavant. Le système de membres est fonctionnel, pas de soucis sur ce point-là. V'là le code :
 

Code :
  1. <div style="background-color: white">
  2. <?php
  3. mysql_connect("localhost", "root" );
  4. mysql_select_db("test" );
  5. if(!isset($_GET['action']) )
  6. {
  7. $result = mysql_query('SELECT * FROM sondage_vote WHERE id_sondage="'.$_GET['id_sondage'].'" ');
  8. $donnees = mysql_fetch_array($result);
  9. echo '<ul><li><h4>Sondage</h4></li></ul>';
  10. if ($donnees['pseudo'] != $_SESSION['login'])
  11. {
  12. mysql_query ('UPDATE sondage_reponses SET nb_reponses = nb_reponses + 1 WHERE id_sondage="'.$_POST['question'].'" AND id="'.$_POST['choix'].'" ');
  13. mysql_query("INSERT INTO sondage_vote VALUES ('', '" .$_POST['question']. "', '" .$_POST['choix']. "', '" . $_SESSION['login'] . "') " );
  14. echo '<center>Merci d\'avoir voté !<br><a href="vote.php?action=voir">Voir les résultats</a></center>';
  15. }
  16. else
  17. {
  18. echo '<center>Gomen ! Vous avez déjà donné votre avis !<br><a href="vote.php?action=voir">Voir les résultats</a></center>';
  19. }
  20. }
  21. if ($_GET['action'] == 'voir')
  22. {
  23. $reponse = mysql_query('SELECT * FROM sondage ORDER BY id DESC'); 
  24. $donnees = mysql_fetch_array($result);
  25. $nb_sondages = count($donnees['id']);
  26. $tableau_reponses = array();
  27. $tableau_nb_reponses = array();
  28. while ($data = mysql_fetch_array($reponse))
  29. {
  30. echo '<ul><li><h4>' .stripslashes(htmlentities(trim($data['question']))). '</h4></li></ul>';
  31. echo ''.stripslashes(htmlentities(trim($data['id']))).'';
  32. $result = mysql_query('SELECT * FROM sondage_reponses WHERE id_sondage="'.stripslashes(htmlentities(trim($data['id']))).'" ');
  33. while ($datas = mysql_fetch_array($result))
  34. {
  35. $tableau_reponses[] = stripslashes(htmlentities(trim($datas['reponse'])));
  36. $tableau_nb_reponses[] = stripslashes(htmlentities(trim($datas['nb_reponses'])));
  37. }
  38. $nb_reponses_du_sondage = count ($tableau_reponses);
  39. $nb_total_reponse = array_sum ($tableau_nb_reponses);
  40. if ($nb_total_reponse == 0)
  41. {
  42. echo '<center>Il n\'y a aucun vote pour ce sondage.</center>';
  43. }
  44. else
  45. {
  46. echo '<ul style="margin-left: -25px">';
  47. for ($i = 0; $i < $nb_reponses_du_sondage; $i++)
  48. {
  49. echo '<li>'.$tableau_reponses[$i].'</li>';
  50. $pourcentage = ($tableau_nb_reponses[$i] * 100) / $nb_total_reponse;
  51. $pourcentage = round ($pourcentage, 1);
  52. echo '<img src="screen/bar.gif" height="10" width='.round($pourcentage, 1).'>&nbsp;<i>'.$pourcentage.' % (' .$tableau_nb_reponses[$i]. ')</i><br />';
  53. }
  54. echo '</ul><center><br />Nombre de votes : '. $nb_total_reponse . '</center><br>';
  55. }
  56. } // Fin du premier while
  57. }
  58. mysql_close ();
  59. ?>
  60. </div>


 
Y'a 2 gros soucis dedans :
 

  • Le premier, de loin le plus chiant, est que l'affichage foire dans la séparation des différentes réponses des différents sondages. Je m'explique.


J'ai créé 3 sondages bidons, comportant 3 réponses chacun. Dans l'affichage, j'aurai le 1er sondage (le plus récent, celui en cours), ses 3 réponses ainsi que le compte des votes, tout bien tout propre.
Le soucis est que lors de l'affichage du 2e sondage, j'aurai les 3 réponses de ce sondage ainsi que celles du 1er sondage. Et bien sûr, lors du calcul des pourcentages et du nombre total de vote, il prend en compte les résultats du 1er sondage.
Et re-belote avec le 3e sondage, qui comptabilise aussi les 2 premiers sondages et affiche leurs réponses avant d'afficher les réponses propres à ce sondage.
 
J'espère avoir été assez clair... Je me doute qu'il s'agit d'un problème dans le placement des while, mais je ne vois vraiment pas comment y remédier...
 

  • Le second est sans doute très con, mais je bloque : il refuse de prendre en compte la condition de la ligne 17. En clair, peu importe que le pseudo soit inscrit dans la table sondage_vote, si je rafraichis la page indéfiniment avec le même pseudo, le sondage prend en compte le vote. Mouais...


Ici c'est pareil, je bloque. C'est sans doute tout con, mais...
 
Je m'en remets corps et âme à votre science, en espérant que vous saurez m'aider... merci d'avance  :jap:


Message édité par Brendeldas le 23-10-2007 à 15:58:49
Reply

Marsh Posté le 23-10-2007 à 15:57:44   

Reply

Marsh Posté le 23-10-2007 à 17:08:43    

tu pourrai créer une petit fonction qui liste les résultats d'un sondage en fonction de l'id de ce dernier passé en paramètre, et lors du chargement de ta page, tu fait juste un select * de tous les sondages, et tu appel ta fonction avec l'id du sondage en question dans le while mysql_fetch_array :)  
 
je verrais ça, comme ça réutilisable un peu partout, et un code propre si tu te débrouille pas trop mal :)  
 
C'est juste une sugestion en attendant de regarder ton code plus attentivement.

Reply

Marsh Posté le 23-10-2007 à 21:53:25    

J'ai réglé mon second problème avec l'ajout de deux petites lignes de code avant la validation du vote :
 

Code :
  1. $reponse = mysql_query('SELECT * FROM sondage_vote ORDER BY ID DESC LIMIT 0,1');
  2. $last_post = mysql_fetch_array($reponse);
  3. echo '<ul><li><h4>Sondage</h4></li></ul>';
  4. if ($donnees['pseudo'] != $_SESSION['login'] AND $last_post['pseudo'] != $_SESSION['login'])


 
Par contre, j'ai pas bien compris ce que tu suggères, micfont999. Il me semble que les résultats du sondage sont déjà listés par id, et le problème est qu'il ne prend justement pas en compte cette restriction, et prend les résultats de toute id supérieure ou égale à celle indiquée.

Reply

Marsh Posté le 25-10-2007 à 19:41:16    

Problème résolu : en fait, il suffisait de mettre les 2 lignes créant les array des 2 tableaux dans le premier while, et non pas en-dehors, au début du code...  
 
En code, ça donne ça :
 

Code :
  1. if ($_GET['action'] == 'voir')
  2. {
  3. $reponse = mysql_query('SELECT * FROM sondage ORDER BY id DESC'); 
  4. $donnees = mysql_fetch_array($result);
  5. $nb_sondages = count($donnees['id']);
  6. while ($data = mysql_fetch_array($reponse))
  7. {
  8. echo '<ul><li><h4>' .stripslashes(htmlentities(trim($data['question']))). '</h4></li></ul>';
  9. $tableau_reponses = array();
  10. $tableau_nb_reponses = array();
  11. $result = mysql_query('SELECT * FROM sondage_reponses WHERE id_sondage =\'' . stripslashes(htmlentities(trim($data['id']))) . '\' ');


 
 
Et là, tout marche nickel... 'Tain, j'ai presque honte d'avoir bloqué sur un truc aussi con...
 
Merci pour votre aide :)

Reply

Marsh Posté le 26-10-2007 à 08:49:25    

moi je dirais presque qu'il y a 2 soucis en plus ...
- code non commenté, on joue aux devinettes pour savoir ce que tu fais
(par exemple, # $result = mysql_query('SELECT * FROM sondage_vote WHERE id_sondage="'.$_GET['id_sondage'].'" ');
# $donnees = mysql_fetch_array($result); si on ne lit pas la requête SQL et on ne s'imagine pas ce qu'elle rapporte, on ne sait pas à quoi correspond $result ... OK, à un résultat, mais de quoi ? En vue de quoi ?
 
- code non indenté : toutes les accolades sont alignées verticalement, ce qui rend difficile, en cas de parse error, la découverte de l'accolade non fermée p.ex. C'est p-ê du au code du forum, auquel cas ne tiens pas compte de cette remarque.


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 26-10-2007 à 08:53:29    

NewsletTux a écrit :


- code non indenté : toutes les accolades sont alignées verticalement, ce qui rend difficile, en cas de parse error, la découverte de l'accolade non fermée p.ex. C'est p-ê du au code du forum, auquel cas ne tiens pas compte de cette remarque.


 
Oui c'est la merde à faire des indentations, la touche tab ne marche pas il faut utiliser la barre d'espace c'est assez désagréable il faut admettre..
Pour les accolades non fermées je pense qu'il n'a pas mis tout le code, sinon son code renverrais forcement une erreur .. :)  
 :whistle:  
En tout cas chez moi quand je ferme pas un if ou un while l'est pas content mon petit wamp ...  
 [:magnasuprema]
 
Edit : par contre j'ai pour habitude à la fin de mes if, while et autre de mettre après l'accolade } un petit commentaire } // fin du while machinchose
ça aide toujours quand on ce retrouve avec un code de 10 000 lignes et qu'on à une erreur d'accolade, mais qu'on en à dix qui ce ferment en même temps  :whistle:


Message édité par micfont999 le 26-10-2007 à 08:55:34
Reply

Marsh Posté le 26-10-2007 à 11:22:47    

oui, moi de même pour les fins d'accolades. Je ne dis pas que son code soit sans "parse error", je ne l'ai pas testé :) c'est simplement "au cas où", il serait plus facile à relire avec une indentation correcte.


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 26-10-2007 à 11:26:07    

NewsletTux a écrit :

oui, moi de même pour les fins d'accolades. Je ne dis pas que son code soit sans "parse error", je ne l'ai pas testé :) c'est simplement "au cas où", il serait plus facile à relire avec une indentation correcte.


 
Oui tu à tout à fait raison :)  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed