W tym przykładzie załóżmy, że głosujesz na tak-odpowiedzi. Będzie to wymagało co najmniej trzech tabel:
Użytkownicy , Odpowiedzi , Głosy
W tabeli głosów będzie przechowywana cała historia:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
W tym przykładzie widzimy, że zostały zarejestrowane dwa głosy. Zarówno użytkownicy 12, jak i 28 głosowali na odpowiedź 383. Użytkownikowi 12 podobało się to i dodał 1 do swojego poparcia. Użytkownikowi 28 się to nie podobało i odjął 1 od jego obsługi.
Za każdym razem, gdy użytkownik głosuje, należy najpierw sprawdzić, czy ten użytkownik już głosował na to konkretne pytanie. Jeśli tak, możesz odrzucić dalsze próby głosowania lub zastąpić ich stary głos nowym.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
To bardzo proste przykładowe zapytanie, które powie Ci, czy użytkownik już zagłosował, czy nie. Jeśli zwróci rekordy, wiesz, że głosowali. Możesz odpowiedzieć bardzo ładnym „Przepraszam, już zagłosowałeś”. wiadomość lub możesz ją zastąpić:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Mając to, spójrzmy, jak SO to osiąga:
Po kliknięciu strzałki głosowania w górę SO wysyła żądanie do adresu URL, jak poniżej:
http://stackoverflow.com/posts/1303528/vote/2
W tym adresie URL widzimy, że głos jest oddany w poście #1303528. A typ głosu jest reprezentowany przez 2. To 2 prawdopodobnie oznacza „dodaj jeden”. Możesz użyć bardziej podstawowego adresu URL i użyć czegoś takiego:
vote.php?answerid=383&vote=1
Strona vote.php miałaby kod podobny do następującego:
(ostrzeżenie:nie używaj tego kodu tak, jak jest. Ma być przykładem, a nie rozwiązaniem)
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.";
}
}
}