【问题标题】:Thumbs up / Thumbs down Voting System赞成/反对投票系统
【发布时间】:2013-07-02 04:51:04
【问题描述】:

我有兴趣从头开始创建这样的功能来学习,我很难理解并能够规划这样的结构。我见过的大多数程序员 检查是否有人已经通过他们的 IP 地址对评论或帖子进行了评分,我特别不喜欢这样,因为每个用户都必须登录才能投票,所以为什么不检查 用户 ID 而不是 iP。我也倾向于选择性能而不是外观,所以有人可以帮助我了解如何开始实现这一点。我已经阅读并搜索了很多帖子 在 SO(StackOverflow) 上,但它们对我来说并不太全面。我还在某处读到有一个 UNIQUE KEY 约束只允许一票,对吗?

对表结构的一些建议以及如何设计将不胜感激。

我对这样的结构感到困惑,下表是我目前所掌握的。

Posts:
post_iD | message | uid_fk(user id) | voteUp | voteDown

PostsRateSystem:
rate_iD | rate_user_iD(uid_fk from posts table) | 

我什至需要第二张表来跟踪谁进行了评分。

if(isset($_POST['plus']) && isset($_POST['minus'])){
    $plus = $_POST['plus'];
    $minus = $_POST['minus'];
    $row = insertRate($post_iD, $plus, $minus);
}

<form method="post" action="">
    <a href="javascript:;" name="plus" id="<?php echo $row['post_iD'];?>">Thumbs Up</a>  
    <a href="javascript:;" name="minus" id="<?php echo $row['post_iD'];?>">Thumbs Down</a>

function insertRate($post_iD, $plus, $minus)
{
    if($plus)
    {
        $sth = $this->db->prepare("UPDATE posts SET voteUp = 1 WHERE post_iD = :postiD");
        $sth->execute(array('postiD' => $post_iD));
    }
    if($minus)
    {
        $sth = $this->db->prepare("UPDATE posts SET voteDown = 1 WHERE post_iD = :postiD");
        $sth->execute(array('postiD' => $post_iD));
    }
}

【问题讨论】:

  • 是的,如果您想防止重复评分,您需要跟踪谁评分了
  • 我不能通过在 Posts 表中添加另一列来按用户 ID 进行比较吗?
  • 只有1个人可以评分?
  • 只评价一次,无论是向下还是竖起大拇指,如果他们想改变它,那么他们可以。
  • 如果有多个用户对帖子进行评分,则需要第二张表

标签: php ajax pdo


【解决方案1】:

如果所有用户都可以对每个帖子进行一次评分,则您必须拥有第三个表 (votes),其中包含用户 ID、帖子 ID 和评分值(1 或 -1)。在该表中,您应该使 userid 和 postid 的组合唯一,因为每个帖子只允许用户投一票。

要获得帖子的总票数,您只需将这些值相加即可:

SELECT SUM(votes.value) FROM votes WHERE postid = 10

现在,每个赞成票都计为 1,每个反对票都计为减一,因为这些是实际存储的值。

要保存投票,您必须先尝试更新表格,因为登录的用户已经可以投票。如果更新失败,可能是因为没有投票,您可以为该帖子的用户插入投票。

为了加快速度,您还可以增加或减少 post 表本身中的投票计数器。那个不跟踪所有用户,但它确实跟踪总分。这样,您不必为投票的每个页面视图查询sum。但请记住,如果使用将他们的赞成票更改为反对票,则您必须从该分数中减去 2,反之亦然。或者,您可以使用SELECT SUM 查询来计算投票并将其存储在帖子中,在每次更改帖子的投票后。因此,在为帖子 10 投票后,请执行以下操作:

UPDATE posts
SET score = (SELECT SUM(value) FROM votes WHERE postid = 10)
WHERE postid = 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2013-10-24
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多