この例では、そう答えに投票していると仮定しましょう。これには、少なくとも3つのテーブルが必要です。
ユーザー 、回答 、投票
投票テーブルにはすべての履歴が保持されます:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
この例では、2つの投票が記録されていることがわかります。ユーザー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は次のようなURLにリクエストを送信します。
http://stackoverflow.com/posts/1303528/vote/2
このURLでは、投稿#1303528に投票が行われていることがわかります。また、投票タイプは2で表されます。この2は、「1を追加」を表す可能性があります。より基本的なURLを使用して、次のようにすることができます:
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.";
}
}
}