首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大拇指向上/向下投票系统

大拇指向上/向下投票系统
EN

Stack Overflow用户
提问于 2013-07-02 12:51:05
回答 1查看 953关注 0票数 0

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

对于表格结构以及如何设计的建议,我们将不胜感激。

我对这样的结构感到困惑,下面的表格是我到目前为止所得到的。

代码语言:javascript
复制
Posts:
post_iD | message | uid_fk(user id) | voteUp | voteDown

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

我甚至需要第二个表来记录谁打了分吗?

代码语言:javascript
复制
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>

代码语言:javascript
复制
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));
    }
}
EN

Stack Overflow用户

发布于 2013-07-02 13:35:00

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

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

代码语言:javascript
复制
SELECT SUM(votes.value) FROM votes WHERE postid = 10

现在,每一次向上投票都被算作1,而每一次下投票都被算作负1,因为这些是存储的实际值。

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

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

代码语言:javascript
复制
UPDATE posts
SET score = (SELECT SUM(value) FROM votes WHERE postid = 10)
WHERE postid = 10
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17417626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档