我一直在设置奖励投票系统的任务,我不太了解php和mysql。但我比其他任何人都更了解这一点,而我的老板正在度假。但是我一直在重复使用这些代码,这些代码以前留在了我们的系统上,并在今年进行了调整。
基本上投票系统工作正常,我在mysql中设置新表来捕获数据。我在现有代码中发现了一个相当大的缺陷,但我不确定如何修改它。基本上,代码允许人们在此刻多次投票。我希望将每个成员仅限1票,以保持公平。
所以目前,会员使用会员号登录,然后投票。投票存储在mysql表中,然后我可以通过查询数据来累加投票。
我希望有人可以帮我添加一行或两行代码,只需查看会员是否已经投票。当一个成员投票时,他们的成员没有。存储在sql表中以及他们的投票选择。所以也许最好的方法是查看表中是否已经存在memeberid,如果确实存在,请告诉用户他们已经投票 - 或者是这样的话。
<?php
//Insert into volunteer awards
$coach=mysql_real_escape_string($_SESSION['coach']);
$official=mysql_real_escape_string($_SESSION['official']);
$young_volunteer=mysql_real_escape_string($_SESSION['young_volunteer']);
$volunteer=mysql_real_escape_string($_SESSION['volunteer']);
$memberid=$_SESSION['MM_Username'];
$association=$_SESSION['MM_Association'];
$region=$_SESSION['Region'];
$sql_query = mysql_query("INSERT INTO awards_2009_votes (`id`, `member_id`, `region`, `coach`, `official`, `volunteer`, `young_volunteer`) VALUES ('', '$memberid', '$region', '$coach', '$official', '$volunteer', '$young_volunteer')") or die (mysql_error());
?>
由于
答案 0 :(得分:8)
您可以为表添加UNIQUE约束。这是一次性操作 - 每次脚本运行时都不需要执行此操作,这是对表结构的更改。在你的MySQL管理工具中运行它(例如phpMyAdmin,Navicat,HeidiSQL,你有什么):
ALTER TABLE awards_2009_votes ADD UNIQUE (member_id);
在此更改之后,将无法使用相同的成员ID添加第二个投票 - INSERT(或UPDATE)将失败。
这里的优点是检查在数据库中自动完成,因此您不必担心1)使用您的代码检查重复项,或2)人们手动添加多个投票。
正如@ middaparka所说,您应该使用INSERT IGNORE
来避免“重复密钥”错误:
$sql_query = mysql_query("INSERT IGNORE INTO awards_2009_votes (`member_id`, `region`, `coach`, `official`, `volunteer`, `young_volunteer`) VALUES ('$memberid', '$region', '$coach', '$official', '$volunteer', '$young_volunteer')") or die (mysql_error());
if (mysql_insert_id()) {
// row was inserted - vote added
} else {
// row was not inserted - already voted
}
答案 1 :(得分:3)
我不确定您的代码表格结构是什么,但下表结构会限制用户投票到每个主题一票:
用户表
user_id int unsigned not null auto_increment,
username varchar
// and other user info fields
主题表
topic_id int unsigned not null auto_increment,
topic_title varchar
// and other topic info fields
投票表
user_id,
topic_id,
vote_value,
primary key (user_id,topic_id) //this is the constraint that will allow only one vote
答案 2 :(得分:1)
这是一种快速而肮脏的方法:
$sql_query = "SELECT FROM awards_2009_votes WHERE member_id = '$memberid'";
$sql_result = mysql_query($sql_query);
$num_rows = mysql_num_rows($sql_result);
if ($num_rows > 0) {
// this member has already voted
} else {
// carry on
}
正如Piskvor指出的那样,这个解决方案至少有两个限制:
考虑到这些要点,我的建议是首先运行一个脚本来检查您的投票表中是否出现任何重复的member_id值,在每种情况下删除除了一个以外的所有值,然后将UNIQUE约束添加到您的表中。从那里你可以确定你的表永远不会有多个具有相同member_id的行。
答案 3 :(得分:0)
你可以写几行,如下所示,虽然我没有检查过,但那些应该有用......
$result=mysql_query("select count(*) count from awards_2009_votes where member_id='$memberid'");
$has_voted_array=mysql_fetch_array($result);
if($has_voted['count']!=0)
echo "You have already registered youur vote";
else
{
//do normal operation
$sql_query = mysql_query("INSERT INTO awards_2009_votes (id, member_id, region, coach, official, volunteer, young_volunteer) VALUES ('', '$memberid', '$region', '$coach', '$official', '$volunteer', '$young_volunteer')") or die (mysql_error());
}