3

我一直在设置一个奖项投票系统的任务,我对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());
?>

谢谢

4

4 回答 4

8

您可以向表中添加 UNIQUE 约束。这是一次性操作 - 您无需在每次脚本运行时都执行此操作,这是对表结构的更改。在你的 MySQL 管理工具中运行它(例如 phpMyAdmin、Navicat、HeidiSQL、what-have-you):

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
}
于 2009-09-15T12:14:15.390 回答
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
于 2009-09-15T12:17:33.777 回答
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 指出的那样,这个解决方案有(至少)两个限制:

  1. 它仅限于包含它的方法,因此它一般不会阻止多次投票-仅通过这种特定方法。(您可以编写一个函数来包含相同的检查,但您仍然必须在用户尝试投票的任何地方调用该函数。)
  2. 它会导致数据库承受额外的压力,这在高流量情况下可能是不可接受的。

考虑到这些要点,我的建议是首先运行一个脚本来检查您的投票表中是否出现重复的 member_id 值,在每种情况下删除除一个之外的所有值,然后将 UNIQUE 约束添加到您的表中。从那里你可以确定你的表永远不会有超过一行具有相同的 member_id。

于 2009-09-15T12:13:46.060 回答
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());
}
于 2009-09-15T12:17:37.767 回答