Aide sur un sondage en PHP

Résolu
yoh42 Messages postés 42 Date d'inscription lundi 1 septembre 2008 Statut Membre Dernière intervention 6 septembre 2011 - 24 mars 2009 à 15:29
yoh42 Messages postés 42 Date d'inscription lundi 1 septembre 2008 Statut Membre Dernière intervention 6 septembre 2011 - 26 mars 2009 à 09:29
Bonjour a tous.
Je dois faire un sondage avec un seule question et un affichage graphique pour les résultats.
Mon probleme est que je dois cliquer 2 fois sur le bouton "voter" pour faire afficher les resultats. Est ce que quelqu'un voit l'erreur qui produit ce probleme. Je cherche depuis quelques jours mais je ne trouve pas donc je m'adresse a vous.
Voici mon code :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<link rel="stylesheet" href="questionnaire.css" type="text/css">

<?php
include ("config.php");
$ip = $_SERVER['REMOTE_ADDR']; // récupere l'ip de visiteur.
$unix = time(); // temps actuel.
$temps = time()-3600; // le temps y'as maintenant une heure.

$sql="SELECT * FROM `sondages` WHERE `categorie`='question' AND `online`='1'";
$result=mysql_query($sql) or die (mysql_error());
while ($donnees=mysql_fetch_assoc($result)){
    $id=$donnees['id'];
    $libel=$donnees['libelle'];       
}
$sql1 = 'SELECT count(*) FROM `sondages` WHERE `categorie`="reponse" AND `id`='.$id.'';
$result1=mysql_query($sql1);
while ($donnees=mysql_fetch_assoc($result1)){
    $preado=$donnees['count (*)'];
       
}
$verifier = "SELECT `ip` FROM `vote` WHERE ip='$ip'";
$voter = mysql_query($verifier);
if(@mysql_num_rows($voter)!='0'){//Si oui, ca veut dire que notre visiteur a déja voté, on lui affiche alors un message de remerciments, et les résultats.
  echo $libel;
  $sql2 = "SELECT `reponse` FROM `vote` WHERE question='".$id."'"; //on récupere le résultat des anciens votes.
  $result2 = mysql_query($sql2);
  $reponse=array();
  while($resultat = mysql_fetch_array($result2)) {
    $cadre[] = $resultat['reponse'];  //on récupere le résultat de notre requête, et on le stocke dans un tableau.
  }
 
  //on stocke le total du vote dans une variable "$totalvote" via la méthode "count" qui parcourt tout notre tableau.
  $totalvote= count($cadre);
 
  //on stocke le nombre de chaque choix dans un tableau avec la méthode "array_count_values" .. qui retourne par exmple.
  //$array = array(1, "tyty", 1, "slt", "tyty");   array_count_values($array);    retourne array(1=>2, "tyty"=>2, "slt"=>1)
  $totalreponse = array_count_values($cadre);
   
  //pour l'affichage on utilise une petite fonction  :
  function VerifText($text,$valeur,$reponse,$totaldesreponse){
    $resultat = $reponse*2; 
      if ($text < '1'){ // on teste si le total des votes est moins qu'un, alors, on affiche l'image de la barre avec comme valeur de Width, et on met "0" comme valeur du vote
        $text1 = '
  '.$valeur.' : '.$reponse.'%
'.$reponse.'%

';
      }
      if ($text == '1'){ // on teste si le total des votes est égal a 1, alors, on affiche l'image de la barre avec comme valeur de Width, "la variable du pourcentage", et on met la "valeur du vote".
        $text1 = '
  '.$valeur.' : '.$reponse.'%
'.$reponse.'%

';
      }
      if ($text > '1'){  // on teste si le total des votes est plus grand que 1, alors, on affiche l'image de la barre avec comme valeur de Width, "la variable du pourcentage", et on met la "valeur du vote" avec une "s" a la fin cette fois. c tt
        $text1 = '
  '.$valeur.' : '.$reponse.'%
'.$reponse.'%

';
      }
    return $text1;
  }
 
 
  //Maintenant on calcule le pourcentage de nos votes selon la régle universel pour ca ^^  "p = chifre x 100 / total".
  //pour ca on utilise "bcdiv" qui divise et renvoie le résultat sous forme de chaîne de caractères.(en plus qu'on peut la fixé comme içi à 1 chiffres après la virgule). sinon on aura parfois des pourcentage genre 65.2323232323% et c'est pas beau >_<
     
//la on affiche notre function avec ces nouveaux paramètres.
  //VerifText($_variable_du_total_du_vote , 'Valeur a affiché dans notre page' , $_variable_de_notre_pourcentage , $_variable_du_total_du_vote);
 
$sql1 = 'SELECT `libelle` FROM `sondages` WHERE `categorie`="reponse" AND `id`='.$id.'';
$result1=mysql_query($sql1);
$k=1;
while ($donnees=mysql_fetch_assoc($result1)){
    $val=$donnees['libelle'];
       

  $reponse[$k] = bcdiv($totalreponse[$k]*100, $totalvote, 1);
  echo VerifText($totalreponse[$k],$val,$reponse[$k],$totalreponse[$k]);
$k++;
 
}
  echo ' Total votes : '.$totalvote.'

';
  //on répète notre function n fois nos choix avec une "." Pour la concaténation  , et une autre echo pour le total des votes.

}else{ //Si non, ça veut dire que notre visiteur n'as pas encore voté, on lui affiche le formulaire avec les choix.
    $sql="SELECT * FROM `sondages` WHERE `categorie`='question' AND `online`='1'";
    $result=mysql_query($sql) or die (mysql_error());
        while ($donnees=mysql_fetch_assoc($result)){
        echo $donnees['libelle']."

";
        $id=$donnees['id'];
        $question=$donnees['libelle'];
    }
   
    echo '<form method="POST" >';
    $sql1="SELECT * FROM `sondages` WHERE `categorie`='reponse' AND `id`='".$id."'";
    $result1=mysql_query($sql1);
    $i=1;
    while ($donnees1=mysql_fetch_assoc($result1)){
        echo '';
        echo $donnees1['libelle']."
";
        $i++;
    }

    echo '
</form>';     
     


// Enregistrement du vote dans la table si le vote est diffèrent de "0" , ce qui veux dire que le gars a validé le formulaire sans prendre un choix.

if ($_POST[choix]!=0){
    $enregistrer = "INSERT vote SET question='$id', id='', reponse='$_POST[choix]', ip='$ip', unix='$unix'";
    mysql_query ($enregistrer);
}
?>

</html>

Merci d'avance.
yohan

5 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
24 mars 2009 à 20:50
Salut Yohan,

Il y a un paquet d'erreurs dans ton script
Effectivement ton INSERT est mal placé, il faut le mettre au début de script, mais pas écrit de la sorte.

Avant toute chose, pour le debug et le debug seulement je te conseille d'activer les erreurs (je doute fort qu'elles le soient)
Tu peux les activer en mettant ces lignes en tout début de script :
ini_set ('display_errors', 'on');
error_reporting(E_ALL);

