질문좀 드릴게요!

질문좀 드릴게요!

QA

질문좀 드릴게요!

본문

아미나, 나리야 사용중인데 문제가 생겨서요... 

 

최근게시글 위젯 

 

widget_setup.php에서 
 

<div class="row gx-2 mb-2">

    <label class="col-md-2 col-form-label">

        별점 표시

    </label>

    <div class="col-md-10">

        <div class="form-check">

            <?php $wset['is_rating'] = isset($wset['is_rating']) ? $wset['is_rating'] : ''; ?>

            <input class="form-check-input" type="checkbox" name="wset[is_rating]" id="is_rating" value="1"<?php echo get_checked('1', $wset['is_rating'])?>>

            <label class="form-check-label" for="is_rating">별점 표시</label>

        </div>

    </div>

</div>

이런식으로 만들어서 

 

<?php

// 별점 평균을 가져오는 SQL 쿼리

$sql = "SELECT AVG(rating) AS avg_rating FROM {$g5['write_prefix']}{$bo_table} WHERE wr_id = '{$wr_id}'";

$result = sql_fetch($sql);

$avg_rating = $result['avg_rating'] ? number_format($result['avg_rating'], 1) : '0';

 

// 별점 출력

if ($wset['is_rating']) {

    echo '<div class="rating">';

    echo '평균 별점: ' . $avg_rating . '점';

    echo '</div>';

}

?>


이런식으로 출력할려고 하는데 
widget 상단에 

 

<?php

// 별점 집계 쿼리 (해당 게시물의 댓글 중 별점 데이터가 있는 것들을 집계)

$sql = " SELECT COUNT(*) AS cnt,

                SUM(rating_main) AS total_main,

                SUM(rating_support) AS total_support,

                SUM(rating_story) AS total_story,

                SUM(rating_quality) AS total_quality,

                SUM(rating_popularity) AS total_popularity,

                SUM(rating_writing) AS total_writing

         FROM g5_star_rating

         WHERE bo_table = '{$bo_table}'

           AND wr_parent = '{$wr_id}' ";

$row = sql_fetch($sql);

 

// 별점 데이터가 하나라도 있으면 평균 계산, 없으면 기본값 "0.0"

if ($row['cnt'] > 0) {

    // 0~60 점 범위 → 10점 만점으로 환산 (6으로 나누고 소수점 한자리)

    $avg_rating_main       = round(($row['total_main']       / $row['cnt']) / 6, 1);

    $avg_rating_support    = round(($row['total_support']    / $row['cnt']) / 6, 1);

    $avg_rating_story      = round(($row['total_story']      / $row['cnt']) / 6, 1);

    $avg_rating_quality    = round(($row['total_quality']    / $row['cnt']) / 6, 1);

    $avg_rating_popularity = round(($row['total_popularity'] / $row['cnt']) / 6, 1);

    $avg_rating_writing    = round(($row['total_writing']    / $row['cnt']) / 6, 1);

} else {

    $avg_rating_main       = "0.0";

    $avg_rating_support    = "0.0";

    $avg_rating_story      = "0.0";

    $avg_rating_quality    = "0.0";

    $avg_rating_popularity = "0.0";

    $avg_rating_writing    = "0.0";

}

 

$num_evaluations = $row['cnt'];

 

// 전체 평균 평점 (6개 항목의 평균의 평균)

$sum_avg = ((float)$avg_rating_main + (float)$avg_rating_support + (float)$avg_rating_story + (float)$avg_rating_quality + (float)$avg_rating_popularity + (float)$avg_rating_writing);

$overall_avg = round($sum_avg / 6, 1);

?>

 

쿼리문 다 다 넣어놨는데도 그 값을 못불러오더라구요. 

 

이래저래 테스트 해보니까 bo_table과 wr_id를 제대로 못들고 오는것 같던데 

 

혹시 제가 놓친 부분이 있는걸까요? 

 

파고 파고 파도 참 어렵네요 ㅠㅠ

