V tomto příkladu předpokládejme, že hlasujete pro takové odpovědi. To bude vyžadovat alespoň tři tabulky:
Uživatelé , Odpovědi , Hlasy
Tabulka hlasování bude obsahovat celou historii:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
V tomto příkladu vidíme, že byly zaznamenány dva hlasy. Uživatelé 12 a 28 hlasovali pro odpověď 383. Uživateli 12 se to líbilo a přidal 1 na svou podporu. Uživateli 28 se to nelíbilo a odečetl 1 od podpory.
Kdykoli uživatel hlasuje, měli byste nejprve zkontrolovat, zda daný uživatel již hlasoval pro danou konkrétní otázku. Pokud ano, můžete odmítnout jakékoli další pokusy o hlasování nebo přepsat jejich starý hlas novým.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
To je velmi jednoduchý příklad dotazu, který vám řekne, zda uživatel již hlasoval nebo ne. Pokud vrátí záznamy, víte, že hlasovali. Můžete odpovědět velmi milým "Promiňte, už jste hlasovali." zprávu, nebo ji můžete přepsat:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Po tom se podívejme, jak toho SO dosáhne:
Když kliknete na šipku pro hlasování nahoru, SO odešle požadavek na adresu URL, jako je tato:
http://stackoverflow.com/posts/1303528/vote/2
Na této adrese URL vidíme, že se hlasuje o příspěvku #1303528. A typ hlasování je reprezentován 2. Tato 2 pravděpodobně představuje „přidat jeden“. Můžete použít základnější adresu URL a použít něco jako:
vote.php?answerid=383&vote=1
Stránka vote.php by měla kód podobný následujícímu:
(varování:nepoužívejte tento kód tak, jak je. Má sloužit jako příklad, nikoli jako řešení)
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.";
}
}
}