我正在制作评级系统,我在index.php页面上有以下jQuery代码:

<script type="text/javascript">

$(document).ready(function() {

    $("[id^=rating_]").hover(function() {

        var rid = $(this).attr("id").split("_")[1];
        $("#rating_"+rid).children("[class^=star_]").children('img').hover(function() {

            $("#rating_"+rid).children("[class^=star_]").children('img').removeClass("hover");

            /* The hovered item number */
            var hovered = $(this).parent().attr("class").split("_")[1];
            var hovered2 = $(this).parent().attr("class").split("_")[1];

            while(hovered > 0) {
                $("#rating_"+rid).children(".star_"+hovered).children('img').addClass("hover");
                hovered--;
            }

            $("#rating_"+rid).children("[class^=star_]").click(function() {
                var current_star = $(this).attr("class").split("_")[1];

                $.post("send.php", {rating: current_star, id: rid});
            });
        });

    });




});

</script>

基本上是悬停效果,然后当你点击星星时,它会向send.php发送一个帖子请求,点击评级的信息和元素的id。在这个脚本下面我有一些看起来像这样的PHP:

<?php


$query = mysql_query("SELECT * FROM test");

while($row = mysql_fetch_array($query)) {
    $rating = (int)$row[rating];
    ?>
    <div id="rating_<?php echo $row[id]; ?>">
    <span class="star_1"><img src="star_blank.png" alt="" <?php if($rating > 0) { echo"class='hover'"; } ?> /></span>
    <span class="star_2"><img src="star_blank.png" alt="" <?php if($rating > 1.5) { echo"class='hover'"; } ?> /></span>
    <span class="star_3"><img src="star_blank.png" alt="" <?php if($rating > 2.5) { echo"class='hover'"; } ?> /></span>
    <span class="star_4"><img src="star_blank.png" alt="" <?php if($rating > 3.5) { echo"class='hover'"; } ?> /></span>
    <span class="star_5"><img src="star_blank.png" alt="" <?php if($rating > 4.5) { echo"class='hover'"; } ?> /></span>
    <div class="clearleft">&nbsp;</div>
    </div>
    <br />
    <?php   
}

?>

然后当然我有一些CSS让它看起来不错。

send.php文件如下所示:

<?php

mysql_connect("localhost", "admin", "") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());


$rating = (int)$_POST['rating'];
$id = (int)$_POST['rid'];



$query = mysql_query("SELECT * FROM test WHERE id = '".$id."'") or die(mysql_error());

while($row = mysql_fetch_array($query)) {

    if($rating > 5 || $rating < 1) {
        echo"Rating can't be below 1 or more than 5";
    }
    else {

        $total_ratings = $row['total_ratings'];
        $total_rating = $row['total_rating'];
        $current_rating = $row['rating'];

        $new_total_rating = $total_rating + $rating;
        $new_total_ratings = $total_ratings + 1;
        $new_rating = $new_total_rating / $new_total_ratings;


        // Lets run the queries. 

        mysql_query("UPDATE test SET total_rating = '".$new_total_rating."' WHERE id = '".$id."'") or die(mysql_error());
        mysql_query("UPDATE test SET rating = '".$new_rating."' WHERE id = '".$id."'") or die(mysql_error());
        mysql_query("UPDATE test SET total_ratings = '".$new_total_ratings."' WHERE id = '".$id."'") or die(mysql_error());
    }

}




?>

数据库表中有3个评级列; total_rating:总评分(所有评级加在一起)。 评级:当前评级 total_ratings:评分数量。

问题是,如果我将$ _POST ['rating']和$ _POST ['rid']更改为$ _GET并将信息放在url中,例如send.php?id = 1 <!> amp; rating = 4,它有效,数据库也会更新。但是,当我按下星标时,数据库不会更新。搞乱脚本后,我意识到帖子必须正常工作,但id返回为0.

为了进一步测试,我把它放在点击功能中:

document.write(current_star+rid);

查看返回的内容。问题似乎是返回的数字乘以我将鼠标悬停在元素上的次数。因此,如果我将6个星星悬停在其上,那么current_star和ID将重复6次。

我觉得我离这个工作太近了,有没有人知道它有什么用呢?提前谢谢。

有帮助吗?

解决方案

重要的是要了解jQuery的事件处理是基于注册表,这意味着jQuery允许您为任何特定事件注册多个回调,并且它将按顺序调用它们他们受到约束。

您看到重复current_starid值的原因是因为您在每次悬停时都会越来越多地绑定事件。这是因为在您的click()电话中进行了hover()电话,因此每次悬停时,您都会绑定另一个click()事件。

尝试在悬停事件之外绑定您的<=>事件,使用以下内容:

$("[id^=rating_]").children("[class^=star_]").click(function() {
        var rid = $(this).parent().attr("id").split("_")[1];
        var current_star = $(this).attr("class").split("_")[1];

        $.post("send.php", {rating: current_star, id: rid});
});

出于同样的原因,你可能也不想在另一个内部绑定一个<=>调用。

其他提示

我注意到您使用了$_POST['rid']而非$_POST['id']。可能那是你的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top