이 질문에 댓글 쓰기 :

답변 3

  WHERE bo_table = '{$bo_table}'

           AND wr_parent = '{$wr_id}' ";

 

->

  WHERE bo_table = '{$list[$i]['bo_table']}'

           AND wr_parent = '{$list[$i]['wr_id']}' ";

 

bo_table과 wr_id 값이 정상적으로 설정되고 있는지 확인하는 디버깅 작업이 필요.

<?php
// 변수 값 확인
var_dump($bo_table, $wr_id);
exit;
?>

  - 값이 NULL이거나 예상과 다르다면, 해당 변수가 올바르게 초기화되지 않은 것 임.

 

해결 방안

*$bo_table과 $wr_id를 올바르게 가져오기

   - $bo_table은 widget_setup.php에서 올바르게 선언되고 있는지 확인

   - $wr_id 값이 게시글별로 올바르게 전달되고 있는지 확인

   - global $bo_table, $wr_id;를 명시적으로 추가하여 전역 변수로 선언하여 사용

*SQL 실행 전에 실제 쿼리를 확인하여 변수 값이 올바르게 들어갔는지 출력

$sql = "SELECT AVG(rating) AS avg_rating FROM {$g5['write_prefix']}{$bo_table} WHERE wr_id = '{$wr_id}'";
echo "<pre>".$sql."</pre>"; // 실행되는 SQL 확인
$result = sql_fetch($sql);

   - 쿼리 결과가 정상적으로 반환되는지 확인.

     만약 값이 비어 있다면 데이터는 존재하는지 확인

*MySQL 콘솔이나 phpMyAdmin에서 직접 SQL 쿼리를 실행하여

  해당 테이블에 bo_table과 wr_id 값이 올바르게 존재하는지 확인

SELECT * FROM g5_write_게시판명 WHERE wr_id = '해당게시글ID';

   - 데이터가 존재하지 않는다면, 테이블명($bo_table)이 올바르게 매핑되었는지 확인

*g5_star_rating 테이블에 bo_table과 wr_parent가 올바르게 저장되었는지 직접 확인

SELECT * FROM g5_star_rating WHERE bo_table = '해당게시판' AND wr_parent = '해당게시글ID';

   - 만약 데이터가 없다면 별점이 정상적으로 저장되지 않았을 가능성이 있음.

*쿼리 실행 시 bo_table과 wr_id를 명시적으로 가져오도록 수정.

global $bo_table, $wr_id; // 전역 변수 선언
if (!isset($bo_table) || !isset($wr_id)) {
    echo "bo_table 또는 wr_id 값이 없습니다.";
} else {
    $sql = "SELECT AVG(rating) AS avg_rating FROM {$g5['write_prefix']}{$bo_table} WHERE wr_id = '{$wr_id}'";
    $result = sql_fetch($sql);
    var_dump($result); // 결과 출력
}

 

문제가 지속되면, 추가적 디버깅 체크

*$bo_table, $wr_id가 함수 내부가 아니라 위젯 코드에서 직접 사용되는 경우

  global 없이도 접근 가능할 수 있음.

  따라서, global을 추가하기 전에 먼저 변수가 어디서 선언되고,

  어떻게 사용되는지 확인한 후 적용하는 것이 좋음

*sql_fetch() 실행 후 var_dump($result); 확인할 때 false가 나오면

  SQL 문법이 잘못되었거나 테이블 구조가 다를 수 있음.

  var_dump(mysqli_error($db));를 추가하여 쿼리 실행 오류가 있는지 확인 가능.

*만약 bo_table과 wr_id가 $list[$i] 배열을 통해 접근해야 하는 구조라면,

  $list[$i]['bo_table'], $list[$i]['wr_id']를 사용하는 것이 맞을 수도 있음.

  따라서, $bo_table, $wr_id가 위젯 내 반복문에서 개별적으로 할당되어야 하는지 먼저 점검.

답변을 작성하시기 전에 로그인 해주세요.
전체 306
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT