Comment faire un vote avec sauvegarde de l'ip ?

Petit nouveau ! | 4 Messages

26 déc. 2007, 15:19

Bonjour,

Je m'explique, je désire afficher sur mon site un ensemble de message.
Ces messages pourront etre evalué, il y aura un bouton + et un bouton - grace a ces vote je calculerai le ratio.

Chaque message aura un Idmsg.

Un utilisateur ne pourra voter qu'une seule fois, il faut donc que je retienne l'adresse IP

Pouvez vous m'expliquer comment je dois faire pour sauvegarder l'IP et le message auquel l'utilisateur a voté ?

Je ne vois pas comment faire ca. Car pour un IdMsg, est il possible d'y mettre plusieurs IP ?

Table IP

idmsg-------ip
12--------192.168.1.1
-----------192.168.1.2
-----------192.152.15.1
15--------15.15.15.15
-----------18.45.45.154

Merci de m'éclairer ;)

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

ViPHP
AB
ViPHP | 5818 Messages

26 déc. 2007, 15:33

Bonjour,

Je m'explique, je désire afficher sur mon site un ensemble de message.
Ces messages pourront etre evalué, il y aura un bouton + et un bouton - grace a ces vote je calculerai le ratio.

Chaque message aura un Idmsg.

Un utilisateur ne pourra voter qu'une seule fois, il faut donc que je retienne l'adresse IP

Pouvez vous m'expliquer comment je dois faire pour sauvegarder l'IP et le message auquel l'utilisateur a voté ?
Ce n'est pas la bonne méthode car un IP change d'une visite à l'autre pour un même utilisateur (parfois il peut même changer pour une même visite). Si tu souhaites que les membres ne puissent pas voter plusieurs fois, il faut faire un système d'authentification.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 déc. 2007, 15:37

Ou encore, un système de cookie. C'est pas parfait, mais ça a le mérite de ne pas imposer la connexion (qui est un frein à la participation) et qui t'assure qu'il n'y aura qu'un vote par ordinateur (du moins tant que l'utilisateur ne nettoie pas ses cookies, ce qui est rare, ou qui refuse les cookies, ce qui est encore plus rare)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 4 Messages

26 déc. 2007, 15:43

Merci,

Je ne compte pas créer de "compte utilisateur".

