Php AJAX不分离JSON字符串
我正在使用星级系统来显示SQL中的评级数据。每个可以评级的项目都有唯一的标识符变量$id,评级表中的每个评级都有唯一的标识符$storyidr。我希望此脚本显示:Php AJAX不分离JSON字符串,php,ajax,json,Php,Ajax,Json,我正在使用星级系统来显示SQL中的评级数据。每个可以评级的项目都有唯一的标识符变量$id,评级表中的每个评级都有唯一的标识符$storyidr。我希望此脚本显示: 平均评级 对项目进行评级的次数 这些值是可撤销的,但它们一起显示在页面上,我看不出如何将它们分开。例如,对于平均评分为4且评分为200次的项目。当用户单击时,数据通过AJAX返回,如下所示: 对于“响应1”4“200” 对于“response2”4“200” 我希望能够将它们分开,使其看起来像: 对于“响应1”4 对于'resp
- 对于“响应1”4“200”
- 对于“response2”4“200”
- 对于“响应1”4
- 对于'response2'200
<div id="products" style="">
<div class="rateit" data-storyidr="<?php echo $id; ?>">
</div>
<div class="averagevote">
<div style="display:block;" id="response<?php echo $id; ?>"><?php echo $avgratep; ?></div><br>
<div style="display:block;" id="response2<?php echo $id; ?>">RaTeD <?php echo $rankcount; ?> TiMeS</div>
</div>
</div>
<?php endwhile; mysqli_close($connection); ?>
<script type ="text/javascript">
$('#currentslide .rateit').bind('rated reset', function (e) {
var ri = $(this);
var value = ri.rateit('value');
var storyidr = ri.data('storyidr');
ri.rateit('readonly', true);
$.ajax({
dataType : 'json',
url: 'rate.php',
data: {storyidr: storyidr, value: value},
type: 'POST',
success: function (data) {
$('#response'+storyidr).replaceWith('Avg rating ' + data.avg + '/5');
$('#response2'+storyidr).replaceWith('Rated ' + data.cnt + ' times');
},
error: function (jxhr, msg, err) {
$('#response').append('<li style="color:red">' + msg + '</li>');
}
});
});
</script>
您应该只使用一次json\u encode()
,并且只回显该函数的结果。多次这样做会使您的json无效:
else
{
$results = array();
$results['av'] = $avrankr;
$results['cnt'] = $countrank;
echo json_encode($results);
}
然后,在javascript中,您可以直接访问data.av
和data.cnt
:
$('#response'+storyidr).replaceWith('Avg rating ' + data.av +'/5');
$('#response2'+storyidr).replaceWith(data.cnt);
您还可以在@barell提到的ajax调用中设置dataType
参数,但通常jQuery已经正确地解决了这个问题
编辑:要避免出现未定义的错误,您应该执行以下操作:
$results = array('status' => 'fail');
...
if () {
...
if ($result)
{
$results['status'] = 'success';
$results['av'] = $avrankr;
$results['cnt'] = $countrank;
}
}
echo json_encode($results);
现在,您可以首先在ajax调用的成功回调中检查数据。状态
,并采取适当的操作:
success: function (data) {
if (data.status === 'fail') {
// show a warning message somewhere, this is just an example
alert('No results found!');
} else {
$('#response'+storyidr).replaceWith('Avg rating ' + data.av + '/5');
$('#response2'+storyidr).replaceWith('RaTeD ' + data.cnt + ' TiMeS');
}
},
我认为问题在于你没有设置正确的标题。在php文件中,在任何输出之前,输入以下内容:
header('Content-type: text/json');
另外,不要写入两个对象,而是将其作为数组写入:
echo json_encode(array('avg' => $avrankr, 'cnt' => $countrank));
现在应该可以了
然后,在Javascript中,您将访问以下数据:
$('#response'+storyidr).replaceWith('Avg rating ' + data.avg +'/5');
$('#response'+storyidr).replaceWith(data.cnt); // Suppose you want the count here
$.ajax({dataType:'json',…})代码>您可以使用JS文件,在这里您可以使用AJAX调用。就像其他选项一样…@lazel删除括号并在问题中添加代码行是不合适的。提出建议后,我得到一个错误:“Avg评级未定义”我将编辑代码以包含更改。我认为这是jquery错误?谢谢你@jeroen!如果可能,请提供可建议的解决方案@buzrw您似乎已经在php脚本中输入了if
循环。您应该在success函数(javascript)中执行console.log(data)
,以查看它到底包含什么。我不认为php会给出“未定义”的错误代码。我认为这是一个jquery错误@jeroen@buzrw是的,但是当您在php脚本中输入if(!$result)
部分时,您没有设置正确的数组变量,因此当您尝试访问它们时,它们将在javascript中未定义。您应该首先检查数据。状态
,要使其完整,您应该添加$results['status']='success'在else
部分中的code>,以便在ajax调用中返回结果时始终定义它。您刚刚解决了它。而且,我一直都需要这个:数据类型:“json”,如果没有它,data.avg和data.cnt是不可理解的。我在写这篇文章时使用了一个基于aspx的代码,这也许可以解释为什么我没有包含“数据类型”。非常感谢。我认为这是正确的,但我得到了一个jquery错误,该错误表示data.avg的值未定义。如果您使用的是更新版本的代码,则它是data.av
,因为这一行:$results['av']=$avrankr代码>@lazel我已经发布了我最新的代码。我似乎找不到错误。我看了你说的话,我正在按建议使用.av。任何帮助都将是惊人的,并提前感谢您。我对您的代码做了一些更改,只是在发送数据之前添加了正确的标题。
$('#response'+storyidr).replaceWith('Avg rating ' + data.avg +'/5');
$('#response'+storyidr).replaceWith(data.cnt); // Suppose you want the count here