He estado investigando un problema, pero no puedo encontrar la manera de resolverlo o cuál es la solución. Estoy trabajando en mi sitio web usando infinityfree como usuario gratuito. Estoy creando una página de revisión simple donde el usuario puede escribir y luego calificarla con estrellas. Las reseñas se envían a mi base de datos y el texto es correcto, pero la cantidad de estrellas no se agrega a ($_POST["ratedIndex"])
.
Cuando he intentado hacer eco de la variable ratedIndex
, está vacía. Parece que no se envía a través de Ajax según lo previsto, y no puedo entender por qué. La alerta no se activa, pero los clics en las estrellas se registran en el panel de red en el elemento de inspección de cromo. Con suerte, no he sido un completo idiota y me perdí algo esencial ya que soy nuevo en la creación de sitios web, y cualquier ayuda es muy aprendiz.
información del juego.php:
<?php if ($_SERVER["REQUEST_METHOD"] == "POST"){ require_once 'DBConnect.php'; $game; $user; $review; $userid; $ratedIndex; $stmt = $conn->prepare("INSERT INTO reviews(game, user, userid, review, indexStar) VALUES (?,?,?,?,?)"); $stmt->bind_param("sssss",$game, $user, $userid, $review, $ratedIndex); $userid = $_SESSION["userid"]; $game = $gameTitle; $user = $_SESSION["username"]; $review = $_POST["uploadReview"]; $ratedIndex = ($_POST["ratedIndex"]); $stmt->execute(); } ?> <?php $id = $_SESSION["userid"]; $gamename = $gameTitle; $rowzero ="0"; $sql_ifreviewexist ="SELECT * FROM reviews WHERE reviews.game=?"; $exist = $conn->prepare($sql_ifreviewexist); $exist->bind_param('s', $gamename); $exist->execute(); $res = $exist->get_result(); $reviewexist_row = mysqli_num_rows($res); if((isset($_SESSION["username"])) && ($reviewexist_row==$rowzero)) { echo ' <div id="noreviewsExists"> <div class="instructions"><p>Write a review for '.$gamename.'</p></div> <form id="reviewForm" method="POST" action=""> <textarea type="text" id="reviewTextarea" name="uploadReview"></textarea> <div class="reviewStars"> <i class="fa fa-star" data-index="0"></i> <i class="fa fa-star" data-index="1"></i> <i class="fa fa-star" data-index="2"></i> <i class="fa fa-star" data-index="3"></i> <i class="fa fa-star" data-index="4"></i> </div> <div id="submitReview"> <button id="submitButton" type="submit" form="reviewForm">Submit</button> </div> </form> </div>'; ?> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> var ratedIndex = -1; $(document).ready(function () { resetStarColors(); $('.fa-star').on('click', function (){ ratedIndex = parseInt($(this).data('index')); $.ajax({ url: "gameInfo.php", method: "POST", dataType: 'json', data: { ratedIndex: ratedIndex }, success: function (data){ alert("ok"); } }); }); $('.fa-star').mouseover(function () { resetStarColors(); var currentIndex = parseInt($(this).data('index')); setStars(currentIndex); }); $('.fa-star').mouseleave(function () { resetStarColors(); if(ratedIndex != -1) setStars(ratedIndex); }); }); function setStars(max) { for (var i=0; i <=max; i++) $('.fa-star:eq('+i+')').css('color', 'yellow'); } function resetStarColors() { $('.fa-star').css('color', 'black'); } </script>
Editar:
Después de un poco de información de ADyson , he hecho algo como esto:
$test = $_POST["ratedIndex"]; if((isset($_SESSION["username"])) && ($reviewexist_row==$rowzero)) { echo '<div>'.$test.'</div>'; ...}
cuando hago clic en las estrellas, aparece en el panel de red en vista previa
Así que ahora estoy aún más desconcertado en cuanto a por qué no funciona cuando trato de insertarlo en la mesa.
Sé que esta no es la respuesta correcta para la pregunta, pero es una alternativa y tal vez la encuentre útil. La solución que se me ocurrió fue tomar el valor dado por su jquery y establecerlo en un valor de entrada invisible dentro del formulario sumbit.
<form id="reviewForm" method="POST" action=""> <textarea type="text" id="reviewTextarea"name="uploadReview</textarea> <div id="submitReview"> <input type="hidden" id="jqValue" name="jqueryValue" value=""/> <button id="submitButton" type="submit" form="reviewForm">Submit</button> </div>
Luego tome la variable ratedIndex
y déselo a su valor jqValue
de entrada como este
$('.fa-star').on('click', function (){ ratedIndex = parseInt($(this).data('index')); $("#jqValue").val(ratedIndex); });
Por último, llame a su php
$ratedIndex=$_POST["jqueryValue"];
Como dije, esta es solo una forma alternativa de resolver su problema si está atascado y no puede hacer que ajax
funcione, puede usar esto. Lo publiqué porque es posible que no hayas pensado en hacerlo de esta manera.