我目前正在遵循这个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;
}
?>
有没有更好的方法来确保用户只投票一次?
发布于 2012-04-24 14:21:00
简化版怎么样?
<?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'");
?>
发布于 2015-11-19 06:17:16
这样就不需要数据库存储了。相反,在投票时:
set_cookie($_POST['id'], "1", time()+60*60*24*365)
然后,当您显示post时,请检查cookie是否设置为:
if(!($_COOKIE[$_POST['id']])){ //if user hasn't voted
// display vote buttons
}else{
// don't display vote buttons
}
发布于 2013-05-22 19:26:29
另一种确保用户只投票一次而不创建用户帐户的方法是创建一个投票系统,其中用户必须提供其电子邮件地址以进行确认。
上面的步骤也可以用来确认比赛的年龄或其他重要的人口统计信息(有很小的变化)。我们已经在我们的客户网站上使用了相当多的这种方法来运行竞赛,并且运行良好。
https://stackoverflow.com/questions/10292557
复制相似问题