Reddit风格的投票按钮

时间:2011-02-11 23:20:17

标签: php jquery ajax

我正在尝试在我的网站上实现一个reddit式投票按钮。我有它运作良好,唯一的问题是用户目前可以无限次投票。我需要它来运行SQL查询并检查数据库,看看他们是否已经投票,然后才接受投票。

问题是:如果投票存在,我在哪里可以将SQL查询放入此AJAX POST中以禁用该按钮?以下是我到目前为止的情况:

$(function(){
    $("a.vote_up").click(function(){
    //get the id



    the_id = $(this).attr('id');

    // show the spinner
    $(this).parent().append("<div id='spinnerDiv' style='width:20px; height:20px; float:right; margin-right:570px;'><img src='images/spinner.gif'/></div>");

    //fadeout the vote-count 
    $("span#votes_count, span#vote_buttons"+the_id).fadeOut("fast");


    //the main ajax request
        $.ajax({
            type: "POST",
            data: "action=vote_up&id="+$(this).attr("id"),
            url: "votes.php?personid=<?php echo $personid;?>&userid=<?php echo $userid;?>",
            success: function(msg)
            {   

                $("span#votes_count"+the_id).html(msg);
                //fadein the vote count
                $("span#votes_count"+the_id).fadeIn();
                //remove the spinner
                $("#spinnerDiv").remove();
                $("span#vote_buttons"+the_id).fadeIn();

            }
        });

    });

2 个答案:

答案 0 :(得分:2)

你不想在那里放一个SQL查询,那不是AJAX。您应该调用一个url处理程序,该处理程序具有执行查询的代码并返回带有结果的json。因此,您在votes.php上的PHP应用程序应该执行此检查,如果此人已经投票,则返回错误。然后你可以设置一个闪存用户已经投票的div。

例如,您的应用可以返回json: {success:false,message:“用户已经投票”}

请参阅: http://api.jquery.com/jQuery.post/关于如何检索json

修改

以下是我正在讨论的工作流程:

在index.php中,你有像现在这样的jquery,并且它会向votes.php发送用户ID以及他们投票的内容。

在votes.php中,您可以获得这些参数。投票php中的逻辑类似于:

$query = sprintf("SELECT * from votes uid='%s' AND vote_id='%s'",
mysql_real_escape_string($uid),
mysql_real_escape_string($vote_id));

if(mysql_query($query)){
   return json_encode(array("status" => 'failure', "message" => "user already voted");
}
else{
   do_vote($uid,$vote_id);
   return json_encode(array("status" => "success"));
}

然后在你的ajax函数中你可以解码它。如果你获得成功,灰色按钮。如果您已经投票错误,请不要计票,灰色按钮。如果没有响应,请保留按钮并告诉用户有错误。

答案 1 :(得分:0)

投票结束后,'votes.php'返回'成功'或其他任何内容,您可以淡出按钮并分离点击事件。

不是在提交每个新投票之前查询,而是在页面构建时ping数据库 - 匹配您投票的对象的ID和用户ID与数据库中的投票,如果它返回,则用户已对此项目进行投票,突出显示他们的投票(upvote arrow或downvote arrow) - 并从他们已点击的箭头中删除点击事件。