当用户登录并在产品中给出评级时,我在 PHP 星级中遇到了问题,数据被输入到表中,在这段时间里我也更新了评级,但问题是当我注销然后再次使用我的会话 ID 输入时,数据行没有更新,相反,它将再次使用用户ID进行产品评级,但数据库中的产品字段同时为空。包含 jQuery 和 PHP 代码:
$(function(){
$('.rating').barrating({
theme: 'fontawesome-stars',
onSelect: function(value, text, event){
// Get element id by data-id attribute
var el = this;
var el_id = el.$elem.data('id');
// rating was selected by a user
if(typeof(event)!=='undefined'){
var split_id = el_id.split("_");
var productId = split_id[1]; // productId
// AJAX Request
$.ajax({
url: 'rating_ajaxData.php',
type: 'post',
data: {productId:productId,rating:value},
dataType: 'json',
success: function(data){
// Update average
var average=data['averageRating'];
$('#avgrating_'+productId).text(average);
}
});
}
}
});
});
rating_ajaxData.php
<?php
require 'lib/Session.php';
Session::init();
require 'lib/Database.php';
require 'classes/Customer.php';
$cmr = new Customer();
$db = new Database();
$cmrId = Session::get("customerId");
if(isset($_POST['productId']) && isset($_POST['rating'])){
$productId = $_POST['productId'];
$rating = $_POST['rating'];
//$ratingProcess = $cmr->processRatingByUser($productid,$rating);
$query = "SELECT COUNT(*) AS cntproduct FROM tbl_rating WHERE cmrId = '$cmrId' AND productId = '$productId'";
$result = $db->select($query)->fetch_assoc();
$count = $result['cntproduct'];
if($count==0){
$insertquery = "INSERT INTO tbl_rating(cmrId,productId,rating) VALUES('$cmrId','$productId','$rating')";
$ratingInsert = $db->insert($insertquery);
//return $ratingInsert;
}else{
$updtquery = "UPDATE tbl_rating
SET
rating = '$rating'
WHERE cmrId = '$cmrId' AND productId = '$productId'";
$ratingupdate = $db->update($updtquery);
//return $ratingupdate;
}
//get average
$avgratingquery = "SELECT ROUND(AVG(rating),1) as averageRating FROM tbl_rating WHERE productId = '$productId'";
$avgresult = $db->select($avgratingquery)->fetch_assoc();
$averageRating = $avgresult['averageRating'];
$return_arr = array("averageRating"=>$averageRating);
echo json_encode($return_arr);
}
?>
始终检查$productId是否大于 0。它将阻止代码执行并解决问题。在这种情况下,只需更改isset($_POST['productId'])
!empty($_POST['productId'])
.
...
require 'lib/Session.php';
Session::init();
require 'lib/Database.php';
require 'classes/Customer.php';
$cmr = new Customer();
$db = new Database();
$cmrId = Session::get("customerId");
if(!empty($_POST['productId']) && isset($_POST['rating'])){
$productId = $_POST['productId'];
$rating = $_POST['rating'];
//$ratingProcess = $cmr->processRatingByUser($productid,$rating
...
这是您正在处理的问题吗?
更好的解决方案,多做一点工作
更好的方法是将表中cmrId
和productId
设置为唯一tbl_rating
,而不是在重复键更新时使用 mysql 插入 (http://www.mysqltutorial.org/mysql-insert-or-update-on-duplicate-key-update/(前任。
INSERT INTO tbl_rating (cmrId,productId,rating) VALUES('$cmrId','$productId','$rating')
ON DUPLICATE KEY UPDATE rating='$rating'