Bu Örneğin, bu kadar-cevapları oylama konum varsayalım. Bu, en azından üç tablo gerektirir:
Users, Answers, Votes
Oy tablo tüm geçmişini yapacak:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
Bu örnekte, iki oy kaydedildi görüyoruz. Kullanıcılar, 12 ve 28 hem Yanıt 383 oylanacak. Kullanıcı 12 onu sevdi ve onun desteği için 1 eklendi. Kullanıcı 28 like it, ve destek 1 çıkarılır vermedi.
Herzaman bir kullanıcı oy, önce o kullanıcı zaten söz konusu soruyu olarak görmek için kontrol etmelisiniz. Onlar varsa, oy başka girişimleri reddetmek, ya da bir yenisi ile eski oy üzerine yazabilirsiniz.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Bu kullanıcı zaten olarak ya da değil eğer size çok basit bir örnek sorgu bulunuyor. Bu kayıtları dönerse, onlar olarak biliyorum. Sen çok güzel bir yanıt verebilir "Üzgünüm, zaten oy verdin." mesajı, ya da bunu üzerine yazabilirsiniz:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Having said that, let's look at how SO accomplishes this:
Eğer yukarı oy oku tıklatın, SO aşağıdaki gibi bir url kapalı bir istek patlar:
http://stackoverflow.com/posts/1303528/vote/2
Bu URL, biz oy post # 1303528 cast ediliyor görebilirsiniz. Ve oy-tip 2 ile temsil edilmektedir. Bu 2 olasılıkla temsil eden "bir tane daha ekleyin." Sen daha temel url kullanmak, ve benzeri bir şey ile gidebiliriz:
vote.php?answerid=383&vote=1
Vote.php sayfa aşağıdaki benzer bir kod olurdu:
(warning: do not use this code as-is. It is meant to be an example, not a solution)
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.";
}
}
}