[PHP/MYSQL][RESOLUE]Empecher plusieurs votes: cookies ?

Empecher plusieurs votes: cookies ? [PHP/MYSQL][RESOLUE] - PHP - Programmation

Marsh Posté le 30-05-2003 à 10:42:51    

salut!
J'ai fais un genre sondage pour noter un article de 1 à 5.
Mais j'ai bien sur plusieurs article, contenue chacun dans une base de donnés avec différentes ID
Alors j'aimerais savoir comment vous feriez de facon theorique pour empecher qu'une seul et meme personne (enfin, un seul et meme PC je pense plutot..) ne puisse voter qu'une seul fois par article
Parce que je ne vois pas trop ce que je pourrais ecrire dans mes cookies.
Enfin bon, pour l'instant je considere mes cookies comme un fichier texte simple qui s'écrit chez l'utilisateur.
Donc je vois peut etre une solution de ce type:
j'écris:
[IDarticle]:[Avoter ou non]
Donc par exemple :
Pour l'article id: 6 et chez quelqu'un qui a voté j'écris:
6:0
Meme chose pour quelqu'un qui a voté, j'écris:
6:1
 
Que pensez vous de cette technique ?
 
Merci d'avance.
 
edit:
Mon pere pense que je chop l'ip de l'utilsateur, que j'écris sa dans une table de ma bd MYSQL avec l'id de l'article correspondant a son vote. C'est une meilleurs technique ?
(je précise, je n'ai pas 10 000 visiteurs par jour sur mon site, donc ma table n'aura pas des milliers d' enregistrement :)


Message édité par smilm le 02-06-2003 à 12:16:14
Reply

Marsh Posté le 30-05-2003 à 10:42:51   

Reply

Marsh Posté le 30-05-2003 à 11:11:09    

le coup de l'ip ca n'a pas l'air mal comme principe...
Pour les cookies, et l'ID de la personne, c'est une id de session ou une id permanente ?

Reply

Marsh Posté le 30-05-2003 à 11:20:50    

chopper l'ip n'est pas une bonne solution si elle est stockée de manière permanente.
 
L'idéal, c'est de combiner cookie + ip.
 
Dans le cookie, tu as une ip du posteur qui est mise en relation avec une table posteur/article
 
Pour les ips, tu les choppes dans une table séparée ip/date qui vire les entrées vieilles de plus d'un jour, comme ça, tu évites que deux personnes ne se choppent la même ip par le FAI (le même jour, c'est assez invraissemblable).
 
Mais de tout façon, tu ne peux pas faire du sur à 100%.

Reply

Marsh Posté le 30-05-2003 à 11:53:15    

gizmo a écrit :

chopper l'ip n'est pas une bonne solution si elle est stockée de manière permanente.
 
L'idéal, c'est de combiner cookie + ip.
 
Dans le cookie, tu as une ip du posteur qui est mise en relation avec une table posteur/article
 
Pour les ips, tu les choppes dans une table séparée ip/date qui vire les entrées vieilles de plus d'un jour, comme ça, tu évites que deux personnes ne se choppent la même ip par le FAI (le même jour, c'est assez invraissemblable).
 
Mais de tout façon, tu ne peux pas faire du sur à 100%.


Par exemple, HFR utilise qu'elle systeme pour les sondages ?
J'ai mal compris l'utilité de la table ip/date, mais bon, je vais cojiter un peu:)
 
Bon si j'ai bien compris pour la 1er partie :
Une table avec comme champ: ip,id_article,id(clé primaire).
Et donc j'écris dans les cookies de l'utilisateur l'ip qu'il avait utilisé lors de l'utilisation du sondage.
Je suis ok là ?

Reply

Marsh Posté le 30-05-2003 à 12:14:40    

sur hfr, c'est plus simple, seul les inscrits peuvent voter, donc c'est une bête table id/sondage.

Reply

Marsh Posté le 30-05-2003 à 12:25:43    

