对于此示例,假设您要对 so-answers 进行投票。这将需要至少三个表:
用户、答案、投票
投票表将保存所有历史记录:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
在此示例中,我们看到已记录了两票。用户 12 和 28 都对答案 383 进行了投票。用户 12 喜欢它,并在其支持中添加了 1。用户 28 不喜欢它,从它的支持中减去 1。
任何时候用户投票时,您都应该首先检查该用户是否已经对该特定问题进行了投票。如果有,您可以拒绝任何进一步的投票尝试,或用新的投票覆盖他们的旧投票。
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
这是一个非常简单的示例查询,它将告诉您用户是否已经投票。如果它返回记录,你就知道他们已经投票了。你可以用非常好的回答“对不起,你已经投票了”。消息,或者您可以覆盖它:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
说了这么多,让我们看看 SO 是如何做到这一点的:
当您单击向上投票箭头时,SO 会向如下网址发出请求:
http://stackoverflow.com/posts/1303528/vote/2
在此 URL 中,我们可以看到正在对帖子 #1303528 进行投票。而 vote-type 用 2 表示。这个 2 很可能代表“加一”。您可以使用更基本的网址,并使用以下内容:
vote.php?answerid=383&vote=1
vote.php 页面的代码类似于以下内容:
(警告:不要按原样使用此代码。它只是一个示例,而不是解决方案)
if ($_GET) {
$userid = $_SESSION["userid"]; // assumes the user is logged in via SESSIONS
$answerid = $_GET["answerid"];
$votetype = $_GET["vote"];
$query = "SELECT *
FROM votes
WHERE (userid = {$userid})
AND (answerid = {$answerid})";
$result = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($result) > 0) {
# User has voted
print "Sorry, you are only allowed one vote.";
} else {
# User has not voted, cast the vote
$query = "INSERT INTO votes (userid, answerid, votevalue)
VALUES({$userid},{$answerid},{$vote})";
$result = mysql_query($query) or die(mysql_error());
if (mysql_affected_rows($result) > 0) {
print "Your vote has been recorded.";
}
}
}