Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php AJAX不分离JSON字符串_Php_Ajax_Json - Fatal编程技术网

Php AJAX不分离JSON字符串

Php AJAX不分离JSON字符串,php,ajax,json,Php,Ajax,Json,我正在使用星级系统来显示SQL中的评级数据。每个可以评级的项目都有唯一的标识符变量$id,评级表中的每个评级都有唯一的标识符$storyidr。我希望此脚本显示: 平均评级 对项目进行评级的次数 这些值是可撤销的,但它们一起显示在页面上,我看不出如何将它们分开。例如,对于平均评分为4且评分为200次的项目。当用户单击时,数据通过AJAX返回,如下所示: 对于“响应1”4“200” 对于“response2”4“200” 我希望能够将它们分开,使其看起来像: 对于“响应1”4 对于'resp

我正在使用星级系统来显示SQL中的评级数据。每个可以评级的项目都有唯一的标识符变量$id,评级表中的每个评级都有唯一的标识符$storyidr。我希望此脚本显示:

  • 平均评级
  • 对项目进行评级的次数
  • 这些值是可撤销的,但它们一起显示在页面上,我看不出如何将它们分开。例如,对于平均评分为4且评分为200次的项目。当用户单击时,数据通过AJAX返回,如下所示:

    • 对于“响应1”4“200”
    • 对于“response2”4“200”
    我希望能够将它们分开,使其看起来像:

    • 对于“响应1”4
    • 对于'response2'200
    html页面

       <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