Page 1 sur 1

Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 19:16
par abyssin
Bonjour à tous =)

Je suis un petit nouveau dans le monde du php, j'ai commencé à crée mon site il y a déjà de ça quelques semaines et je dois vous avouer que je bloque sur un petit détail.

J'ai voulu créer un sondage html de type "radio" mais pas seulement ! J'ai voulu limité le nombre de vote de 1 par semaine.
Alors pour vous situer ou j'en suis, j'ai tout bien configuré ma base avec phpadmin, tout fonctionne à merveille quand je fais le sondage, les données rentrent bien dans la base.
Seulement je n'arrive pas à limiter les votes.

Mon site à un espace membre (ouais ! ^^) et un seul membre ne peux vote qu'une fois par semaine.

J'ai donc tapé le code suivant.
<form method="post" action="tableau.php">
<input type="text" name="log"><br/>
<input type="radio" name="tuto" value="RiWe">Rihanna ft. Calvin Harris - We Found love <br/>
<input type="radio" name="tuto" value="Cobra">Cobra Starship - You Make Me Feel <br/>
<input type="radio" name="tuto" value="Inna">Inna - Sun Is Up <br/>
<input type="radio" name="tuto" value="Brazil">Deadmau5 - Brazil (2nd Edit) <br/>
<input type="radio" name="tuto" value="Benny">Chris Brown ft Benny Benassi - Beautiful People <br/>
<input type="radio" name="tuto" value="LMFAO">LMFAO - Champagne Shower <br/>
<input type="radio" name="tuto" value="Tita">David Guetta ft Sia - Titanium <br/>
<input type="radio" name="tuto" value="Flor">Florida - Good Feelings <br/>
<input type="radio" name="tuto" value="Bless">Tom Hangs - Blessed (Avicii Remix) <br/>
<input type="radio" name="tuto" value="Nadia">Nadia Ali- Pressure <br/>
<input type="submit" name="valider" value="Ok"/>
</form>

<?php
if(isset($_POST['valider'])){

	$tuto=$_POST['tuto'];
	$today = date("y-m-d");
	$week = date("w");
	$login = $_POST['log'];

	$base = mysql_connect ('localhost', 'root', '');  
		mysql_select_db ('MaBase', $base) ;
		
		$sql = 'SELECT login, week FROM vote WHERE login="'.$login.'"';
			$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
			$data = mysql_fetch_array($req);
			
			if($data[0] == 0 OR $data[1] != $week){
		
			$sql = 'INSERT INTO vote VALUES("","'.$login.'","'.$tuto.'","'.$today.'","'.$week.'")';

			mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
			}
			
			else{
			echo 'non non !';
			}
		
	mysql_close();

}		
		
	
?>
J'explique un peu mon code, dans le formulaire on remarque que je demande d'entrer un "log", c'est pour simuler la session login. Il est évident que pour la version finale de mon site j'utiliserais directement la session dans le code php.

Bref, je demande à la base ou est-ce qu'il trouve dans la base le login correspondant, je prend la date (décrit par son numéro de semaine).
Je demande que le vote ne soit effectué que si le login n'existe pas ou si la date (week) est différente du dernier vote si le login apparait déjà dans la base par
if($data[0] == 0 OR $data[1] != $week)
Le problème c'est que mon code tel qu'il est ici n'empêche pas du tout un login de voter plusieurs fois dans la même semaine et je ne comprend pas pourquoi. Il devrait dire "non non !" si le membre à déjà voté mais pas du tout !

J'avoue bloquer dessus, c'est certainement un petit détail mais je le trouve pas ^^

Merci à vous.

Cordialement ;)

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 20:00
par xTG
Tout d'abord il y a un cas qui n'est pas pris en compte. Si le membre n'a jamais voté il ne pourra donc pas voter ?
Vu qu'il n'y aura aucun enregistrement dans la table vote.
=> Tu devrais faire une jointure sur la table membre
SELECT membre.login, vote.week 
FROM membre
  LEFT JOIN vote ON membre.login = vote.login 
