سؤال

وأنا صنع نظام تصنيف، ولدي رمز مسج التالية على صفحة index.php بلدي:

<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، مع معلومات عن النقر على تصنيف ومعرف العنصر. تحت هذا السيناريو لدي بعض 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 [ 'تقييم'] و $ _POST [ 'التخلص'] ل_GET $ ووضع المعلومات int أنه رابط، على سبيل المثال، send.php؟ ID = 1 & تقييم = 4، كان يعمل، ويحصل على تحديث قاعدة البيانات. ومع ذلك، عندما كنت اضغط على النجوم، لا يتم تحديث قاعدة البيانات. بعد العبث مع البرنامج النصي أدركت أن هذا المنصب يجب أن يكون يعمل، إلا أن عوائد معرف ك 0.

لاختبار هذا أبعد أضع هذا في وظيفة فوق:

document.write(current_star+rid);

لمعرفة ما تم إرجاعها. ويبدو أن المشكلة تكون أن عدد التي تم إرجاعها يتم ضرب بمقدار مرة وأنا تحوم فوق العناصر. حتى لو كنت تحوم فوق ربما 6 من النجوم، ثم current_star وID سيتكرر 6 مرات.

وأشعر أنا قريب جدا من الحصول على هذا العمل، وقد أي شخص حصل على أي فكرة ما هو مع ذلك؟ يرجع الفضل في ذلك مسبقا.

هل كانت مفيدة؟

المحلول

والشيء المهم أن ندرك حول معالجة الحدث مسج هو أنه-التسجيل مقرها، وهذا يعني أن مسج يسمح لك تسجيل <م> متعددة الاسترجاعات لأي حدث معين، وأنها سوف تحتج عليها في الترتيب التي كانوا مرتبطين.

والسبب ترونه المتكررة current_star وid القيم لأن اصلتم ملزمة المزيد والمزيد من الأحداث على كل تحوم. وذلك لأن وجود مكالمة 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});
});

وأنت أيضا ربما لا تريد ربط الدعوة hover() واحدة داخل الأخرى، للسبب نفسه.

نصائح أخرى

ولقد لاحظت أنك قد استخدمت $_POST['rid'] بدلا من $_POST['id']. قد يكون هذا هو مشكلتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top