$ .Post () em jQuery não funciona
Pergunta
Eu estou fazendo um sistema de classificação, e eu tenho o seguinte código jQuery na minha página 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>
Basicamente há um efeito hover e então quando você clicar na estrela, ele vai enviar um pedido de post para send.php, com a informação sobre a classificação clicado e o id do elemento. Abaixo este script eu tenho algum PHP que se parece com isso:
<?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
}
?>
E depois, claro, eu tenho alguns CSS para torná-la agradável.
Os olhares de arquivo send.php como este:
<?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());
}
}
?>
Existem 3 colunas de classificação na tabela de banco de dados; total_rating: classificações totais (todas as avaliações de somados). classificação: a classificação de corrente TOTAL_RATINGS:. a quantidade de classificações
O problema é que, se eu mudar o $ _ POST [ 'rating'] e $ _ POST [ 'livrar'] a $ _GET e colocar o int informação que URL, por exemplo, send.php? Id = 1 & classificação = 4, ele funciona, eo banco de dados é atualizado. No entanto, quando eu pressionar as estrelas, o banco de dados não é atualizado. Depois de brincar com o roteiro, percebi que o cargo deve trabalhar, no entanto, os id retorna como 0.
Para testar isso mais eu colocar isso na função de clique:
document.write(current_star+rid);
Para ver o que foi devolvido. O problema parece ser que o número que é devolvido é multiplicado pela quantidade de vezes que eu passar o mouse sobre elementos. Então, se eu passar o mouse sobre talvez, 6 das estrelas, então o current_star e ID será repetido 6 vezes.
Eu sinto que estou tão perto de conseguir isso para o trabalho, alguém tem alguma idéia o que está acontecendo com ele? Agradecemos antecipadamente.
Solução
E coisa importante a perceber sobre manipulação de eventos do jQuery é que ele é baseado em registro, o que significa que jQuery permite registrar vários retornos de chamada para qualquer evento particular, e ele vai chamá-los na ordem em que foram obrigados.
A razão que você está vendo valores current_star
e id
repetidas é porque você manter a ligação mais e mais eventos em cada hover. Isto é porque tem a sua chamada click()
dentro de sua chamada hover()
, portanto, cada vez que você passar, você vai ligar um outro evento click ().
Tente vinculativo seu evento click()
fora seu evento em foco, usando algo parecido com isto:
$("[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});
});
Você também provavelmente não deseja vincular uma chamada hover()
dentro do outro, pelo mesmo motivo.
Outras dicas
Eu notei que você usou $_POST['rid']
vez de $_POST['id']
. Pode ser que é o seu problema.