WHERE membre.login="'.$login.'"
ORDER BY week DESC
LIMIT 1
Je ne sais pas trop ce que tu as stocké dans week, j'espère que c'est une date ? Si c'est le numéro de la semaine dans l'année c'est pas suffisant... (cas de changement d'année, ect)
Cela permettra de récupérer dans tous les cas une ligne (avec des NULL si le membre n'a aucun vote), mais surtout de vérifier que le membre existe bien !
if( mysql_num_rows($req) == 0 ) // implique que le login est inconnu = membre inexistant
if( mysql_num_rows($req) > 0 ) // implique que le login existe et qu'il a 0 ou plusieurs votes, mais la requête ne renvoie que le dernier (le seul qui nous importe)
Enfin pour tester la date il faut la décomposer, la fonction date() de PHP permet à partir d'un timestamp de formater et de ne récupérer que ce qu'on veut.
On peut donc extraire l'année et le numéro de la semaine. Avec ces deux informations tu peux les comparer avec la date actuelle et autoriser ou non le vote.

N.B : tu es contradictoire, tu dis avoir un espace membre, mais on peut renseigner n'importe quel login dans le formulaire... N'importe qui peut donc voter sans être connecté ?

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 20:14
par abyssin
Merci de ta réponse si rapide xTG.

Je vais essayer de te répondre assez clairement =)

Ce code dis que si il n'existe pas le login dans le tableau, le membre peux voter justement !
Si le le data[0] == 0 : C'est à dire si le membre n'existe pas (dans la table "vote" !!!), on prend le vote en compte.
Sinon, donc si data[0] == 1, c'est le week qui est pris en compte.
$sql = 'SELECT login, week FROM vote WHERE login="'.$login.'"';
                        $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
                        $data = mysql_fetch_array($req);
                       
                        if($data[0] == 0 OR $data[1] != $week){
               
                        $sql = 'INSERT INTO vote VALUES("","'.$login.'","'.$tuto.'","'.$today.'","'.$week.'")';

                        mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
                        }

J'ai pas encore songé au vote de l'année prochaine mais si je réussi à trouver la solution à ce problème celui de l'année prochaine coulera de source, juste un petit truc à rajouter.
Pour ce qui s'agit de l'espace membre, je crois que tu n'as pas lu mon sujet en entier ;)
Je cite :
J'explique un peu mon code, dans le formulaire on remarque que je demande d'entrer un "log", c'est pour simuler la session login. Il est évident que pour la version finale de mon site j'utiliserais directement la session dans le code php.
Le code que je vous propose ici est un code temporaire pour mon espace local, ce que j'ai bien préciser. Mais il fonctionne de la même manière. J'ai juste proposé un champ login pour "simuler" un login existant.
Mais mon site possède bien un espace membre. ^^

Pour finir dans week, non. Je préfère justement mettre un nombre plutôt qu'une date.
Week est un INT.
Date est une DATE.

Je completerais mon algo avec la variable date ;)


Edit important :
De plus, j'ai préciser que mon algo n'arrive pas à empêcher un membre ayant déjà voter cette semaine de re-voter.
Mon problème n'est pas tant de faire voter un nouveau membre puisque ça marche bien, mais d'empêcher de faire voter un membre l'ayant déjà fait.
Le problème vient certainement de si "if", mais je ne sais pas pourquoi. :)

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 20:44
par xTG
J'ai déjà répondu à la question, relis mon post. ;)
Et tentes de comprendre le tout plutôt que de rejeter des morceaux car tu n'en veux pas pour le moment.

Pour ma part je ne conçois pas de façon de coder autrement que proprement, on ne code pas un machin n'importe comment pour l'embellir par la suite.
C'est la meilleure façon de se limiter et de se planter. :evil:
Pour finir dans week, non. Je préfère justement mettre un nombre plutôt qu'une date.
Tu n'as pas annoncé une quelconque raison valable, je me trompe ? ^^

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 21:42
par abyssin
Bon alors je te remercie encore xTG et j'apprécie tes réponses.

Je vais écrire en majuscule certains mots mais ce n'est pas parceque je suis énervé mais pour insister sur ces mots. Je me rend compte que tu viens ici pour me proposer ton aide et je trouve ça très simpa de ta part.
Ceci dis j'ai l'impression que tu passe à coté de mon code.

J'ai une base de donnée avec mes membres.
J'ai un autre base pour les votes.

