2011-02-11 7 views
1

내 사이트에 reddit 스타일의 투표 단추를 구현하려고합니다. 나는 잘 작동하고 있으며, 유일한 문제는 사용자가 현재 무제한의 투표를 할 수 있다는 것입니다. SQL 쿼리를 실행하고 데이터베이스를 확인하여 투표를 수락하기 전에 투표를했는지 확인해야합니다.Reddit 스타일 투표 단추

질문 :이 AJAX POST에 투표가있는 경우 버튼을 사용할 수 없도록 SQL 쿼리를 어디에 넣을 수 있습니까?

당신은 거기에 SQL 쿼리를 넣어하지 않으
$(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

, 즉 AJAX되지 않습니다 : 여기에 지금까지 가지고있는 것입니다. 질의를 수행하고 결과와 함께 json을 리턴하는 코드가있는 url 핸들러를 호출해야합니다. 그러므로 vote.php에있는 PHP 응용 프로그램은이 검사를 수행하고 이미 투표 한 사람이라면 오류를 반환해야합니다. 그런 다음 해당 사용자가 이미 투표 한 div를 설정할 수 있습니다.

그래서 예를 들어 앱 JSON을 반환 할 수 있습니다 : {성공 : 거짓, 메시지 : "사용자가 이미 투표했습니다"}

참조 : 그 JSON

편집

를 검색하는 방법에 대한 http://api.jquery.com/jQuery.post/

다음은 내가 말하는 워크 플로입니다.

index.php에서 지금 가지고있는 jquery가 있으며, 투표 사용자 ID와 투표 대상에 대한 POST를 게시합니다.

Vote.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")); 
} 

그러면 아약스 함수에서 이것을 디코딩 할 수 있습니다. 성공하면 회색 버튼이 나타납니다. 이미 오류가 표시되면 투표를하지 말고 회색으로 표시하십시오. 응답이 없으면 버튼을두고 사용자에게 오류가 있음을 알리십시오.

+0

응답 해 주셔서 감사합니다. 나는 여전히 JSON을 index.php로 돌려 보내는 방법에 대해 혼란 스럽다. vote.php의 PHP가 boolean을 투표 (투표 여부) 한 다음 index.php에서 JSON을 사용하여 그 부울 결과를 얻으시겠습니까? – user547794

+0

귀하의 index.php는 사용자 ID와 투표 대상을 게시해야합니다. 그런 다음 vote.php의 코드가 투표를했는지 확인해야합니다. 그들이 이미 투표하면 JSON 해시를 반환합니다. AJAX에서 javascript는 어떤 URL (예 : votes.php)에 대한 요청을 시작하고 비동기 적으로 응답을받습니다. 내 대답을 당신을 위해 업데이트 할 것입니다. –

+0

투표 할 때/t 클라이언트 측에 세션 var 또는 쿠키를 저장하지 않으시겠습니까? 왜이 가치 서버 측을 DB에 저장해야합니까? –

0

투표가 완료된 후 'votes.php'가 'successful'또는 무엇이든지 반환하면 버튼을 페이드 아웃하여 클릭 이벤트를 분리 할 수 ​​있습니다.

각 새 투표를 제출하기 전에 쿼리하지 말고 페이지가 생성 될 때 데이터베이스에 ping을 실행합니다. 투표중인 개체의 ID와 사용자 ID가 데이터베이스의 투표와 일치하는지 확인합니다. 사용자가 이미이 항목에 투표 한 경우 해당 투표를 강조 표시하고 (upvote 화살표 또는 downvote 화살표) - 이미 클릭 한 화살표에서 클릭 이벤트를 제거합니다.

+2

글쎄, 당신도 투표에 대해 문의해야합니다. 단추를 회색/검정색으로 표시하더라도 누군가가 수동으로 아약스 게시물을 호출하고 무한 시간 투표를하면 투표 할 수 있습니다. 나는 usabilty 목적을 위해 페이지가로드되는 동안 당신이 말하는 것을하는 것이 좋은 생각이지만 동의합니다. –

+0

아, 네 말이 맞아. –

관련 문제