Я пытаюсь внедрить кнопку голосования в стиле 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(); } }); });
Вы не хотите размещать там SQL-запрос, а не AJAX. Вы должны вызвать обработчик URL, который имеет код для выполнения запроса и возвращает json с результатом. Поэтому ваше приложение PHP в votes.php должно выполнить эту проверку и вернуть ошибку, если человек уже голосовал. Затем вы можете установить div, который будет мигать, который пользователь уже проголосовал.
Так, например, ваше приложение может вернуть json: {success: false, message: «пользователь уже голосовал»}
см. http://api.jquery.com/jQuery.post/ о том, как получить этот json
РЕДАКТИРОВАТЬ
Вот рабочий процесс, о котором я говорю:
В index.php у вас есть jquery, как у вас есть, и он POSTs на vote.php идентификатор пользователя и то, что они голосуют.
В 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 вы можете декодировать это. Если вы получите успех, нажмите кнопку серого цвета. Если вы получили уже проголосовавшую ошибку, не учитывайте голос и кнопку серого цвета. Если вы не получите ответа, оставьте кнопку и сообщите пользователю, что произошла ошибка.
После того, как голосование будет отменено и что «vote.php» вернется «успешно» или что-то еще, вы можете отменить кнопку и отделить событие клика.
Вместо запроса перед отправкой каждого нового голосования, ping база данных по мере создания страницы – сопоставление идентификатора объекта, на который вы голосуете, и идентификатора пользователя против голосов в базе данных, и если он вернется, что пользователь уже проголосовали за этот пункт, подсвечивают голосование по их делу (стрелка вверх или стрелка вниз) – и удаляйте событие щелчка по стрелке, которую они уже нажали.