gizmo a écrit :

sur hfr, c'est plus simple, seul les inscrits peuvent voter, donc c'est une bête table id/sondage.


 
ha oui je vois...
Mais ca doit etre casse tete a faire des comptes et tout ca.
Enfin bon, surtout que je n'en vois pas l'interet pour l'instant sur mon site.
En fait, le liens, si ca aide peut vous aider a m'aider :d : http://siteiado.free.fr, j'ai pas encore mis en ligne le truc du sondage pour noter les différents articles,j'attends que le probleme soit reglé.

Reply

Marsh Posté le 30-05-2003 à 14:05:48    

Tu fais une table ip/sondage/date .
Et tu vires toujours les trucs de plus de 24h.

Reply

Marsh Posté le 30-05-2003 à 14:14:14    

l'ip, qu'elle soit stockée de maniere permanente ou pas est une MAUVAISE idée...
- les gens derriere un proxy
- les qui partagent une connection (en entreprise ou à la maison)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 30-05-2003 à 14:16:59    

the real moins moins a écrit :

l'ip, qu'elle soit stockée de maniere permanente ou pas est une MAUVAISE idée...
- les gens derriere un proxy
- les qui partagent une connection (en entreprise ou à la maison)


pour les proxys, 80% d'entre eux permettent de passer outre, idem pour la plupart des partages de connexion (et puis, les gens n'ont pas à surfer sur son site au boulot! [:ddr555] )

Reply

Marsh Posté le 30-05-2003 à 14:19:23    

gizmo a écrit :


pour les proxys, 80% d'entre eux permettent de passer outre, idem pour la plupart des partages de connexion (et puis, les gens n'ont pas à surfer sur son site au boulot! [:ddr555] )

ce n'est pas parce que tu n'es pas obligé d'utiliser le proxy de ton fai que tu ne le fais pas.
il est configuré par defaut chez bcp de gens et ils ne le changent pas puisqu'il ne savent meme pas ce que c'est


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 30-05-2003 à 14:19:23   

Reply

Marsh Posté le 30-05-2003 à 14:23:27    

C'est clair que ce n'est pas la meilleure solution mais une des plus simples. Le nombre de personnes derrière un proxy est assez peu élevé et ils auront qu'à voter le lendemain :p

Reply

Marsh Posté le 30-05-2003 à 14:25:25    

Belgique a écrit :

C'est clair que ce n'est pas la meilleure solution mais une des plus simples. Le nombre de personnes derrière un proxy est assez peu élevé et ils auront qu'à voter le lendemain :p

c'est faux[:spamafote]
(tu crois que chaque machine dans une salle info en fac ou lycée à son ip propre? :heink:)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 30-05-2003 à 16:16:51    

ils sont pas au lycée pour voter na  :p ...
Je propose une solution à son problème étant donnée qu'il ne veut pas de section membres. Puis quel est el but du sondage? Permettre à tout le monde de voter ou dégager une tendance?
Il aura combien de votes par jour? 200? 500? Peu de chances que ces deux personnes soient dans la même salle. Maintenant si son site c'est pour un lycée et qu'ils ont tous la même ip dans le lycée  :D


Message édité par belgique le 30-05-2003 à 16:17:50
Reply

Marsh Posté le 30-05-2003 à 16:46:24    

Belgique a écrit :

Maintenant si son site c'est pour un lycée et qu'ils ont tous la même ip dans le lycée  :D


ben justement c un truc d'école non?
sa premiere solution était pas pire (le cookie disait que le mec avait voté sur tel ou tel sondage)


Message édité par the real moins moins le 30-05-2003 à 17:06:08

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 30-05-2003 à 19:39:49    

Alors,
But du site : Ramener des ados, pour etre lu par les ados, mais aucun rapport avec le college, puisque nous sommes une équipe comprenant des personnes de différents college.
Donc, je ne pense pas que certains voteront depuis le college, et puis bon, s'pas extremement grave.
 
