0

我需要为每个帖子获取一个赞按钮,这样每次 while 返回结果时,每个结果都有一个独特的赞按钮,如果这个人可以投票给一个,我现在遇到的问题就是这样,所有其他单独的帖子都被屏蔽了,因为他们已经投票了,有什么建议吗?如果您需要推荐我想要拥有的类似系统,我需要它来像这个网站一样。http://fmylife.com/ 他们的结构就像我正在寻找的那样

while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    ?>
    <div class="wrapper">
        <div class="submissions">
            <div class="logo-logo"><h2>Quotr.</h2>
                <div class="checkboxes">
                    <?php echo htmlentities($row["formtype"]); ?>
                </div>
            </div>
            <div class="top-submit">
                &#8220;<?php echo htmlentities($row["actual_quote"]); ?>&#8221;
            </div>
            <div class="poster">
                - <?php
                    echo htmlentities($row["poster"]);

                    if(isset($row3["voted"]) && isset($row3["ip"]))
                    {
                        echo "You have already voted for this.";
                    }
                    else
                    {
                        ?>
                        <form action="" method="post">
                            <input type="submit" name="like" value="like" />
                            <input type="submit" name="dislike" value="dislike" />
                        </form>
                        <?php
                    }
                ?>
                <div class="like"></div>
                <div class="dislike"></div>
            </div>
            <!-- use select to get the items to stay on the page-->
        </div>
    </div>
    <?php
}
?>

这是“喜欢”按钮/不喜欢的代码:

$likes = (empty($_POST['like'])) ? : $_POST['like'] ;
$dislikes = (empty($_POST['dislike'])) ? : $_POST['dislike'] ;
$ip = $_SERVER['REMOTE_ADDR'];

if(isset($_POST['like'])){
    $likes1 = $likes+1;
    $voted1 = $voted+1;
    $query2 = $db->prepare("INSERT INTO voters (voted, ip) VALUES ( :voted, :ip)");
    $query2->bindParam(':voted', $voted1, PDO::PARAM_STR);
    $query2->bindParam(':ip', $ip, PDO::PARAM_STR);  
    $query2->execute();
    header("Location: like.php?");
    $update1 = $db->prepare("INSERT INTO votes (likes) VALUES ( :likes)");
    $update1->bindParam(':likes', $likes1, PDO::PARAM_STR);
    $update1->execute();
}

if(isset($_POST['dislike'])){
    $dislikes1 = $dislikes+1;
    $voted1 = $voted+1;
    $query2 = $db->prepare("INSERT INTO voters (voted, ip) VALUES ( :voted, :ip)");
    $query2->bindParam(':voted', $voted1, PDO::PARAM_STR);
    $query2->bindParam(':ip', $ip, PDO::PARAM_STR);  
    $query2->execute();
    header("Location: like.php?");
    $update1 = $db->prepare("INSERT INTO votes (dislikes) VALUES ( :dislikes)");
    $update1->bindParam(':dislikes', $dislikes1, PDO::PARAM_STR);
    $update1->execute();
}
$stmt = $db->query("SELECT * FROM voters");
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$row3 = $stmt->fetch();
4

1 回答 1

0

我认为你会从代码中退后一步并考虑你想要完成的事情而受益。当用户“喜欢”某物时,他们喜欢什么?大概是报价单?

所以我认为你需要一个与用户、报价和喜欢相关的数据模型。

有几种不同的方法可以做到这一点,但我建议先在纸上画出来。使用您的数据库模式,投票表只需要一个整数。

只是建立在你已经拥有的基础上,试着像这样思考这个问题:

Votes
-----
voter_id
quote_id
value

然后在你的 while 循环中,你可以创建一个类似的表单(这是伪代码):

<form action="" method="post"> 
  <input type="hidden" name="quote_id" value="<?php echo $row['id']; ?>" />
  <input type="submit" name="Dislike" value="-1" />         
  <input type="submit" name="Like" value="1" />         
</form>

你可以在你的投票表中插入一条记录,在你将它插入数据库之后,跟踪他们投票的报价以及选民的 ID。(旁注:验证用户或跟踪用户会话可能是比通过 IP 跟踪更好的方法,但您可以稍后再担心)

鉴于该模式,您现在可以查询该选民之前是否曾投票支持该 quote_id。或者总结一个 user_id 有多少喜欢或不喜欢的投票。

只是一些思考的食物。希望能帮助你走上正确的道路。

于 2014-07-03T13:19:43.093 回答