竖起大拇指/拇指向下投票系统

时间:2013-07-02 04:51:05

标签: php ajax pdo

我很有兴趣从头开始创建这样的功能来学习,我很难理解并且能够计划这样的结构。大多数程序员来自我所见过的 检查某人是否已根据他们的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));
    }
}

1 个答案:

答案 0 :(得分:1)

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

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

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

现在,每个upvote都算作一个,每个downvote都减1,因为那些是存储的实际值。

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

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

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