Mais je pense que vous avez mal compris, je veux que les utilisateurs ne peuvent voter qu'une seul fois sur chaque article.
Donc je ne vois pas l'interet du champ "date" dans la bd, ni dans le cookies.
 
Donc moi je vois ca comme ca :
Une table sondages comprenant:
-id(clé primaire), comme d'hab
-idarticles(l'identifiant de l'article avec lequel le sondage est en rapport)
-l'ip du l'utilisateur.
 
Et donc dans les cookies j'écris:
[IP],[idarticles]
donc par exemple, si je vote pour l'article 8:
128.00.0523.0.203,8
Et donc je compare:

Code :
  1. if($ipdelaBD==ipducookies AND $articledelaBD==articlesducookies)
  2. {echo"tu peux pas voter";
  3. exit;}
  4. else
  5. {
  6. //instructions
  7. }


 
Voilà, c'est correct ca ?


Message édité par smilm le 30-05-2003 à 20:24:40
Reply

Marsh Posté le 30-05-2003 à 19:52:09    

je commence a bosser dessus là,j'aimerais savoir comment un cookies peut durer indéfiniment(ou du moins jusqu'a que l'utilisateur les suprimes..)
setCookie("login","toto",time()+360000000000);
Je mets plein de 0 ? ou ya une fonction ?

Reply

Marsh Posté le 30-05-2003 à 20:46:16    

Another problem:
voilà un petit morceau de code

Code :
  1. $ip=$REMOTE_ADDR; //Fonction pour choper l'ip de l'user ,je me trompe pas ?
  2. SetCookie ("idarticle",$id, time()+150);
  3. SetCookie ("ip",$ip, time()+150);


 
Le probleme est :
J'ai plusieurs article, donc les informations de mes cookies font s'écrire les une au dessus des autres.
Donc je ne vois pas trop comment faire.
Peut etre faire un truc du style
SetCookie ("idarticle[]",$id, time()+150); pour que cela soit considéré comme un array, mais bon , j'ai jamais encore vu ca, et puis..un array dans un fichier texte... :pt1cable:  
Enfin, j'ai fais du "google" a fond...mais rien.
Merci d'avance
 
edit:peut etre quelque chose comme ca:

Code :
  1. SetCookie ("idarticle".$id,$id, time()+150);
  2. SetCookie ("ip".$id,$ip, time()+150);


avec la concaténation.


Message édité par smilm le 30-05-2003 à 20:56:26
Reply

Marsh Posté le 30-05-2003 à 23:35:31    

tu peux voir du coté de serialize() pour passer ton array


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 31-05-2003 à 13:09:42    

finalement j'ai laissé tombé les cookies et je viens de faire ca :

Code :
  1. //PROCEDURE DE CHOPPAGE D'IP
  2. $ip =getenv("REMOTE_ADDR" );
  3. $requete="SELECT FROM sondages WHERE idarticle=$id and ip=$ip";
  4. $resultat2=mysqlquery($requete,$connexion);
  5. if(!resultat2)
  6. {
  7. echo"requete $requete impossible";
  8. exit;
  9. }
  10. if(mysql_num_rows($resultat2)==0)
  11. {
  12.     $requete3="INSERT INTO sondages (ip,idarticle) VALUES ($ip,$id)";
  13.     $resultat3=mysql_query($requete,$connexion);
  14.     if(!$resultat3)
  15.     {           
  16.          echo"requete $requete3 impossible";
  17.          exit;
  18.     }
  19.     else
  20.     {
  21.           echo"Vote efféctuer avec succés(chopage d'ip reussi)";
  22.     }
  23. }
  24. if(mysql_num_rows($resultat2)<>0)
  25. {
  26. echo"Vous avez déjà voter pour cette article.";
  27. }


 
Voilà,pourrais je avoir votre avis sur cette technique ?
Et est ce que ce code est "propre" ?


