
사이트 활용팁
댓글 추천/비추천
01. 새로운 파일 ajax.comment_good_nogood.php 생성
그누보드 bbs 디렉토리 안에 ajax.comment_good_nogood.php 파일을 생성하고 아래 내용을 넣어주세요. 이 파일은 댓글 추천/비추천 요청을 처리하고 데이터베이스를 업데이트하는 역할을 합니다.
<?php
include_once('./_common.php');
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
$comment_id = isset($_POST['comment_id']) ? (int)$_POST['comment_id'] : 0;
$action = isset($_POST['action']) ? clean_xss_tags($_POST['action']) : '';
$bo_table = isset($_POST['bo_table']) ? clean_xss_tags($_POST['bo_table']) : '';
$wr_id = isset($_POST['wr_id']) ? (int)$_POST['wr_id'] : 0; // 게시글 ID
if (!$comment_id || !$action || !$bo_table || !$wr_id) {
die(json_encode(['error' => '잘못된 요청입니다.']));
}
// 게시판 설정 정보 가져오기 (권한 체크에 필요)
$board = get_board_info($bo_table);
if (!$board) {
die(json_encode(['error' => '게시판 정보가 없습니다.']));
}
// 본문 추천/비추천 권한과 동일하게 적용
// bo_use_good_nogood은 보통 비회원도 추천/비추천이 가능한지 여부를 설정하는 변수입니다.
if ($board['bo_use_good_nogood'] && !$member['mb_id']) { // 게시판 설정에서 비회원 추천/비추천을 허용하지 않으면 (즉, 회원만 가능하면)
die(json_encode(['error' => '회원만 추천/비추천이 가능합니다.']));
}
// IP 중복 체크 (게시글 추천/비추천과 동일하게 적용)
// 이 부분은 게시판 설정의 'IP당 추천/비추천수'에 따라 다르게 동작할 수 있습니다.
// 현재는 1회만 가능하도록 세션에 저장합니다.
$ip = $_SERVER['REMOTE_ADDR'];
$ss_name = 'ss_comment_'.$action.'_'.$comment_id;
if (get_session($ss_name) == $ip) {
die(json_encode(['error' => '이미 ' . ($action == 'good' ? '추천' : '비추천') . '하셨습니다.']));
}
// 댓글 정보 가져오기 (cmt_good, cmt_nogood 칼럼 사용)
$sql_comment = " SELECT cmt_good, cmt_nogood FROM {$g5['write_prefix']}{$bo_table} WHERE wr_id = '{$comment_id}' ";
$comment_row = sql_fetch($sql_comment);
if (!$comment_row) {
die(json_encode(['error' => '댓글을 찾을 수 없습니다.']));
}
$update_field = '';
if ($action === 'good') {
$update_field = 'cmt_good';
$current_count = $comment_row['cmt_good'];
} elseif ($action === 'nogood') {
$update_field = 'cmt_nogood';
$current_count = $comment_row['cmt_nogood'];
} else {
die(json_encode(['error' => '유효하지 않은 액션입니다.']));
}
// 데이터 업데이트 (cmt_good, cmt_nogood 칼럼 사용)
$sql_update = " UPDATE {$g5['write_prefix']}{$bo_table} SET {$update_field} = {$update_field} + 1 WHERE wr_id = '{$comment_id}' ";
sql_query($sql_update);
// 세션에 IP 저장 (중복 추천/비추천 방지)
set_session($ss_name, $ip);
// 업데이트된 값 다시 가져오기
$new_comment_row = sql_fetch(" SELECT cmt_good, cmt_nogood FROM {$g5['write_prefix']}{$bo_table} WHERE wr_id = '{$comment_id}' ");
echo json_encode([
'success' => true,
'cmt_good_count' => $new_comment_row['cmt_good'], // 변경된 칼럼명에 맞게
'cmt_nogood_count' => $new_comment_row['cmt_nogood'] // 변경된 칼럼명에 맞게
]);
?>
02. _common.php 파일 확인 (필요시 추가)
_common.php 파일에 clean_xss_tags 함수가 포함되어 있는지 확인하세요. 일반적으로 그누보드에는 이 함수가 있지만, 혹시 없다면 아래 코드를 추가해야 합니다.
// _common.php 또는 적절한 유틸리티 파일에 추가
if (!function_exists('clean_xss_tags')) {
function clean_xss_tags($str)
{
$str = preg_replace('#</*(?:applet|b(?:ase|gsound)|xss:base|xss:bgsound|b(?:link|ody)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|xml)[^>]*>#is', '', $str);
$str = preg_replace('#<([^>]*)(onabort|onactivate|onafterprint|onafterupdate|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditfocus|onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onblur|onbounce|oncellchange|onchange|onclick|oncontextmenu|oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondragstart|ondrop|onerror|onerrorupdate|onfilterchange|onfinish|onfocus|onfocusin|onfocusout|onhelp|onkeydown|onkeypress|onkeyup|onlayoutcomplete|onload|onlosecapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmouseout|onmouseover|onmouseup|onmousewheel|onmove|onmoveend|onmovestart|onpaste|onpropertychange|onreadystatechange|onreset|onresize|onresizeend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onselect|onselectionchange|onselectstart|onstart|onstop|onsubmit|onunload)([ \r\n\t]*)=([ \r\n\t]*)("|\'|"|')([^\5]*)\5([^>]*?)>#is', '<$1$6>', $str);
return $str;
}
}
03. CSS 추가 (style.css 또는 적절한 CSS 파일)
추천/비추천 버튼의 스타일을 위해 style.css 파일 (보통 board_skin_url에 있는)에 아래 CSS를 추가해주세요.
/* 댓글 추천/비추천 버튼 */
.cmt_good_btn,
.cmt_nogood_btn {
display: inline-flex;
align-items: center;
cursor: pointer;
margin-left: 10px;
font-size: 13px; /* 폰트 크기 조절 */
color: #666;
transition: color 0.2s ease;
}
.cmt_good_btn:hover,
.cmt_nogood_btn:hover {
color: #007bff; /* 호버 시 색상 변경 */
}
.cmt_good_btn svg,
.cmt_nogood_btn svg {
margin-right: 3px;
vertical-align: middle;
}
.cmt_good_btn .good_count,
.cmt_nogood_btn .nogood_count {
font-weight: bold;
}
.cmt_good_btn.disabled,
.cmt_nogood_btn.disabled {
cursor: not-allowed;
opacity: 0.6;
}
04. view_comment.skin.php 파일 수정
① 파일 상단에 SQL 칼럼 추가 로직 삽입
사용자님의 view_comment.skin.php 파일에 아래 내용을 추가 및 수정합니다. view_comment.skin.php 파일의 가장 상단에 있는 <?php 태그 바로 아래에 다음 코드를 추가합니다.
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// --- [시작] 댓글 추천/비추천 칼럼 존재 여부 확인 및 추가 ---
if (isset($bo_table) && $bo_table) {
$write_table = $g5['write_prefix'] . $bo_table; // 게시판 테이블명 (댓글 테이블도 동일하게 사용)
// cmt_good 칼럼 확인 및 추가
$sql_check_cmt_good = "SHOW COLUMNS FROM `{$write_table}` LIKE 'cmt_good'";
$row_cmt_good = sql_fetch($sql_check_cmt_good);
if (!$row_cmt_good) {
// 기존 wr_good 칼럼 뒤에 추가하는 것이 자연스러움. 만약 wr_good이 없다면 wr_hit 뒤에.
// 여기서는 wr_hit 뒤에 추가하는 것으로 가정합니다.
$sql_add_cmt_good = "ALTER TABLE `{$write_table}` ADD `cmt_good` INT(11) NOT NULL DEFAULT '0' AFTER `wr_hit`";
sql_query($sql_add_cmt_good, false);
}
// cmt_nogood 칼럼 확인 및 추가
$sql_check_cmt_nogood = "SHOW COLUMNS FROM `{$write_table}` LIKE 'cmt_nogood'";
$row_cmt_nogood = sql_fetch($sql_check_cmt_nogood);
if (!$row_nogood) { // $row_nogood 대신 $row_cmt_nogood를 확인해야 합니다.
// cmt_good 칼럼 뒤에 추가
$sql_add_cmt_nogood = "ALTER TABLE `{$write_table}` ADD `cmt_nogood` INT(11) NOT NULL DEFAULT '0' AFTER `cmt_good`";
sql_query($sql_add_cmt_nogood, false);
}
}
// --- [끝] 댓글 추천/비추천 칼럼 존재 여부 확인 및 추가 ---
?>
② 댓글 작성일자 옆에 추천/비추천 버튼 삽입
view_comment.skin.php 파일에서 div class="gall_date" 부분을 찾습니다. 이 부분은 대략 40~50번째 줄에 있을 것입니다.
<p class="p_times" style="margin-bottom:10px;"><span><?php echo date('Y-m-d H:i', strtotime($list[$i]['datetime'])) ?></span></p>
위 코드 바로 아래에 다음 HTML 코드를 추가합니다.
<?php if ($list[$i]['mb_id'] != $member['mb_id'] || $member['mb_id'] == '') { // 본인 댓글이 아니거나 비회원일 경우에만 표시 (권한에 따라 조절) ?>
<span class="cmt_good_btn" data-comment-id="<?php echo $comment_id; ?>" data-action="good">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-thumbs-up"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg>
<span class="good_count"><?php echo $list[$i]['cmt_good']; // 변경된 칼럼명 ?></span>
</span>
<span class="cmt_nogood_btn" data-comment-id="<?php echo $comment_id; ?>" data-action="nogood">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-thumbs-down"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zM17 2h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3"></path></svg>
<span class="nogood_count"><?php echo $list[$i]['cmt_nogood']; // 변경된 칼럼명 ?></span>
</span>
<?php } ?>
<script>
// --- [추가 시작] 댓글 추천/비추천 기능 ---
$(document).on('click', '.cmt_good_btn, .cmt_nogood_btn', function() {
const btn = $(this);
const commentId = btn.data('comment-id');
const action = btn.data('action'); // 'good' 또는 'nogood'
// 중복 클릭 방지
if (btn.hasClass('disabled')) {
return false;
}
btn.addClass('disabled'); // 버튼 비활성화
$.ajax({
url: g5_bbs_url + '/ajax.comment_good_nogood.php', // 이 파일을 새로 생성해야 합니다.
type: 'POST',
data: {
comment_id: commentId,
action: action,
bo_table: '<?php echo $bo_table; ?>', // 게시판 테이블명
wr_id: '<?php echo $wr_id; ?>' // 게시글 ID
},
dataType: 'json',
success: function(data) {
if (data.error) {
alert(data.error);
} else {
if (action === 'good') {
btn.find('.good_count').text(data.cmt_good_count);
} else if (action === 'nogood') {
btn.find('.nogood_count').text(data.cmt_nogood_count);
}
}
},
error: function(xhr, status, error) {
console.error("AJAX Error:", status, error);
alert('요청 처리 중 오류가 발생했습니다.');
},
complete: function() {
btn.removeClass('disabled'); // 버튼 다시 활성화
}
});
});
// --- [추가 끝] 댓글 추천/비추천 기능 ---
</script>
- 다음글전체댓글 '더보기' 기능 추가 (게시판 댓글 전체, 확장/축소 기능)2025.06.06
빌런은 디스코드, 인스타그램, 페이스북, 카카오톡, 텔레그램 등 다양한 메신저에서 발생하는 범죄, 사기, 보이스피싱, 스캠과 함께 중고 거래, 데이트 폭력, 학교 폭력, 술집 진상, 게임 사기꾼, 나쁜 회사 상사, 일상 속 매너 없는 사람들에 대한 정보를 공유하는 플랫폼입니다. ... 자세히보기
또한, 한국 아이돌, 배우, 해외 유명인, 스포츠 스타, 인플루언서에 대한 팬클럽 게시판도 운영하여, 좋아하는 스타와 소통할 수 있는 공간을 제공합니다. 안전한 커뮤니티에서 우리의 경험을 나누고, 더 나은 사회를 만들어 갑시다. ... 접기
본 사이트의 모든 게시물과 그에 포함된 텍스트, 이미지, 동영상 등 모든 콘텐츠는 본 사이트에서 독자적으로 편집 및 표현 방식을 수정하여 완성된 창작물입니다. 저작권법 및 관련 법령에 따라 보호를 받습니다. 따라서, 본 정보는 사이트 운영자의 명시적인 서면 동의 없이 무단으로 전재, 복사, 배포, 재가공, 또는 어떠한 형태로든 상업적/비상업적으로 활용될 수 없습니다. ... 자세히보기
또한, 게재된 정보는 개인적인 열람 및 참고 이외의 어떠한 용도로도 사용할 수 없습니다. 이를 위반할 경우 관련 법률에 의거하여 민·형사상의 책임을 질 수 있습니다.
본 사이트는 등록자가 게재한 자료의 내용에 대한 정확성, 완전성, 신뢰성을 보증하지 않으며, 해당 정보의 오류나 누락에 대해 어떠한 책임도 지지 않습니다. 또한, 사용자가 본 정보를 신뢰하여 취한 직간접적인 모든 조치나 결과에 대해서도 책임을 부담하지 않습니다. 정보 사용에 따른 모든 위험은 사용자 본인에게 있습니다. ... 접기
댓글목록

현재 댓글 생성 서비스를 이용할 수 없습니다.