Sondage php, mon code est barbare !

  • Auteur de la discussion Auteur de la discussion sff
  • Date de début Date de début
WRInaute impliqué
Voila je suis en train de coder la partie ou l'on enregistrer les votes de mon sondage. Mais la je trouve vraiment que c'est barbare:

Code:
 if (!isset($_POST["sondage_x"])) 
	{
	  if(!empty($vote['reponse1']))
        {
        $sondage .= '<input type="radio" value="1" name="reponse" checked> '.stripslashes($vote['reponse1']).'<br />';
        }
        if(!empty($vote['reponse2']))
        {
        $sondage .= '<input type="radio" value="2" name="reponse"> '.stripslashes($vote['reponse2']).'<br />';
        }
        if(!empty($vote['reponse3']))
        {
        $sondage .= '<input type="radio" value="3" name="reponse"> '.stripslashes($vote['reponse3']).'<br />';
        }
        if(!empty($vote['reponse4']))
        {
        $sondage .= '<input type="radio" value="4" name="reponse"> '.stripslashes($vote['reponse4']).'<br />';
        }

   $sondage .= '<br />'.$bouton.'</div></form>';
   }else 
   {
if($_POST['reponse'] == 1){
   $champ1= 'resultat1 + 1';
   $champ2= 'resultat2 + 0';
   $champ3= 'resultat3 + 0';
   $champ4= 'resultat4 + 0';
   }
    if($_POST['reponse'] == 2){
   $champ2= 'resultat2 + 2';
   $champ1= 'resultat1 + 0';
   $champ3= 'resultat3 + 0';
   $champ4= 'resultat4 + 0';
   }
    if($_POST['reponse'] == 3){
   $champ3= 'resultat3 + 3';
   $champ1= 'resultat1 + 0';
   $champ2= 'resultat2 + 0';
   $champ4= 'resultat4 + 0';
   }
    if($_POST['reponse'] == 4){
   $champ4= 'resultat4 + 4';
   $champ2= 'resultat4 + 0';
   $champ3= 'resultat3 + 0';
   $champ1= 'resultat1 + 0';
   }
   $save_vote = doquery("UPDATE {{table}} SET resultat1= '".$champ1."', resultat2= '".$champ2."', resultat3= '".$champ3."', resultat4= '".$champ4."' WHERE id='".$vote['id']."'", "sondage");

Avez vous une autre solution?
 
WRInaute passionné
bof

pas si horrible que ça

le isset et empty peuvent etre regroupés dans la meme condition

les successions de if peuvent etre remplacées par des elseif

$vote['reponse2'] ==> dois je en conclure que tu codes avec globals a on ?

si tu avais declaré les names du type vote['reponse2'][$i]

tu aurais pu faire un traitement en boucle

@gripsous

c'est sympat de filer un lien mais je crois que sff veut rentrer dans la categorie de ceux qui utilisent leurs propres codes
 
P
PigeonDeCombat
Guest
sff a dit:
Voila je suis en train de coder la partie ou l'on enregistrer les votes de mon sondage. Mais la je trouve vraiment que c'est barbare:

Code:
 if (!isset($_POST["sondage_x"])) 
	{
	  if(!empty($vote['reponse1']))
        {
        $sondage .= '<input type="radio" value="1" name="reponse" checked> '.stripslashes($vote['reponse1']).'<br />';
        }
        if(!empty($vote['reponse2']))
        {
        $sondage .= '<input type="radio" value="2" name="reponse"> '.stripslashes($vote['reponse2']).'<br />';
        }
        if(!empty($vote['reponse3']))
        {
        $sondage .= '<input type="radio" value="3" name="reponse"> '.stripslashes($vote['reponse3']).'<br />';
        }
        if(!empty($vote['reponse4']))
        {
        $sondage .= '<input type="radio" value="4" name="reponse"> '.stripslashes($vote['reponse4']).'<br />';
        }

   $sondage .= '<br />'.$bouton.'</div></form>';
   }else 
   {
if($_POST['reponse'] == 1){
   $champ1= 'resultat1 + 1';
   $champ2= 'resultat2 + 0';
   $champ3= 'resultat3 + 0';
   $champ4= 'resultat4 + 0';
   }
    if($_POST['reponse'] == 2){
   $champ2= 'resultat2 + 2';
   $champ1= 'resultat1 + 0';
   $champ3= 'resultat3 + 0';
   $champ4= 'resultat4 + 0';
   }
    if($_POST['reponse'] == 3){
   $champ3= 'resultat3 + 3';
   $champ1= 'resultat1 + 0';
   $champ2= 'resultat2 + 0';
   $champ4= 'resultat4 + 0';
   }
    if($_POST['reponse'] == 4){
   $champ4= 'resultat4 + 4';
   $champ2= 'resultat4 + 0';
   $champ3= 'resultat3 + 0';
   $champ1= 'resultat1 + 0';
   }
   $save_vote = doquery("UPDATE {{table}} SET resultat1= '".$champ1."', resultat2= '".$champ2."', resultat3= '".$champ3."', resultat4= '".$champ4."' WHERE id='".$vote['id']."'", "sondage");

Avez vous une autre solution?

J'pige pas l'intêret d'additionner 0...
 
WRInaute impliqué
[EDIT : SNIP le code. rien à voir avec la question]


enfin c'est à toi de voir (et désolé si j'ai mal compris ce que tu voulais faire, il n'est que 9h30 ^^ )
 
WRInaute impliqué
La Chaise sauvage merci de ton aide, mais le code ne me semble pas correct ( j'ai testé d'ailleur) puisque premièrement sur

$champ1 = $resultat1;

$resultat1 n'existe pas de meme pour les autres $resultat2, 3 et 4.

Pour moi lorsque l'on incrémente un champ sql on faisait :

resultat1= resultat1 + 1 donc rien à voir, j'ai donc remplacé $champ1 = $resultat1; par $champ1 = 'resultat1' . Mais cela ne fonctionne pas comme il faut, ca incrémenter bien, mais d'une facon encore barbare. Imaginons que l'on choisi la réponse 1, normalement ca doit incrémenter le champ resultat1 +1 ce qui est bien le cas, mais si un autre vote a lieu par la suite sur un autre réponse, le 1 du champ1 se trouve incrémenter sur l'autre champ voté par la suite. Du coup le 1 est retiré du champ resultat1 et se trouve sur l'autre champ resultat2 par exmple.

Cela fait de meme pour ton deuxième code:

Pour résumer le problème:

- On vote le premier choix
- Le champ resultat1 passe de 0 à 1
- On vote le deuxième choix
- Le champ resultat1 passe de 1 à 0
- Le champ resultat2 passe de 0 à 2 (le 1 du resultat1 et le +1 du vote 2)

Ce que je cherche a faire:

- On vote le premier choix
- Le champ resultat1 passe de 0 à 1 (+1)
- On vote le deuxième choix
- Le champ resultat2 passe de 0 à 1 (+1)
- on vote de nouveau le premier choix
- Le champ resultat1 passe de 1 à 2 (+1)

Bref c'est un peu complique, mais c'est juste pour dire c'est que j'ai testé plusieurs chose et que c'est vraiment pas le top.
 
WRInaute impliqué
Ca donne ca, mais c'est pas correct :

Code:
if (!isset($_POST["sondage_x"])) 
	{
	  if(!empty($vote['reponse1']))
        {
        $sondage .= '<input type="radio" value="1" name="reponse" checked> '.stripslashes($vote['reponse1']).'<br />';
        }
        if(!empty($vote['reponse2']))
        {
        $sondage .= '<input type="radio" value="2" name="reponse"> '.stripslashes($vote['reponse2']).'<br />';
        }
        if(!empty($vote['reponse3']))
        {
        $sondage .= '<input type="radio" value="3" name="reponse"> '.stripslashes($vote['reponse3']).'<br />';
        }
        if(!empty($vote['reponse4']))
        {
        $sondage .= '<input type="radio" value="4" name="reponse"> '.stripslashes($vote['reponse4']).'<br />';
        }

   $sondage .= '<br />'.$bouton.'</div></form>';
   }else 
   {
$champ1 = 'resultat1'; 
$champ2 = 'resultat2'; 
$champ3 = 'resultat3';  // ça aussi pourrait être réduit par une boucle 
$champ4 = 'resultat4';  // mais chaque chose en son temps... 

$repNum = $_POST['reponse'];     // si $_POST['reponse'] == 3 
$nomChamp = 'champ'.$repNum; // alors $nomChamp == 'champ3' 
$$nomChamp += $repNum;         // et $$nomChamp == $champ3 

 $save_vote = doquery("UPDATE {{table}} SET resultat1= '".$champ1."', resultat2= '".$champ2."', resultat3= '".$champ3."', resultat4= '".$champ4."' WHERE id='".$vote['id']."'", "sondage");

   $insert_ip = doquery("INSERT INTO {{table}} SET numero='".$vote['id']."', ip='".$_SERVER['REMOTE_ADDR']."'", "sondage_ip");

   $sondage = 'Vote enregistré ('.$_POST['reponse'].')</div></form>';
}
 
WRInaute impliqué
heu

j'espère pas dire une nouvelle fois une ânerie, mais si j'ai cette fois bien compris, est-ce que ça ne suffirait pas :

Code:
if (!isset($_POST["sondage_x"])) {

    /* snip la première partie */

   $sondage .= '<br />'.$bouton.'</div></form>';
   }
else
   {
   $nbQuestions = 4;        // ça tu l'initialises comme tu veux
   for($i=1 ; $i<=$nbQuestions ; $i++){   
        $champ = 'resultat'.$i;             // ex: $champ = resultat3
        if($i==$_POST['reponse']) {
            $update = "$champ = '$champ + 1'";    // ex: $update = 'resultat3 = resultat3 + 1'
        } 
   }
   $save_vote = doquery("UPDATE {{table}} SET $update WHERE id='".$vote['id']."'", "sondage");
}
 
WRInaute impliqué
ok impécable ca fonctione j'ai juste modifié $update = "$champ = '$champ + 1'"; en $update = $champ.'= '.$champ.' + 1';

sinon ca ne fonctionnait pas. Sinon au niveau de:

Code:
 $sondage .= '<input type="radio" value="1" name="reponse" checked> '.stripslashes($vote['reponse1']).'<br />'; 
        } 
        if(!empty($vote['reponse2'])) 
        { 
        $sondage .= '<input type="radio" value="2" name="reponse"> '.stripslashes($vote['reponse2']).'<br />'; 
        } 
        if(!empty($vote['reponse3'])) 
        { 
        $sondage .= '<input type="radio" value="3" name="reponse"> '.stripslashes($vote['reponse3']).'<br />'; 
        } 
        if(!empty($vote['reponse4'])) 
        { 
        $sondage .= '<input type="radio" value="4" name="reponse"> '.stripslashes($vote['reponse4']).'<br />';


On peu pas le faire en 1 seule ligne avec une boucle?
 
WRInaute impliqué
bin on peut le faire sur le même modèle

Code:
<?php 
$nbQuestions = 4;                       // ça tu l'initialises comme tu veux

if(!isset($_POST["sondage_x"])) {
    for($i=1 ; $i<=$nbQuestions ; $i++) {  
        $champ='reponse'.$i;
        if(!empty($vote[$champ])) {
            $sondage .= '<input type="radio" value="'.$i.'" name="reponse" checked> '.stripslashes($vote[$champ]).'<br />';
        }
    $sondage .= '<br />'.$bouton.'</div></form>';
} 
else {           
    for($i=1 ; $i<=$nbQuestions ; $i++){   
        $champ='resultat'.$i;
        if($i==$_POST['reponse']) {
            $update = $champ.' = '.$champ.' + 1';
        }
    }
    $save_vote = doquery("UPDATE {{table}} SET $update WHERE id='".$vote['id']."'", "sondage");
} 
?>
 
WRInaute impliqué
Ok impécable, j'ai fais une petite modif et ca fonctionne ;)

Sinon dernier détail comment peut on faire pour mettre le checked sur la première réponse? La c'est checké sur la dernière
 
WRInaute impliqué
oui, j'ai oublié de préciser que je n'ai absolument rien testé "en live", dans tout ça...

Code:
    for($i=1 ; $i<=$nbQuestions ; $i++) {  
        $check = ($i==1) ? 'checked' : '';      // $check vaudra 'checked' si $i==1. sinon rien.
        $champ='reponse'.$i;
        if(!empty($vote[$champ])) {
            $sondage .= '<input type="radio" value="'.$i.'" name="reponse" '.$check.'> '.stripslashes($vote[$champ]).'<br />';
        }
 
WRInaute impliqué
Voila le code final, par contre il y a un dernier petit soucis. Je vous explique j'ai mi : $ip_query = doquery ( "SELECT * FROM {{table}} WHERE numero='".$vote['id']."' AND ip='".$_SERVER['REMOTE_ADDR']."'","sondage_ip");
$ip = mysql_num_rows($ip_query); donc logiquement si on met if($ip) c'est que l'ip est bien présent dans la requete. En fait j'aimerai utiliser cette condition pour lorsque que l'ip de la personne est présente dans la bdd, il ne faudrai pas afficher le choix avec les input, mais seulement afficher les réponses en permenance. Donc il faut mettre quelques part un if ($ip){ ... J'ai essayer plusieurs solution, mais j'ai toujours les choix du sondage qui s'affiche.

Pour résumer je veux afficher le sondage avec les choix quand on a pas voté, et si on a voté on affiche seulement les résultats.
Code:
//Affichage du sondage. 
  $vote_query = doquery ("SELECT * FROM {{table}} ORDER BY id DESC LIMIT 0,1", "sondage");
  $vote = mysql_fetch_array($vote_query);
  $ip_query = doquery ( "SELECT * FROM {{table}} WHERE numero='".$vote['id']."' AND ip='".$_SERVER['REMOTE_ADDR']."'","sondage_ip");
  $ip = mysql_num_rows($ip_query); 
   
  if (!empty($vote['question'])){
  
  $question = '<img  width="16px" height="15px" alt="" src="images/login/question.gif" style="vertical-align: middle;"/> <span class="marron2"><b>'.stripslashes($vote['question']).'</b></span><br /><br />';
  $bouton = '<div style="text-align: center" ><input type="image" src="images/login/bouton_voter.gif" class="no_bordure" title="Voter" name="sondage"/></div>';
  }else{
  
  $question = '<span class="marron2"><b>Aucun sondage</b></span>';
  $bouton = '';
 }
	
  $sondage = $question;
  $nbQuestions = 4;
  
  if (!isset($_POST["sondage_x"])) 
  {
  for($i=1 ; $i<=$nbQuestions ; $i++) {
   $check = ($i==1) ? 'checked' : '';
      $champ='reponse'.$i; 
        if(!empty($vote[$champ])) { 
        $sondage .= '<input type="radio" value="'.$i.'" name="reponse" '.$check.'> '.stripslashes($vote[$champ]).'<br />'; 
     } 
  }

  $sondage .= '<br />'.$bouton.'</div></form>'; 
  } 
  else 
  { 
  for($i=1 ; $i<=$nbQuestions ; $i++) {    
   $champ = 'resultat'.$i; 
      if($i==$_POST['reponse']) 
		{ 
        $update = $champ.'= '.$champ.' + 1';
    } 
  } 
  $save_vote = doquery("UPDATE {{table}} SET $update WHERE id='".$vote['id']."'", "sondage"); 
  $insert_ip = doquery("INSERT INTO {{table}} SET numero='".$vote['id']."', ip='".$_SERVER['REMOTE_ADDR']."'", "sondage_ip");

  $sondage = '<span class="marron1">Les résultats des votes:</span></div></form>';
   for($i=1 ; $i<=$nbQuestions ; $i++) {
      $champ='reponse'.$i;
        $nombre_vote='resultat'.$i; 	  
        if(!empty($vote[$champ])) {
          if($vote[$nombre_vote]>1){
            $pluriel = 'votes';	
			 }else{
			   $pluriel = 'vote';} 	
        $sondage .= '<span class="rose3"><b>- '.stripslashes($vote[$champ]).'</b></span> <span class="taille1">('.$vote[$nombre_vote].' '.$pluriel.')</span><br />'; 
     }
  }
}
 
WRInaute passionné
la ça commence à faire fouilli

si tu ne veux pas de double vote tu fais juste une requete pour vérifier que l'ip n'est pas dans la table

une petite fonction du type verif_double_vote($ip)

et c'est réglé

tu te retrouves avec un code plus clair

du style

if(!veri_double_vote(son_ip))
{
bloquage fatal
}
else
{
on enregistre le vote
}

rog
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
M
Réponses
6
Affichages
6K
Haut