验证用户只投票一次

时间:2012-04-24 06:06:47

标签: php javascript jquery ajax cookies

我目前正在关注此tutorial来创建一个简单的投票系统。

除了用户应该只能投票一次的验证部分之外,它工作正常。本教程使用IP,它不适用于具有动态IP的用户

<?php
include("config.php");
$ip=$_SERVER['REMOTE_ADDR'];

if($_POST['id'])
{
$id=$_POST['id'];
$id = mysql_escape_String($id);
//Verify IP address in Voting_IP table
$ip_sql=mysql_query("select ip_add from Voting_IP where mes_id_fk='$id' and ip_add='$ip'");
$count=mysql_num_rows($ip_sql);

if($count==0)
{
// Update Vote.
$sql = "update Messages set up=up+1 where mes_id='$id'";
mysql_query( $sql);
// Insert IP address and Message Id in Voting_IP table.
$sql_in = "insert into Voting_IP (mes_id_fk,ip_add) values ('$id','$ip')";
mysql_query( $sql_in);
echo "<script>alert('Thanks for the vote');</script>";
}
else
{
echo "<script>alert('You have already voted');</script>";
}

$result=mysql_query("select up from Messages where mes_id='$id'");
$row=mysql_fetch_array($result);
$up_value=$row['up'];
echo $up_value;

}
?>

有没有更好的方法来确保用户只投票一次?

3 个答案:

答案 0 :(得分:1)

如何简化

<?php
 //HERE include DB config and set variables
 $result = mysql_query("SELECT * FROM votes WHERE id = '$id' AND ip = '$ip'");
  $count = mysql_num_rows($result);
 if($count > 0){
  echo "<script>alert('You have already voted');</script>";
 }
 else{
  //Update Sets
 }
?>

但最后,您应该使用用户帐户或Cookie。当用户可以清除cookie的浏览器时,用户也可以具有动态IP地址。这也适用于使用一个大型网络和单个IP(免费Wi-Fi网络,学校,工作场所)的用户

我认为制作用户帐户是最好的主意

<?php
 $result = mysql_query("SELECT * FROM votes WHERE username = '$_SESSION[username]' AND id             = '$id'");
?>

答案 1 :(得分:1)

无需数据库存储。而是投票:

set_cookie($_POST['id'], "1", time()+60*60*24*365)

然后当您显示帖子时检查cookie是否设置为:

if(!($_COOKIE[$_POST['id']])){   //if user hasn't voted
  // display vote buttons
}else{
  // don't display vote buttons
}

答案 2 :(得分:0)

另一种确保用户只需投票一次而无需创建用户帐户的方法是创建一个投票系统,用户必须提供他们的电子邮件地址以进行确认。

  1. 用户通过输入他们的电子邮件地址投票;这个地址是 存储在数据库中。
  2. 当用户提交投票时,然后向要求确认投票的地址发送电子邮件
  3. 确认投票后,这是合法投票,并在将来轻松检查
  4. 在流程结束时清除数据库中未经证实的投票
  5. 上述步骤也可用于(略有变化)以确认比赛的年龄或其他重要人口统计信息。我们在客户网站上运行竞赛时使用了这种方法并且运行良好。