Untuk contoh ini, mari kita asumsikan Anda memberikan suara pada jawaban-jawaban. Ini akan membutuhkan setidaknya tiga tabel:
Pengguna , Jawaban , Suara
Tabel suara akan menyimpan semua sejarah:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
Dalam contoh ini, kita melihat bahwa dua suara telah dicatat. Pengguna 12 dan 28 sama-sama memilih Jawaban 383. Pengguna 12 menyukainya, dan menambahkan 1 ke dukungannya. Pengguna 28 tidak menyukainya, dan mengurangi 1 dari dukungannya.
Setiap kali pengguna memberikan suara, Anda harus terlebih dahulu memeriksa untuk melihat apakah pengguna tersebut telah memberikan suara pada pertanyaan tertentu. Jika sudah, Anda dapat menolak upaya pemungutan suara lebih lanjut, atau menimpa suara lama mereka dengan yang baru.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Itu adalah contoh kueri yang sangat sederhana yang akan memberi tahu Anda apakah pengguna telah memilih atau belum. Jika itu mengembalikan catatan, Anda tahu mereka telah memilih. Anda dapat menanggapi dengan sangat baik "Maaf, Anda telah memilih." pesan, atau Anda dapat menimpanya:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Karena itu, mari kita lihat bagaimana SO menyelesaikan ini:
Saat Anda mengeklik panah suara atas, SO menjalankan permintaan ke url seperti berikut:
http://stackoverflow.com/posts/1303528/vote/2
Di URL ini, kita dapat melihat pemungutan suara dilakukan di pos #1303528. Dan tipe suara diwakili oleh 2. 2 ini kemungkinan mewakili "tambah satu." Anda dapat menggunakan url yang lebih mendasar, dan menggunakan sesuatu seperti:
vote.php?answerid=383&vote=1
Halaman vote.php akan memiliki kode yang mirip dengan berikut ini:
(peringatan:jangan gunakan kode ini apa adanya. Ini dimaksudkan untuk menjadi contoh, bukan solusi)
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.";
}
}
}