【问题标题】:How to program a vote up system?如何编写投票系统?
【发布时间】:2010-11-21 04:06:41
【问题描述】:

我刚开始自学 php。 我正在给自己一些微型项目来推动自己。

到目前为止,我有一个通过 php 表单创建的 MYSQL 数据库。一列是为了业力。 我将数据库表的值显示在 html 表中,并且在每一行的末尾,我想单击一个超链接,比如说一个加号,以将该行的业力级别增加 1。然后加号会消失。

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

【问题讨论】:

  • 真正的问题在哪里?好吧,也许你想要 AJAX。

标签: php mysql counter increment


【解决方案1】:

对于此示例,假设您要对 so-answers 进行投票。这将需要至少三个表:

用户答案投票

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

voteid | userid | answerid | value
----------------------------------
   1   |   12   |   383    |   1
   2   |   28   |   383    |  -1  (negative number would require signed values)

在此示例中,我们看到已记录了两票。用户 12 和 28 都对答案 383 进行了投票。用户 12 喜欢它,并在其支持中添加了 1。用户 28 不喜欢它,从它的支持中减去 1。

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

SELECT * 
FROM votes 
WHERE (userid = 12) 
  AND (answerid = 383)

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

UPDATE votes 
SET value = $votevalue 
WHERE (userid = 12) 
  AND (answerid = 383)

说了这么多,让我们看看 SO 是如何做到这一点的:

当您单击向上投票箭头时,SO 会向如下网址发出请求:

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

在此 URL 中,我们可以看到正在对帖子 #1303528 进行投票。而 vote-type 用 2 表示。这个 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.";
    }
  }

}

【讨论】:

  • 缓存投票计数也是一个好主意,尤其是对于热门问题。
【解决方案2】:

我个人喜欢乔纳森的回答。

但是,如果您觉得您可能需要更多信息,我或许可以提供帮助。

作为一个小型项目,我尝试为我的大学创建一个像 bash.org 这样的报价数据库。
它是使用 MySql 和 PHP 开发的,它的发布/投票功能与您想要完成的非常相似。
它绝不是一个设计良好的网络应用程序。但是,它可能会让您朝着正确的方向前进。

现场测试网站link(温柔点!)

GitHub 上的代码link

我会看看database schemaphp-db-integrationajax to update a vote

代码相当简单直接。需要注意的一点是“filter_input”,这些函数来自 PHP 库,用于清理用户输入以防止 SQL 注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多