Qq trucs en vrac :
- tu fais des boucles while qui ne servent à rien puisque tu ne récupères qu'un seul résultat
- tu ne contrôles pas les erreurs de certaines de tes requêtes
- tu fais des requêtes sur tout le contenu alors que tu n'en as pas besoin

ex :
$sql= "SELECT * FROM `sondages` WHERE `categorie`='question' AND `online`='1'";
$result=mysql_query($sql) or die (mysql_error());
while ($donnees=mysql_fetch_assoc($result)){
    $id=$donnees['id'];
    $libel=$donnees['libelle'];      
}
=>
// en supposant que le online soit un identifiant de ligne (je me trompe peut être ?)
$sql = "SELECT id, libelle FROM `sondages` WHERE `categorie`='question' LIMIT 0,1";
$result = mysql_query($sql) or die (mysql_error());
$donnees = mysql_fetch_row($result);
$id = $donnees[0];
$libel = $donnees[1];      

$sql1 = 'SELECT count(*) FROM `sondages` WHERE `categorie`="reponse" AND `id`='.$id.'';
$result1=mysql_query($sql1);
while ($donnees=mysql_fetch_assoc($result1)){
    $preado=$donnees['count (*)'];
}
=> ne sert à rien (et en plus ça ne fonctionne pas)

<form method="POST" >
=>
<form action="" method="POST" >

... j'arrête là, mais il y a encore beaucoup d'erreurs