SEULEMENT les membres connectés peuvent voter, car seuls les membres auront accès à la page de vote.
Mon code ici ne se soucis PAS de savoir si le membres existe (dans la base "membre" s'entend, pas dans la base "vote")ou pas puisqu'il le sera forcément si il vote.

Dans le code si contre, le log à rentrer est la pour SIMULER UN MEMBRE connecté. Ce n'est pas par feignantise que j'ai SIMULER UNE CONNEXION mais pour que vous puissiez tester le code sans avoir à récréer une base de donnée pour tester mon code mais juste à rentrer un pseudo lambda pour SIMULER UN MEMBRE QUI TENTERAIS DE VOTER A PLUSIEURS REPRISE.

C'est donc un choix de clarté pour vous.

Je n'influe surtout pas dans ma base membre pour le vote.
Lorsque je vote, mon pseudo s'inscrit dans la table "vote" ainsi que la semaine.

Et c'est là, que ca devient important. Dans la table "vote", lorsqu'un membre a voté, son pseudo et sa date (week) s'inscrivent dans la table "vote". Ce que je voudrais, c'est que quand ce même membre va vouloir voter de nouveau, son nom est fiché dans la table "vote" et donc il ne pourra pas.
A moins que la semaine soit passée.

Alors POURQUOI la semaine en nombre entier?
Pour la simplicité. Si nous sommes en semaine 42 (au hasard), la semaine prochaine nous serrons semaines 43. Et 43 != 42. Donc le calcul est extrêmement simple.
La fonction date("w") le fait très bien.

Je cherche la réponse justement mais je ne trouve pas, j'espere t'avoir éclairé au maximum !

Amicalement =)

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 22:09
par xTG
Bah justement... Tu te contredis d'une très jolie manière en fait. ^^
Alors POURQUOI la semaine en nombre entier?
Pour la simplicité. Si nous sommes en semaine 42 (au hasard), la semaine prochaine nous serrons semaines 43. Et 43 != 42. Donc le calcul est extrêmement simple.
La fonction date("w") le fait très bien.
La fonction date justement, regardes ce qu'elle peut prendre en second paramètre.

Et sinon relis la partie sur le mysql_num_rows(). Car tu oses dire que je ne comprend rien à ce que tu racontes alors que je ne fais que souligner que ce n'est pas propre.
Mais toi par contre tu ne comprends rien de ce que je t'explique. Tout aurait pu se finir à mon premier post. :)

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 22:18
par abyssin
Bah justement... Tu te contredis d'une très jolie manière en fait. ^^
Ah bon? Permet moi de te rappeler ce que donne la fonction date("w") ? Un nombre entier. Et non pas une date comme on pourrait le croire. Je ne me contre-dit pas du tout. La fonction date peut prendre 3 valeurs si j'en met qu'une j'ai un nombre entier. Pourquoi en mettre plus puisque j'en ai besoin d'une seule?

De plus ton premier post me dis (première phrase), je cite :
Tout d'abord il y a un cas qui n'est pas pris en compte. Si le membre n'a jamais voté il ne pourra donc pas voter ?
Mon code PREND EN COMPTE CEUX QUI N'ONT JAMAIS VOTé. Pourquoi ta première phrase me dit l'inverse?

Je ne comprend pas pourquoi tu prend mal ce que je te dis, je ne dis pas que tu comprend rien seulement déjà ta première phrase ne colle pas avec mon code :/

Je te dis que sincèrement j'apprécie ton aide mais la tu n'as pas résolu le problème. C'est pour ça que j'essaye de te le montrer. Mais aucune offense je t'assure.

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 22:37
par xTG
NOM | TYPE
id | INT(AI) - PK
idvote | INT
login | VARCHAR (mais un identifiant numérique serait mieux = clé primaire de la table membre)
dateVote | DATE
reponse | VARCHAR
<form method="post" action="tableau.php?vote=1">
<input type="text" name="log"><br/>
<input type="radio" name="tuto" value="RiWe">Rihanna ft. Calvin Harris - We Found love <br/>
<input type="radio" name="tuto" value="Cobra">Cobra Starship - You Make Me Feel <br/>
<input type="radio" name="tuto" value="Inna">Inna - Sun Is Up <br/>
<input type="radio" name="tuto" value="Brazil">Deadmau5 - Brazil (2nd Edit) <br/>
<input type="radio" name="tuto" value="Benny">Chris Brown ft Benny Benassi - Beautiful People <br/>
<input type="radio" name="tuto" value="LMFAO">LMFAO - Champagne Shower <br/>
<input type="radio" name="tuto" value="Tita">David Guetta ft Sia - Titanium <br/>
<input type="radio" name="tuto" value="Flor">Florida - Good Feelings <br/>
<input type="radio" name="tuto" value="Bless">Tom Hangs - Blessed (Avicii Remix) <br/>
<input type="radio" name="tuto" value="Nadia">Nadia Ali- Pressure <br/>
<input type="submit" name="valider" value="Ok"/>
</form>