Message édité par smilm le 31-05-2003 à 13:12:38
Reply

Marsh Posté le 31-05-2003 à 13:17:06    

Code :
  1. if(mysql_num_rows($resultat2)!=0)
  2. {
  3. echo"Vous avez déjà voter pour cette article.";
  4. }


Sinon, c'est sur que les ip c'est pa sle mieux étant donnée que la plupart des utilisateurs vont avoir une ip dynamique...


Message édité par RiderCrazy le 31-05-2003 à 13:17:33
Reply

Marsh Posté le 31-05-2003 à 14:01:33    

SmilM a écrit :

Voilà,pourrais je avoir votre avis sur cette technique ?
Et est ce que ce code est "propre" ?


 
T'as pas retenu une seule des choses que l'on t'a dit...


Message édité par gizmo le 31-05-2003 à 14:01:51
Reply

Marsh Posté le 31-05-2003 à 21:53:55    

gizmo a écrit :


 
T'as pas retenu une seule des choses que l'on t'a dit...


 
Merde je croyais avoir répondu cette aprem!
Bon donc:
Je sais bien que les ip varie, que c'est foutu pour les proxy et les connection partagé, mais:
Je ne vais pas utiliser les sessions parce que il faudrait une interface utilisateur avec des comptes ect..
Et ca demande encore du boulot , et puis faudrait que je retape le design.(meme si ce n'est qu'un petit bloc a faire en plus)
Les cookies, je n'en vois pas trop l'utilité, et puis les dates encore moins

Reply

Marsh Posté le 31-05-2003 à 21:59:51    

bah si tu nes vois pas l'utilité des seules choses efficaces pour ton problème, c'est pas la peine qu'on t'aide... [:gizmo]

Reply

Marsh Posté le 31-05-2003 à 22:10:29    

gizmo a écrit :

bah si tu nes vois pas l'utilité des seules choses efficaces pour ton problème, c'est pas la peine qu'on t'aide... [:gizmo]  


 
j'ai trouvé !
Je viens d'écrire sa sur mon tableau blanc :

Code :
  1. $contenue=$ip . $idarticle //$contenue, c'est le contenue du cookies.
  2. SetCookies..//avec $contenue en value
  3. $requete="SELECT FROM sondage WHERE $contenue=ip . article";
  4. //ip . article,sont deux colonnes de mon tableau., ca marche la concaténation en MYSQL ?


 
Bon c'est trés résumé.


Message édité par smilm le 31-05-2003 à 22:10:56
Reply

Marsh Posté le 31-05-2003 à 22:21:41    

rhooo. mais si tu veux absolument n'utiliser que les ip, pourquoi tu rejettes l'idée de la date???

Reply

Marsh Posté le 31-05-2003 à 22:26:07    

gizmo a écrit :

rhooo. mais si tu veux absolument n'utiliser que les ip, pourquoi tu rejettes l'idée de la date???


 
Pourrais tu m'expliquer plus amplement l'idée des dates suprimés tout les 24heures, car je relis,je relis, mais je ne comprends toujours pas l'interet.

Code :
  1. Pour les ips, tu les choppes dans une table séparée ip/date qui vire les entrées vieilles de plus d'un jour, comme ça, tu évites que deux personnes ne se choppent la même ip par le FAI (le même jour, c'est assez invraissemblable).


Message édité par smilm le 31-05-2003 à 22:27:38
Reply

Marsh Posté le 31-05-2003 à 22:29:42    

bon, retenir des ip, vu que c'est dynamique, à part faire chier ceux qui sont derrières un proxy (et encore!), ca ne sert pas à grand chose.
 
Donc, il faut éviter que qq'un qui n'a pas encore voté puisse le faire. La probabilité que qq'un ne se choppe une ip d'un autre qui a déjà voté augmente en fonction du temps (et du nombre de voteur), c'est pour ça qu'il faut purger régulièrement ta table d'ip.
 
