在php while循环中使用jQuery函数

在php while循环中使用jQuery函数,php,jquery,mysql,ajax,Php,Jquery,Mysql,Ajax,我无法使用jQuery脚本在帖子上投票。我有一个“frontpage”,上面有来自mysql数据库的帖子列表。在每个帖子上都有一个小投票箱,你可以投赞成票或反对票 jQuery/ajax脚本: <script type="text/javascript"> $(document).ready(function() { $('.plus-button').click(function(){ var postid = <?php echo $postloo

我无法使用jQuery脚本在帖子上投票。我有一个“frontpage”,上面有来自mysql数据库的帖子列表。在每个帖子上都有一个小投票箱,你可以投赞成票或反对票

jQuery/ajax脚本:

<script type="text/javascript">
$(document).ready(function() {

    $('.plus-button').click(function(){
        var postid = <?php echo $postloopid; ?>;
        $('.minus-button').removeClass('disliked');    
        $(this).toggleClass('liked');
        alert(postid);

        $.ajax({
            type:"POST",
            url:"php/votesystem.php",
            dataType : 'html',
            data:'act=like&postid='+postid,
            success: function(data){
                $('.plus-button').html(data);
            }
        });
    });
    $('.minus-button').click(function(){
        var postid = $(this).attr('id');
        $('.plus-button').removeClass('liked');    
        $(this).toggleClass('disliked');

        $.ajax({
            type:"POST",
            url:"php/votesystem.php",
            dataType : 'html',
            data:'act=dislike&postid='+postid,
            success: function(data){
                $('.minus-button').html(data);
            }
        });
    });
});
</script>

$(文档).ready(函数(){
$('.plus按钮')。单击(函数(){
var postid=;
$('.减号按钮').removeClass('不喜欢');
$(this.toggleClass('liked');
警报(postid);
$.ajax({
类型:“POST”,
url:“php/votesystem.php”,
数据类型:“html”,
数据:'act=like&postid='+postid,
成功:功能(数据){
$('.plus button').html(数据);
}
});
});
$('.减号按钮')。单击(函数(){
var postid=$(this.attr('id');
$('.plus button').removeClass('liked');
$(this.toggleClass('disliked');
$.ajax({
类型:“POST”,
url:“php/votesystem.php”,
数据类型:“html”,
数据:'act=不喜欢&postid='+postid,
成功:功能(数据){
$('.减号按钮').html(数据);
}
});
});
});
Votebox.php

<?php
// If postid is from frontpage use $postloopid as $postid
if(isset($postloopid)){
    $postid = $postloopid;
}
$postid = htmlentities($postid, ENT_QUOTES);;

include("connect.php");


//For test purposes
echo $postid;



// If user logged in show votebox
if(isset($_SESSION['username'])){

    $userid = $_SESSION['userid'];

    $sql2 = mysqli_query($connect,"SELECT * FROM posts WHERE id='$postid' AND deleted=0");

    if($sql2){

        $voterow = mysqli_fetch_assoc($sql2);



         $checkupvote = $voterow['upvoters'];

         $checkdownvote = $voterow['downvoters'];

         $checkupvote = explode(" ",$checkupvote);

         $checkdownvote = explode(" ",$checkdownvote);

         if($checkupvote = array_search($userid,$checkupvote) == true){

            echo '<div class="plus-button liked" name="like">+ ' . $voterow['totalupvotes'] . '</div>';

            echo '<div class="minus-button" name="dislike">- ' . $voterow['totaldownvotes'] . '</div>';


         }

         elseif($checkdownvote = array_search($userid,$checkdownvote) == true){

            echo '<div class="plus-button" name="like">+ ' . $voterow['totalupvotes'] . '</div>';

            echo '<div class="minus-button disliked" name="dislike">- ' . $voterow['totaldownvotes'] . '</div>';


         }

         else{

            echo '<div class="plus-button" name="like">+ ' . $voterow['totalupvotes'] . '</div>';

            echo '<div class="minus-button" name="dislike">- ' . $voterow['totaldownvotes'] . '</div>';

         }

    }
    else {
        echo 'No result <br />';

    }

}
else {
    echo 'Cant find user';
}









?>


现在的问题是,当我单击votebox按钮时,我只从while循环中加载的第一篇文章中获取postid。我的另一个问题是,我对名单上所有帖子的总上下票数都发生了变化,而不是具体的帖子


有什么想法吗

好的,让我们来看看jQuery代码(与函数类似):

使用类
plus按钮将单击处理程序绑定到所有元素

$('.plus-button').click(function(){
    var postid = <?php echo $postloopid; ?>;
    $('.minus-button').removeClass('disliked');    
    $(this).toggleClass('liked');
    alert(postid);

    $.ajax({
        type:"POST",
        url:"php/votesystem.php",
        dataType : 'html',
        data:'act=like&postid='+postid,
        success: function(data){
            $('.plus-button').html(data);
        }
    });
});
使用class
plus按钮设置所有元素的内部html

$('.plus-button').click(function(){
    var postid = <?php echo $postloopid; ?>;
    $('.minus-button').removeClass('disliked');    
    $(this).toggleClass('liked');
    alert(postid);

    $.ajax({
        type:"POST",
        url:"php/votesystem.php",
        dataType : 'html',
        data:'act=like&postid='+postid,
        success: function(data){
            $('.plus-button').html(data);
        }
    });
});
您想要的是将posted作为属性存储在posts上,然后使用

var postid = $(this).attr('postid')
仅从当前元素中删除不喜欢的类

$(this)
    .parents('{element containing plus and minus button}')
    .find('.minus-button')
        .removeClass('disliked')
;
存储对已单击元素的引用

var $this = $(this); // Cool guys do this right in the beginning and use only this variable instead of $(this)
然后,在ajax成功处理程序中,您只需要设置所单击按钮的html,这样就可以使用存储在父函数作用域中的引用

$this.html(data);
针对无限滚动脚本进行编辑

当页面的某些部分是动态的时,您希望使用以下方法将单击处理程序绑定到动态内容的静态父元素:

$("#postsParent").on('click', '.plus-button', function () {/*handler*/})

Javascript代码不在循环中,它不能引用
postloopid
。或者,如果是这样,则每次通过循环绑定类的所有按钮,单击它们将运行所有处理程序,并增加所有帖子

您应该将post ID作为数据字段放在按钮中,然后从Javascript访问该字段:

echo '<div class="plus-button liked" data-postid="'+$postid+'" name="like">+ ' . $voterow['totalupvotes'] . '</div>';

echo '<div class="minus-button" data-postid="'+$postid+'" name="dislike">- ' . $voterow['totaldownvotes'] . '</div>';
我对JS做了以下更改:

  • 使用
    $(this).data('postid')
    获取
    postid
  • 仅从同级减号按钮中删除不喜欢的
    类,而不是页面上的所有减号按钮
  • 将返回的HTML放在这个元素中,而不是放在所有的加号按钮中。我在
    上下文:
    参数中传递
    这个
    ,以便
    success
    函数可以引用它

  • 看起来您正在使用html\u实体“转义”您的$postid,使用mysql\u real\u转义来执行此操作,html\u实体绝对不安全。您正在从
    posts
    中选择所有行,然后从
    posts
    中选择一行。这是另外10个不需要进行的查询(考虑到
    LIMIT
    子句)。只需检查
    $row
    是否设置在
    Votebox.php
    的顶部,或者在单个文件中执行此操作。@LJ_1102 Thnx获取建议。@myninjaname我正在使用另一个不包括在该问题中的无限滚动脚本。除了@LJ_1102的注释,请参阅Uhm。。。我知道这是怎么回事,我很喜欢它,但是用class plus按钮对所有元素的点击处理程序是什么呢?你是说像?“点击处理程序”是上面讨论的方法,您的函数处理点击事件。不需要特殊的标记,也要确保只包含脚本一次,而不是每一行。实际上需要两个回复。现在开始工作了。非常感谢:)