验证用户是否仅投票一次
validate that user only vote once
我目前正在按照本教程创建一个简单的投票系统。
除了用户只能投票一次的验证部分外,它工作正常。本教程使用 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;
}
?>
有没有更好的方法来确保用户只投票一次?
简化怎么样
<?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'");
?>
不需要数据库存储。相反,在投票时:
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
}
确保用户只投票一次而不创建用户帐户的另一种方法是创建一个投票系统,用户必须提供他们的电子邮件地址进行确认。
- 用户通过输入其电子邮件地址进行投票;此地址是存储在数据库中。
- 当用户提交投票时,向地址发送电子邮件,要求确认投票
- 当投票被确认时,它是合法的投票,将来很容易检查
- 在流程结束时从数据库中清除未经确认的投票
上述步骤也可用于(略有变化)来确认比赛的年龄或其他重要的人口统计信息。我们在客户网站上举办比赛时已经多次使用这种方法,并且效果很好。
相关文章:
- 如何对每个用户每天只允许单击一次的按钮进行编码
- 如何为每个用户只允许一次POST
- 每个用户只显示一次放大弹出窗口
- 每个用户仅显示一次弹出窗口
- 每15天为新用户加载一次放大弹出菜单
- 每个用户/浏览器会话只加载一次Javascript
- c#mvc一次只允许一个用户编辑树视图
- 在用户为下一次输入插入数据后清空文本字段
- Bootsrap模式在页面加载时触发,每个用户一次
- 如何在用户滚动到页面底部时仅加载一次数据
- 如何确保我的喜欢按钮仅被用户按下一次
- 使用 JavaScript 为 IE9 用户重新加载页面一次
- 如何让网页显示一次,并且不再向用户显示
- 使我的简介页面仅按用户或计算机显示一次
- 允许用户添加表单输入字段:为什么 append() 只工作一次
- 每天为每个新用户运行一次 JavaScript 函数
- 限制用户仅单击一次标记
- 如何在 converse.js 上一次登录多个用户
- 只显示一次用户注册屏幕
- ExtJS:如何只存储一次用户的登录信息