2014-06-09 2 views
1

SQL의 등급 데이터를 표시하는 데 별 등급 시스템을 사용하고 있습니다. 등급을 매길 수있는 각 항목에는 고유 식별자 변수 $ id가 있고 등급 tabl의 각 등급에는 고유 식별자 $ storyidr이 있습니다. 나는 디스플레이에이 스크립트를 싶습니다AJAX가 JSON 문자열을 구분하지 않음

  1. 평균 평점
  2. 항목이 평가 된 횟수.

값은 retirevable이지만 함께 페이지에 표시되며이를 구분하는 방법을 볼 수 없습니다. 평균 등급이 4이고 200 회 평가 된 품목의 경우 예입니다. 사용자가처럼 보이는 AJAX를 통해 데이터 반환을 클릭 할 때 : 들어 "200"

  • 4 'response1'에 대한

    • 'response2'4 "(200)"

    나는 분리해서 할 수 있도록하고 싶습니다 'response1' 'response2'200

  • 를 들어 4
  • 를 들어

    • : 그들처럼 보이게하기

      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> 
      

      PHP

      <?PHP 
            $storyidr=$_POST['storyidr']; 
           $mysqli = mysqli_connect($dbhost,$dbusername,$dbpasswd,$database_name) or die ("Couldn't connect to server."); 
           if (mysqli_connect_errno($mysqli)) 
            { 
            echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
            } 
           $sql = "INSERT INTO ratings (storyidr, rank, entry_date) VALUES ('$_POST[storyidr]','$_POST[value]',now());"; 
           $sql .= "SELECT AVG(rank) AS avrank, COUNT(rank) AS countrank FROM ratings WHERE storyidr = $storyidr"; 
           if($mysqli->multi_query($sql)) 
           { $mysqli->next_result(); 
           if ($result = $mysqli->store_result()) 
           { 
           $data = mysqli_fetch_assoc($result); 
           $avrank = $data['avrank']; 
           $countrank = $data['countrank']; 
           $avrankr = round($avrank,2); 
           if(is_null($avrank)){$avrank ="null";} 
              echo json_encode(array('avg' => $avrankr, 'cnt' => $countrank)); 
      
           } 
           } 
          ?> 
      
  • +1

    '$ 아약스 ({dataType와 'JSON', ...});' – barell

    +0

    당신 JS Fi를을 le, AJAX 호출에 참여했습니다. 다른 옵션과 마찬가지로 ... – barell

    +1

    @lazel 질문에 괄호를 제거하고 코드 줄을 추가하는 것은 적절하지 않습니다. –

    답변

    1

    한 번만 만 json_encode()를 사용해야은 그 함수의 결과를 에코. 한 번만 더 이렇게하면 당신의 JSON 무효화 :

    else 
        { 
         $results = array(); 
         $results['av'] = $avrankr; 
         $results['cnt'] = $countrank; 
    
         echo json_encode($results); 
        } 
    

    그런 다음, 자바 스크립트, 사용자가 액세스 할 수 data.av 직접 data.cnt : 언급 한 바와 같이 당신은 또한 당신의 아약스 호출에서 dataType 매개 변수를 설정할 수 있습니다

    $('#response'+storyidr).replaceWith('Avg rating ' + data.av +'/5'); 
    $('#response2'+storyidr).replaceWith(data.cnt); 
    

    @barell에 의해,하지만 일반적으로 jQuery가 올바르게 이미 알아낼 것입니다.

    편집 : 지금 당신은 당신의 아약스 호출의 성공 콜백에서 처음 data.status를 확인하고 적절한 조치를 취할 수 있습니다

    $results = array('status' => 'fail'); 
    ... 
    if() { 
        ... 
    
         if ($result) 
         { 
         $results['status'] = 'success'; 
         $results['av'] = $avrankr; 
         $results['cnt'] = $countrank; 
         } 
    } 
    
    echo json_encode($results); 
    

    : 당신이 그런 짓을해야지고있는 undefined 오류를 방지하려면 :

    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'); 
        } 
    }, 
    
    +0

    제안 사항이 있습니다. "평균 등급이 정의되지 않았습니다."변경 사항을 포함하도록 코드를 편집합니다. jquery 오류라고 생각하고 있습니까? 감사합니다 @ 제로 엔! 가능하면 제안 가능한 수정을 제공하십시오! – rhill45

    +1

    @buzrw PHP 스크립트에서'if' 루프를 입력 한 것 같습니다. 성공 함수 (javascript)에서'console.log (data)'를 수행하여 정확히 무엇이 포함되어 있는지 확인해야합니다. – jeroen

    +0

    나는 PHP가 '정의되지 않은'오류 코드를 줄 것이라고 생각하지 않았습니다. 나는 그것이 jquery 오류라고 생각했다. @@@@en – rhill45

    1

    나는 올바른 머리글을 설정하지 않는다고 생각합니다.

    이제
    echo json_encode(array('avg' => $avrankr, 'cnt' => $countrank)); 
    

    는 그 다음

    작동합니다 :

    header('Content-type: text/json'); 
    

    을 또한, 대신 두 개체 쓰기, 배열로 쓰기 : PHP 파일에서 모든 출력하기 전에,이를 넣어 당신의 자바 스크립트에서이 같은이 데이터에 액세스합니다 :

    $('#response'+storyidr).replaceWith('Avg rating ' + data.avg +'/5'); 
    $('#response'+storyidr).replaceWith(data.cnt); // Suppose you want the count here 
    
    +0

    나는 이것이 올바른 길에 있다고 생각하지만 data.avg의 값이 정의되지 않은 jquery 오류가 발생합니다 – rhill45

    +1

    업데이트 된 버전의 코드를 사용하는 경우이 행 때문에'data.av'입니다. :'$ results [ 'av'] = $ avrankr;' – Iazel

    +0

    @ lazel 가장 최근의 코드에 게시했습니다. 나는 오류를 찾을 수없는 것 같습니다. 나는 당신이 말한 것을 보았고 제안 된 바와 같이 .av를 사용하고 있습니다. 어떤 도움이라도 훌륭하고 미리 감사드립니다. – rhill45

    관련 문제