Pour en revenir au problème, tu devrais mettre ton insert en début de script en le modifiant ainsi :
if (isset($_POST[choix])) {
    $enregistrer = "INSERT vote SET question='$_POST[id_question]', id='', reponse='$_POST[choix]', ip='$ip', unix='$unix'";
    mysql_query ($enregistrer); // + traitement erreur
}
// bien sur $ip et $unix doivent être déclarées avant

Puis tu ajoutes un hidden contenant l'id de la question :

juste avant le while.

=> cela devrait fonctionner, mais ce n'est pas la meilleure façon de faire.
En fait la structure de ton script est à revoir et à épurer grandement.

Cordialement,

Kohntark -
3
yoh42 Messages postés 42 Date d'inscription lundi 1 septembre 2008 Statut Membre Dernière intervention 6 septembre 2011
24 mars 2009 à 17:58
On m'a dit que s'etait un probleme du a l'affichage. En effet, je devais envoyer la requete avant d'afficher sinon j'avais un coup de retart mais je ne vois pas ou mettre ma requete.
Merci
0
yoh42 Messages postés 42 Date d'inscription lundi 1 septembre 2008 Statut Membre Dernière intervention 6 septembre 2011
25 mars 2009 à 09:51
Merci pour tous tes conseils car j'ai pris le script sur le Web et je débute dans ce domaine donc je te remercie vraiment.
En fait je veux juste faire un petit sondage avec une seule question et un affichage graphique des résultats donc si tu peux me proposer quelque chose pour commencer je le prendrai avec plaisir.
Sinon ben merci encore et je suis prêt a arranger mon script mais pourrais tu m'aider ?
Merci d'avance.
Yohan
0
yoh42 Messages postés 42 Date d'inscription lundi 1 septembre 2008 Statut Membre Dernière intervention 6 septembre 2011
26 mars 2009 à 09:27
Bonjour, donc cela fonctionne bien après les différentes remarques que [auteur/KOHNTARK/302665.aspx kohntark] m'a faite et je le remercie.
Maintenant; il m'a dit qu'il y avait d'autres erreurs mais je ne vois pas lesquelles donc si quelqu'un peut m'aider pour résoudre ces erreurs j'en serais ravis.
Merci d'avance a tous.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yoh42 Messages postés 42 Date d'inscription lundi 1 septembre 2008 Statut Membre Dernière intervention 6 septembre 2011
26 mars 2009 à 09:29
Oupss j'ai oublier de mettre le script avec les modifications ... le voila :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<link rel= "stylesheet" href="questionnaire.css" type="text/css">

<?php
$link = mysql_connect("localhost","root","");
    if (!mysql_select_db("questionnaire",$link)){ echo "Erreur de connexion SQL"; }

$ip = $_SERVER['REMOTE_ADDR']; // récupere l'ip de visiteur.
$unix = time(); // temps actuel.
$temps = time()-3600; // le temps y'as maintenant une heure.

//on demande a notre table de nous donné tous les ip qui ressemble a l'ip de notre visiteur actuel, et qui ne sont pas
//daté de plus d'une heure.

$sql = "SELECT id, libelle FROM `sondages` WHERE `categorie`='question' LIMIT 0,1";
$result = mysql_query($sql) or die (mysql_error());
$donnees = mysql_fetch_row($result);
$id = $donnees[0];
$libel = $donnees[1];

if (isset($_POST[choix])) {
    $enregistrer = "INSERT vote SET question='$_POST[id_question]', id='', reponse='$_POST[choix]', ip='$ip', unix='$unix'";
    mysql_query ($enregistrer); // + traitement erreur
}

$verifier = "SELECT `ip` FROM `vote` WHERE ip='$ip'";
$voter = mysql_query($verifier);