Je vais donc me pencher vers les cookies (j'y connais rien :P)

Vous pouvez m'expliquer comment le cookies fonctionnera ? C'est a dire qu'il y aura un seul cookies pour tout les messages ?

ViPHP
AB
ViPHP | 5818 Messages

26 déc. 2007, 16:31

Merci,

Je ne compte pas créer de "compte utilisateur".

Je vais donc me pencher vers les cookies (j'y connais rien :P)

Vous pouvez m'expliquer comment le cookies fonctionnera ? C'est a dire qu'il y aura un seul cookies pour tout les messages ?
Un cookie par message.
A chaque vote tu envoies le cookie contenant par exemple le titre du message (ou un identifiant spécifique) sur l'ordinateur du visiteur. Pour pouvoir voter tu vérifies que ce cookie ne se trouve pas sur l'ordinateur du visiteur.
Mais comme te l'a indiqué Zeus, il faut que ton application ne soit pas trop sensible, car il suffit d'effacer le cookie pour contourner cette protection et pouvoir voter plusieurs fois. De plus un seul vote sera possible par machine, donc pas optimisé pour les postes multi utilisateurs. Mais bon ça peut suffire pour une bonne approximation si le nombre de votant est conséquent.

Petit nouveau ! | 4 Messages

26 déc. 2007, 16:41

Mais alors imaginons qu'il y ait 200 messages, l'utilisateur vote 200 fois, il aura 200 cookies ?

Ce n'est pas plus simple de faire avec l'IP meme si celle ci change. A l'heure actuelle, une IP tient au minimum une semaine mise a part le fait qu'on peut rebooter le routeur pour en avoir une nouvelle.

Je veux juste qu'il soit impossible de pouvoir voter plusieurs fois à la suite. Apres je ne pense pas qu'un utilisateur s'amuse a cliquer 25 000 fois ^^

Dans une base de donnée, c'est possible d'avoir, pour un message, plusieurs IP ? (comme indiqué dans mon 1er post)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 déc. 2007, 17:09

Je pensais plus faire un unique cookie contenant la sérialisation d'un tableau contenant la liste des tous les messages pour lesquels il a voté ;)

Mais j'aurais du être plus précis dans ma description :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 4 Messages

26 déc. 2007, 17:14

Ah, ben ca c'est niquel !

Je vais voir ca de plus prés !

Merci ;)

ViPHP
AB
ViPHP | 5818 Messages

26 déc. 2007, 17:54

M'oui, la méthode que t'indique Zeus est plus propre mais ça m'étonnerais que tu puisse stocker suffisamment d'informations dans un seul cookie pour mémoriser le résultat du vote sur 200 messages par exemple. Il risque d'être plein avant.

Sinon tu peux effectivement générer un identifiant unique (ex : $id = time().$_SERVER['REMOTE_ADDR']; ou simplement $id = microtime(); ) que tu stokeras dans un cookie et que tu reporteras dans une base de donnée pour gérer ton système de vote.

Un exemple de gestion de vote très comparable au tiens ici
http://www.phpfrance.com/forums/voir_su ... -asc-0.php

EDIT En tous cas ne te sert pas uniquement de l'adresse IP pour générer un identifiant car une fois libéré, l'IP peut être réaffecter à un autre visiteur qui lui ne pourrait plus voter :wink:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 déc. 2007, 18:38

La taille maximale du cookie est de 4ko.
4ko = 4096o donc 4096 caractères.

Imaginons des identifiants de votes dont la longueur moyenne serait 4 chiffres.
Pour chaque chiffre, il y a le séparateur (disons ; ) sauf pour le dernier.
Le nombre de votes possible dans un cookie sera donc
4096 = N*(4+1) - 1
N = (4095/5)
N = 819
Ma solution permet donc de stocker 819 votes ...

Si le système qui lit le cookie le nettoie en enlevant les votes qui sont terminés (par exemple), je pense que cette solution est fiable.

Il faut, par contre, stocker les résultats des votes en BdD, comme le dit AB
Modifié en dernier par zeus le 01 janv. 2008, 19:48, modifié 1 fois.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 83 Messages

01 janv. 2008, 11:35

bonjour
j'ai essayé de comprendre l'histoire des cookies mais c pas évident
j'ai pas très bien compris concrètement comment il faut faire pour faire tout ce que vous avez expliqué
Merci d'avance pour votre réponse

Eléphant du PHP | 445 Messages

01 janv. 2008, 18:33

Tu peux bloquer sur le HOSTNAME.
Il y a beaucoup moins d'utilisateur qui savent changer leur hostname que leur IP publique.

ViPHP
AB
ViPHP | 5818 Messages

01 janv. 2008, 19:00

bonjour
j'ai essayé de comprendre l'histoire des cookies mais c pas évident
j'ai pas très bien compris concrètement comment il faut faire pour faire tout ce que vous avez expliqué
Merci d'avance pour votre réponse
La solution avec cookie telle que l'a indiquée Zeus fonctionne sans identifiant utilisateur mais avec un identifiant de sujet pour lequel on a voté. Pour chaque vote d'un visiteur, on cherche si le cookie existe et si oui s'il contient l'identifiant du sujet. Si le cookie est inexistant, ou s'il existe mais ne contient pas l'identifiant du sujet, on autorise le visiteur à voter pour ce sujet et l'on ajoute ensuite l'identifiant du sujet dans le cookie.
Par exemple après 3 votes le contenu du cookie sera $_COOKIE['votes'] = '25463;351;7841' et il indiquera que le visiteur a déjà voté pour les sujets dont les identifiants sont : 25463, 351 et 7841