<?php
if(isset($_POST['valider']) && isSet($_GET['vote'])){
        $voteId = intval($_GET['vote']);
        $reponse=$_POST['tuto'];
        $today = date("y-m-d");
        $login = $_POST['log'];

        $vote = false; // l'utilisateur a-t-il déjà voté ?

        $base = mysql_connect ('localhost', 'root', '');  
        mysql_select_db ('MaBase', $base) ;
               
        $sql = "SELECT login, dateVote FROM vote WHERE login='".mysql_real_escape_string($login)."' AND idVote = '". mysql_real_escape_string($voteId)."' ORDER BY dateVote DESC LIMIT 1";
        $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
        if( mysql_num_rows() == 1 ){
              $data = mysql_fetch_array($req);
              $moisVote = date('w', strtotime($data['dateVote']);
              $anneVote = date('yyyy', strtotime($data['dateVote']);
              if( $moisVote == date('w') && $anneeVote == date('yyyy') ) // la semaine de cette année
                    $vote = true;
        }
         if( $vote === false ){
               
                        $sql = "INSERT INTO vote VALUES('', '" . mysql_real_escape_string($voteId) . "', '" . mysql_real_escape_string($login) . "', NOW(), '" . mysql_real_escape_string($reponse) . "')";
                        mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
                        echo 'a voté';
         }else{
                        echo 'non non !';
        }
               
        mysql_close();

}              
?>
Quand on vient demander de l'aide, il serait bon de savoir lire l'aide donnée.

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 22:50
par abyssin
Ah, je venais juste de trouver la solution à ma question, j'ai juste rajouter 2 petites lignes de code ^^

Je le donne au cas ou, même si le tiens à l'air bien :
<form method="post" action="tableau.php">
<input type="text" name="log"><br/>
<input type="radio" name="tuto" value="RiWe">Rihanna ft. Calvin Harris - We Found love <br/>
<input type="radio" name="tuto" value="Cobra">Cobra Starship - You Make Me Feel <br/>
<input type="radio" name="tuto" value="Inna">Inna - Sun Is Up <br/>
<input type="radio" name="tuto" value="Brazil">Deadmau5 - Brazil (2nd Edit) <br/>
<input type="radio" name="tuto" value="Benny">Chris Brown ft Benny Benassi - Beautiful People <br/>
<input type="radio" name="tuto" value="LMFAO">LMFAO - Champagne Shower <br/>
<input type="radio" name="tuto" value="Tita">David Guetta ft Sia - Titanium <br/>
<input type="radio" name="tuto" value="Flor">Florida - Good Feelings <br/>
<input type="radio" name="tuto" value="Bless">Tom Hangs - Blessed (Avicii Remix) <br/>
<input type="radio" name="tuto" value="Nadia">Nadia Ali- Pressure <br/>
<input type="submit" name="valider" value="Ok"/>
</form>

<?php
if(isset($_POST['valider'])){

	$tuto=$_POST['tuto'];
	$today = date("y-m-d");
	$week = date("w");
	$login = $_POST['log'];

	$base = mysql_connect ('localhost', 'root', '');  
		mysql_select_db ('MaBase', $base) ;
		
		$sql = 'SELECT login, week FROM vote WHERE login="'.$login.'"';
			$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
			$data = mysql_fetch_array($req);
			
			if($data[0] == $login && $data[1] == $week ){
			echo 'non non';
			}
			
			if($data[0] == 0 OR $data[1] != $week){
		
			$sql = 'INSERT INTO vote VALUES("","'.$login.'","'.$tuto.'","'.$today.'","'.$week.'")';

			mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
			}
			
			else{
			echo 'non non !';
			}
		
	mysql_close();

}		
		
	
?>
Voilà, me manquais juste une donnée.

Ps: dans ton code je ne comprend pas le
if( mysql_num_rows() == 1 )
Puisqu'un membre peux avoir plusieurs lignes dans la table "vote".

Enfin bon, merci de ton aide en tout cas.

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 22:52
par xTG
Ps: dans ton code je ne comprend pas le
if( mysql_num_rows() == 1 )
Puisqu'un membre peux avoir plusieurs lignes dans la table "vote".
Ma requête ne récupère que le dernier vote.

Edit: désespérant... Je vais pas continuer plus loin, alors j'édite car sinon on pourra poster ainsi jusqu'en 2012. Lira qui pourra.
Dans le cas où aucun vote n'a été fait mysql_num_rows() renvoie 0, c'est l'un des problèmes que je t'avais exposé. Ton niveau d'erreur est mal réglé.
Ton premier code devait générer d'immondes erreurs car tu tentais d'exploiter des données qui n'existaient pas.

Re: Limiter un vote par semaine pour un sondage

Posté : 25 nov. 2011, 22:55
par abyssin
Je te l'accorde mais la fonction mysql_num_rows retourne un nombre de ligne. Et la, tu dis "Si il n'y a qu'une ligne, alors..."