如何编制投票系统?

Nir*_*evy 2 php mysql counter increment

我正在教自己php的开始.我正在给自己微观项目推动自己.

到目前为止,我有一个MYSQL数据库,通过php表单创建.一栏是因果报应.我将数据库表的值显示在html表中,并且在每行的末尾,我想点击一个超链接,让我们说一个加号,将该行的业力级别增加1.然后加号会消失.

我应该每行都有一个自动增量整数作为主键.

Sam*_*son 12

对于这个例子,让我们假设你对这样的答案进行投票.这将需要至少三个表:

用户,答案,投票

投票表将保留所有历史记录:

voteid | userid | answerid | value
----------------------------------
   1   |   12   |   383    |   1
   2   |   28   |   383    |  -1  (negative number would require signed values)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我们看到已经记录了两张选票.用户12和28都在答案383上投票.用户12喜欢它,并在其支持中加1.用户28不喜欢它,并从其支持中减去1.

无论何时用户投票,您都应该首先检查该用户是否已经对该特定问题进行了投票.如果他们有,你可以拒绝任何进一步的投票尝试,或用新的投票覆盖他们的旧投票.

SELECT * 
FROM votes 
WHERE (userid = 12) 
  AND (answerid = 383)
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的示例查询,它将告诉您用户是否已经投票.如果它返回记录,你知道他们已经投了票.你可以回答一个非常好的"对不起,你已经投票了." 消息,或者您可以覆盖它:

UPDATE votes 
SET value = $votevalue 
WHERE (userid = 12) 
  AND (answerid = 383)
Run Code Online (Sandbox Code Playgroud)

话虽如此,让我们看看SO如何实现这一点:

当您单击向上投票箭头时,SO会将请求发送到如下所示的URL:

    http://stackoverflow.com/posts/1303528/vote/2

在此URL中,我们可以看到投票正在#1303528上投票.投票类型由2表示.这可能代表"添加一个".您可以使用更基本的网址,并使用以下内容:

    vote.php?answerid=383&vote=1

vote.php页面的代码类似于以下内容:

(警告:不要按原样使用此代码.它只是一个示例,而不是解决方案)

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

}
Run Code Online (Sandbox Code Playgroud)