Nasıl oy up sistemi programlamak?

2 Cevap php

I am in the very beginnings of teaching myself php. I am giving myself micro projects to push myself.

Thus far I have a MYSQL database, created through a php form. One Column is for karma. I have the values of the database table display in an html table, and at the end of each row, I would like a click on a hyperlink, lets say a plus sign, to increase that row's karma level by 1. Then the plus sign would go away.

Her satır, bir birincil anahtar olarak bir otomatik artış tamsayı olduğunu gerekir.

2 Cevap

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.";
    }
  }

}

Personally I like Jonathan's answer.

Eğer daha fazla bilgi gerekebilir gibi hissediyorum Ancak, ben yardımcı olabilir.

As a small side project I tried to make a quote database like bash.org for my university.
It was developed using MySql and PHP, it has posting/voting much like what you are trying to accomplish.
It is by no means a well designed web app. However it might be able to get you going in the right direction.

Live testing site: link (nazik olun!)

Code on GitHub, link

db-integration ve ajax to update a vote - Ben database schema bir göz, php alacaktı.

Kod oldukça basit ve düz bir önsöz olduğunu. Bir şey not Bu işlevler SQL enjeksiyonu önlemek için kullanıcı girişleri sterilize etmek için bir PHP kütüphane vardır, "filter_input" s.