Sam*_*son 12
对于这个例子,让我们假设你对这样的答案进行投票.这将需要至少三个表:
用户,答案,投票
投票表将保留所有历史记录:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我们看到已经记录了两张选票.用户12和28都在答案383上投票.用户12喜欢它,并在其支持中加1.用户28不喜欢它,并从其支持中减去1.
无论何时用户投票,您都应该首先检查该用户是否已经对该特定问题进行了投票.如果他们有,你可以拒绝任何进一步的投票尝试,或用新的投票覆盖他们的旧投票.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的示例查询,它将告诉您用户是否已经投票.如果它返回记录,你知道他们已经投了票.你可以回答一个非常好的"对不起,你已经投票了." 消息,或者您可以覆盖它:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Run Code Online (Sandbox Code Playgroud)
当您单击向上投票箭头时,SO会将请求发送到如下所示的URL:
http://stackoverflow.com/posts/1303528/vote/2
在此URL中,我们可以看到投票正在#1303528上投票.投票类型由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.";
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1239 次 |
| 最近记录: |