Đối với ví dụ này, giả sử bạn đang bỏ phiếu cho các câu trả lời như vậy. Điều này sẽ yêu cầu ít nhất ba bảng:
Người dùng , Câu trả lời , Phiếu bầu
Bảng bình chọn sẽ lưu giữ tất cả lịch sử:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
Trong ví dụ này, chúng ta thấy rằng hai phiếu bầu đã được ghi lại. Người dùng 12 và 28 đều bỏ phiếu cho Câu trả lời 383. Người dùng 12 yêu thích nó và thêm 1 vào hỗ trợ của nó. Người dùng 28 không thích nó và đã trừ đi 1 khoản hỗ trợ.
Bất cứ khi nào người dùng bỏ phiếu, trước tiên bạn nên kiểm tra xem người dùng đó đã bỏ phiếu cho câu hỏi cụ thể đó chưa. Nếu họ có, bạn có thể từ chối bất kỳ nỗ lực bỏ phiếu nào khác hoặc ghi đè phiếu bầu cũ của họ bằng một phiếu bầu mới.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Đó là một truy vấn ví dụ rất đơn giản sẽ cho bạn biết liệu người dùng đã bỏ phiếu hay chưa. Nếu nó trả về hồ sơ, bạn biết họ đã bỏ phiếu. Bạn có thể trả lời rất hay "Xin lỗi, bạn đã bỏ phiếu rồi." hoặc bạn có thể ghi đè nó:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Đã nói rằng, hãy xem cách SO hoàn thành điều này:
Khi bạn nhấp vào mũi tên ủng hộ, SO kích hoạt một yêu cầu tới một url như sau:
http://stackoverflow.com/posts/1303528/vote/2
Trong URL này, chúng ta có thể thấy phiếu bầu đang được bỏ cho bài đăng số 1303528. Và kiểu biểu quyết được đại diện bằng 2. 2 này có thể đại diện cho "thêm một". Bạn có thể sử dụng một url cơ bản hơn và đi với một cái gì đó như:
vote.php?answerid=383&vote=1
Trang vote.php sẽ có mã tương tự như sau:
(cảnh báo:không sử dụng nguyên trạng mã này. Nó được coi là một ví dụ, không phải là một giải pháp)
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.";
}
}
}