De toute façon, cela n'empèchera jamais que celui qui tente de voter 2 fois avec la même connexion.

Reply

Marsh Posté le 31-05-2003 à 22:52:57    

gizmo a écrit :

bon, retenir des ip, vu que c'est dynamique, à part faire chier ceux qui sont derrières un proxy (et encore!), ca ne sert pas à grand chose.
 
Donc, il faut éviter que qq'un qui n'a pas encore voté puisse le faire. La probabilité que qq'un ne se choppe une ip d'un autre qui a déjà voté augmente en fonction du temps (et du nombre de voteur), c'est pour ça qu'il faut purger régulièrement ta table d'ip.
 
De toute façon, cela n'empèchera jamais que celui qui tente de voter 2 fois avec la même connexion.


 
ha ok !
 Je crois que j'ai compris
En fait, vu que l'ip est dynamique,gardé les ip ne sert pas a grand chose, et il n'y a pas de reel solution, donc une personne qui a déjà voter avec l'ip X pour recommencer le lendemain avec l'ip Y, c'est bien ca ?
Et donc puisque, l'ip X peut aller chez une autre personne, qui ira peut etre sur mon site,il faut mieux suprimer un ip qui a plus de 24 heures, enfin bon ,c'est un site a 3visiteurs par jour pour le moment,mais je fais ca pour apprendre PHP/MYSQL et puis bon, des trucs dans ce genre la qui sont bon a savoir.
 
