投票系统具有IP历史记录

时间:2013-03-11 17:22:47

标签: php mysql

我正在建立具有投票能力的应用程序(+ 1 / -1)并尝试为此设置简单快速的mysql表结构。到目前为止,我的想法很简单,就像是:

tbl_votes 存储特定对象的投票价值:

CREATE TABLE IF NOT EXISTS `tbl_votes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vote` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

tbl_votes_ips 存储IP< =>投票历史记录,以便某些IP只能投票一次:

CREATE TABLE IF NOT EXISTS `tbl_votes_ips` (
  `vote` int(11) NOT NULL,
  `ip` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

目的是在插入新值时减少SQL调用。目的是在高负荷的网站上使用。这些功能的最佳实践是什么?

请分享您的经验。

P.S。我想为vote-ip对创建唯一键,所以我不选择而只是处理mysql“not unique value”错误:

ALTER TABLE `tbl_votes_ips` ADD UNIQUE (
`vote` ,
`ip`
);

但是当用户改变它的选择时,这种情况不适用。所以无论如何我需要额外打电话来搜索IP和投票。

3 个答案:

答案 0 :(得分:2)

备选方案A

要求用户注册并登录。

备选方案B

  • 设置唯一的Cookie。如果以后访问时出现,请使用它。
  • 连接浏览器用户代理+ IP地址并创建其哈希值。如果cookie不存在,则在未来访问时使用该哈希作为该用户是否已投票的代理。它的可靠性约为85%。
  • 如果您愿意,可以包含除用户代理+ IP之外的更多因素,但这涉及更多因素。有关详细信息,请参阅Panopticlick

替代C

使用Evercookie。如果你走这条路,在你的隐私政策中要非常清楚你正在这样做。公司已经被起诉(一些成功,一些不成功,但无论哪种方式花费他们的时间和金钱)通过使用但不披露使用这些技术。

<强>限制

请记住,任何这些技巧都不是 某人难以解决的问题。多个用户注册只是一个免费的电子邮件帐户。如果您回收有线电视盒,许多家庭互联网连接会获得新IP。智能手机通过沿着街道行驶一英里左右获得新IP。如果用户的系统上有多个浏览器,即使Panopticlick也会失败。

答案 1 :(得分:0)

使用唯一键,例如

PRIMARY KEY (vote, ip)

然后一个简单的

INSERT INTO tbl_votes_ips (vote, ip) VALUES ($vote, $ip) 
ON DUPLICATE KEY UPDATE SET vote=VALUES(vote)

可以作为单个查询完成,mysql将处理决定它是否应该是插入或更新。

而且,正如Eric J上面提到的那样,对于共享公共代理/ nat网关的任何用户群,您的系统将面临失败。并且也不会处理IPv6上的用户。虽然它还不是特别普及,但它已经到了不再忽视IPv6支持的程度。

答案 2 :(得分:0)

每位用户投票怎么样?为用户提供使用电子邮件注册的功能,并确保将确认电子邮件发送到他们的电子邮件中,以便他们进行验证。然后,您获得了唯一的标识符,不允许同一个用户多次投票,无论他们从哪里登录。

如果您希望不允许一组用户投票某个部分,那么您需要创建一个用户类并与users表相关联,以便John和Smith拥有相同的用户类并且只允许投票一次。 / p>