jQueryの$ .post()が機能しない
質問
評価システムを作成していますが、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>
基本的にホバー効果があり、星をクリックすると、クリックされた評価の情報と要素のIDとともに、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"> </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_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});
});
また、同じ理由で、1つの<=>呼び出しをもう1つの呼び出しの中にバインドしたくないでしょう。
他のヒント
$_POST['rid']
の代わりに$_POST['id']
を使用していることに気付きました。それがあなたの問題かもしれません。