Heu, c'est en SQL qu'on  suprime les ip de plus de 24heures, il faut pas le faire manuellement(aller dans la BD et vérifier chaque jour les dates) comme meme ?
Peut etre avec un fichier PHP qui s'execute tout les jours en "background"(je sais plus le mot exacte) chez mon hebergeur, et dont les instructions sont (en bref):
If(l'enregistrment a plus de 24h)
{
DELETE
}
 
Ou un autre moyen ?

Reply

Marsh Posté le 31-05-2003 à 22:56:11    

oui, tu fais ca en SQL. Tu en profite, à chaque fois que qq'un vote, tu vires les ip trop anciennes dans la même script.

Reply

Marsh Posté le 31-05-2003 à 23:09:08    

Pourquoi les ips, pcq un type peut fausser un sondage en votant 200 fois.. Les ips empêchent ça. et ce n'est pas empêcher un certain nombre de  personnes de voter qui changera la donne. Retenir qui a déjà voté dans des cookies est moins fiable car on peut ne pas accepter les cookies et donc voter autant de fois qu'on veut.
En virant les ips toutes les 24h ça permet à une personne de voter une fois par jour.. c'est pas la mort.


Message édité par belgique le 31-05-2003 à 23:10:35
Reply

Marsh Posté le 31-05-2003 à 23:16:14    

Belgique a écrit :

Pourquoi les ips, pcq un type peut fausser un sondage en votant 200 fois.. Les ips empêchent ça. et ce n'est pas empêcher un certain nombre de  personnes de voter qui changera la donne. Retenir qui a déjà voté dans des cookies est moins fiable car on peut ne pas accepter les cookies et donc voter autant de fois qu'on veut.
En virant les ips toutes les 24h ça permet à une personne de voter une fois par jour.. c'est pas la mort.


 
Heu
oui
Donc je fais la meme chose sans les cookies..
 
 
ra mon clavier est passe en qwerty

Reply

Marsh Posté le 01-06-2003 à 00:02:06    

Tout dépend de ce que tu veux faire.. Mais stocker dans un cookie les numéros de sondages auquels on a déjà participé ne me semble pas être une bonne solution.

Reply

Marsh Posté le 01-06-2003 à 19:34:22    

Belgique a écrit :

Tout dépend de ce que tu veux faire.. Mais stocker dans un cookie les numéros de sondages auquels on a déjà participé ne me semble pas être une bonne solution.


ouai.
 
Donc j'ai teste ca :
 

Code :
  1. //PROCEDURE DE CHOPPAGE D'IP
  2. $ip =getenv("REMOTE_ADDR" );//retourne l'adresse IP de l'utilisateur
  3. echo"$ip";
  4. $requete2="SELECT * FROM sondages WHERE idarticle=$id AND ip=$ip";
  5. $resultat2=mysql_query($requete2,$connexion);
  6. if(!resultat2)
  7. {
  8. echo"requete $requete2 impossible";
  9. exit;
  10. }
  11. if(mysql_num_rows($resultat2)==0) //LIGNE 42
  12. {
  13.     $requete3="INSERT INTO sondages (ip,idarticle) VALUES ($ip,$id)";
  14.     $resultat3=mysql_query($requete3,$connexion);
  15.     if(!$resultat3)
  16.     {
  17.          echo"requete $requete3 impossible";
  18.          exit;
  19.     }
  20.     else
  21.     {
  22.           echo"Vote efféctuer avec succés(chopage d'ip reussi)";
  23.     }
  24. }
  25. if(mysql_num_rows($resultat2)!=0)
  26. {
  27. echo"Vous avez déjà voter pour cette article.";
  28. }
  29. echo"Vote effectué";


 
Et il me renvoi ca, avec une erreur :
 
127.0.0.1
 
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\michael\site web\webzine\design final\note.php on line 42
requete INSERT INTO sondages (ip,idarticle) VALUES (127.0.0.1,8) impossible
Pourtant je ne vois pas le probleme...
 
ps: j'ai pas encore pris en comptes les dates pour l'instant.


Message édité par smilm le 01-06-2003 à 19:35:00
Reply

Marsh Posté le 01-06-2003 à 19:40:25    

:hello:  salut SmilM
executes ta requête dans phpmyadmin pour tester
.... a mon avis il veut que tu proteges ton IP par des quotes  :whistle:  
 
 
genre :
 

Code :
  1. INSERT INTO sondages (ip,idarticle) VALUES ('127.0.0.1',8);


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 01-06-2003 à 23:04:25    

salut  :hello:  
Merci apparament ca marche.
 
Maintenant je m'occupe des dates ,et cette fois ci , je vais utiliser DATE en mysql au lieu de mon habituel VARCHAR, histoire d'apprendre comment ca marche.
Donc, je suis en local là.
 

Code :
  1. //initialisation de la date:
  2. $date =date("d/m/Y" );
  3.     $requete3="INSERT INTO sondages (ip,idarticle,date) VALUES ('$ip',$id,$date)";
  4.     $resultat3=mysql_query($requete3,$connexion);
  5. $requete4="DELETE FROM sondages WHERE date!='$date'";
  6. $resultat4=mysql_query($requete4,$connexion);


Et bien apparament ca marche pas.
Je crois qu'il faut configurer quelque chose au niveau de la BD pour la date, la valeur par défaut.
Donc quand je fais un test, il écrit dans le champ date de ma BD:
2000-00-01
Bizarre..
donc si je change la valeur par default de 2000-00-01 en 00-00-2000 , toujours rien.
Je suis en train de galere un peu sur la doc pendant que je répond
http://www.mysql.com/doc/en/DATETIME.html
donc j'ai essayer en valeur par defaul
DD:MM:YYYY
Toujours rien.
Can you help me ?
ca ne donne toujours rien.

Reply

Marsh Posté le 01-06-2003 à 23:10:46    

utilises la fonction mysql  [:spamafote]  
 
$requete3="INSERT INTO sondages (ip,idarticle,date) VALUES ('$ip',$id, NOW())";  


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 02-06-2003 à 10:21:50    

simogeo a écrit :

utilises la fonction mysql  [:spamafote]  
 
$requete3="INSERT INTO sondages (ip,idarticle,date) VALUES ('$ip',$id, NOW())";  
 


 
Yep ca marche, j'ai fais ca hier mais j'ai oublié de répondre
Merci encore simogeo

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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