질문좀 드릴게요!
본문
아미나, 나리야 사용중인데 문제가 생겨서요...
최근게시글 위젯
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가 위젯 내 반복문에서 개별적으로 할당되어야 하는지 먼저 점검.
우선 SQL 쿼리하실때 관련 변수부터 찍어보세요.
안나오는 변수가 있는지