if(@mysql_num_rows($voter)!='0'){//Si oui, ca veut dire que notre visiteur a déja voté, on lui affiche alors un message de remerciments, et les résultats.
 
  echo $libel;
  echo "
";
  $sql2 = "SELECT `reponse` FROM `vote` WHERE question='".$id."'"; //on récupere le résultat des anciens votes.
  $result2 = mysql_query($sql2);
  $reponse=array();
  while($resultat = mysql_fetch_array($result2)) {
    $cadre[] = $resultat['reponse'];  //on récupere le résultat de notre requête, et on le stocke dans un tableau.
  }
 
  //on stocke le total du vote dans une variable "$totalvote" via la méthode "count" qui parcourt tout notre tableau.
  $totalvote= count($cadre);
 
  //on stocke le nombre de chaque choix dans un tableau avec la méthode "array_count_values" .. qui retourne par exmple.
  //$array = array(1, "tyty", 1, "slt", "tyty");   array_count_values($array);    retourne array(1=>2, "tyty"=>2, "slt"=>1)
  $totalreponse = array_count_values($cadre);
   
  //pour l'affichage on utilise une petite fonction  :
  function VerifText($text,$valeur,$reponse,$totaldesreponse){
$resultat = $reponse*2; 
      if ($text < '1'){ // on teste si le total des votes est moins qu'un, alors, on affiche l'image de la barre avec comme valeur de Width, et on met "0" comme valeur du vote
        $text1 = '
  '.$valeur.' : '.$reponse.'%
'.$reponse.'%

';
      }
      if ($text == '1'){ // on teste si le total des votes est égal a 1, alors, on affiche l'image de la barre avec comme valeur de Width, "la variable du pourcentage", et on met la "valeur du vote".
        $text1 = '
  '.$valeur.' : '.$reponse.'%
'.$reponse.'%

';
      }
      if ($text > '1'){  // on teste si le total des votes est plus grand que 1, alors, on affiche l'image de la barre avec comme valeur de Width, "la variable du pourcentage", et on met la "valeur du vote" avec une "s" a la fin cette fois. c tt
        $text1 = '
  '.$valeur.' : '.$reponse.'%
'.$reponse.'%

';
      }
    return $text1;
  }
 
 
  //Maintenant on calcule le pourcentage de nos votes selon la régle universel pour ca ^^  "p = chifre x 100 / total".
  //pour ca on utilise "bcdiv" qui divise et renvoie le résultat sous forme de chaîne de caractères.(en plus qu'on peut la fixé comme içi à 1 chiffres après la virgule). sinon on aura parfois des pourcentage genre 65.2323232323% et c'est pas beau >_<
     
//la on affiche notre function avec ces nouveaux paramètres.
  //VerifText($_variable_du_total_du_vote , 'Valeur a affiché dans notre page' , $_variable_de_notre_pourcentage , $_variable_du_total_du_vote);
  //ce qui donne quelque chose comme ça.
 
$sql1 = 'SELECT `libelle` FROM `sondages` WHERE `categorie`="reponse" AND `id`='.$id.'';
$result1=mysql_query($sql1);
$k=1;
while ($donnees=mysql_fetch_assoc($result1)){
    $val=$donnees['libelle'];
       

  $reponse[$k] = bcdiv($totalreponse[$k]*100, $totalvote, 1);
  echo VerifText($totalreponse[$k],$val,$reponse[$k],$totalreponse[$k]);
$k++;
 
}
  echo ' Total votes : '.$totalvote.'

';
  //on répète notre function n fois nos choix avec une "." Pour la concaténation  , et une autre echo pour le total des votes.

}else{ //Si non, ça veut dire que notre visiteur n'as pas encore voté, on lui affiche le formulaire avec les choix.
    $sql ="SELECT * FROM `sondages` WHERE `categorie`='question' AND `online`='1'";
    $result=mysql_query($sql) or die (mysql_error());
        while ($donnees=mysql_fetch_assoc($result)){
        echo $donnees['libelle']."

";
        $id=$donnees['id'];
        $question=$donnees['libelle'];
    }
   
    echo '<form action="" method="POST" >';
    echo '
';
    $sql1="SELECT * FROM `sondages` WHERE `categorie`='reponse' AND `id`='".$id."'";
    $result1=mysql_query($sql1);
    $i=1;
    echo '';
    while ($donnees1=mysql_fetch_assoc($result1)){
        echo '';
        echo $donnees1['libelle']."
";
        $i++;
    }
   
    echo '
</form>';     
     


// Enregistrement du vote dans la table si le vote est diffèrent de "0" , ce qui veux dire que le gars a validé le formulaire sans prendre un choix.
// Et si la variable "vote" récupéré par la méthode $_GET et égal a "ok", ce qui veut dire que c'est le formulaire qui as envoyé cette page, pas un simple lien.

?>

</html>
0
Rejoignez-nous