테스트 사이트 - 개발 중인 베타 버전입니다

그누보드 최신버전 (5.1.1) 살펴보기 - bbs/board.php (1)

· 10년 전 · 5098 · 13
그누보드 최신버전 (5.1.1) 살펴보기 - bbs/board.php (1)
 
 
 
bbs/board.php 는 게시판의 리스트와 내용보기에 사용됩니다.
common.php 에서 생성된 $write 배열에 값이 있을 경우에는 내용보기, 없을시에는 리스트로 출력됩니다.
 
 
 
include_once('./_common.php');

그누보드를 이용한다면 기본적으로 항상 포함되어야 하는 내용입니다.

_common.php 에는 

include_once('../common.php');

와 같이 그누보드 최상단의 common.php 를 인클루드 합니다.



if (!$board['bo_table']) {
   alert('존재하지 않는 게시판입니다.', G5_URL);
}

$board 배열변수는 common.php에서

if (isset($_REQUEST['bo_table'])) {
    $bo_table = preg_replace('/[^a-z0-9_]/i', '', trim($_REQUEST['bo_table']));
    $bo_table = substr($bo_table, 0, 20);
} else {
    $bo_table = '';
}

이 부분과

if ($bo_table) {
    $board = sql_fetch(" select * from {$g5['board_table']} where bo_table = '$bo_table' ");

이 부분을 통해서 배열값이 저장됩니다.

$board 변수가 존재하더라도 

$board = sql_fetch(" select * from {$g5['board_table']} where bo_table = '$bo_table' ");

에서 보는 바와 같이 해당 $bo_table 이 설정되지 않은 게시판이라면 false 값을 가지고 있습니다.

따라서

if (!$board['bo_table']) {
   alert('존재하지 않는 게시판입니다.', G5_URL);
}

이 부분은

if (!isset($board) || !is_array($board) || !isset($board['bo_table']) || strlen($board['bo_table']) == 0) {

와 같이 사용하는 것이 정확합니다.



check_device($board['bo_device']);

$board['bo_device'] 는 게시판 환경설정에서 접속기기 설정에 의해 저장된값입니다.

both, pc, mobile 세가지 값이 올 수 있으며

pc 는 pc 만 허용, mobile 은 mobile 만 허용, both는 모두 허용 입니다.

lib/common.lib.php

function check_device($device)
{
    global $is_admin;

    if ($is_admin) return;

    if ($device=='pc' && G5_IS_MOBILE) {
        alert('PC 전용 게시판입니다.', G5_URL);
    } else if ($device=='mobile' && !G5_IS_MOBILE) {
        alert('모바일 전용 게시판입니다.', G5_URL);
    }
}

관리자 일경우는 상관이 없고

pc 전용 게시판인데 현재 모바일용 출력 상황이라면 경고메시지 띄우고 메인으로 이동,

모바일 전용 게시판인데 현재 pc용 출력 상황이라면 경고메시지 띄우고 메인으로 이동합니다.



if (isset($write['wr_is_comment']) && $write['wr_is_comment']) {
    goto_url('./board.php?bo_table='.$bo_table.'&wr_id='.$write['wr_parent'].'#c_'.$wr_id);
}

$write 배열변수는 common.php에서

if (isset($_REQUEST['wr_id'])) {
    $wr_id = (int)$_REQUEST['wr_id'];
} else {
    $wr_id = 0;
}

이 부분과

$write = array();
$write_table = "";
if ($bo_table) {
    $board = sql_fetch(" select * from {$g5['board_table']} where bo_table = '$bo_table' ");
    if ($board['bo_table']) {
        set_cookie("ck_bo_table", $board['bo_table'], 86400 * 1);
        $gr_id = $board['gr_id'];
        $write_table = $g5['write_prefix'] . $bo_table; // 게시판 테이블 전체이름
        //$comment_table = $g5['write_prefix'] . $bo_table . $g5['comment_suffix']; // 코멘트 테이블 전체이름
        if (isset($wr_id) && $wr_id)
            $write = sql_fetch(" select * from $write_table where wr_id = '$wr_id' ");
    }
}

이 부분을 통해서 배열값이 저장됩니다.

$write 변수가 존재하더라도 

$write = array(); 배열로 선언한 초기값을 가지거나

$write = sql_fetch(" select * from $write_table where wr_id = '$wr_id' ");

에서 보는 바와 같이 해당 $wr_id 의 게시물이 없는 경우 false 의 값을 가질수 있습니다.

if (isset($write['wr_is_comment']) && $write['wr_is_comment']) {

해당 게시물의 댓글 인지 여부를 따지는  $write['wr_is_comment'] 변수가 정의 되어 있고 $write['wr_is_comment'] 에 값(1)이 있으면

댓글 보기 페이지로 이동 시키기 위한 부분입니다.

if (isset($write['wr_is_comment']) && $write['wr_is_comment'] == 1) {

또는

if (isset($write['wr_is_comment']) && !empty($write['wr_is_comment'])) {

정도가 더 정확할것 같습니다.



if (!$bo_table) {
    $msg = "bo_table 값이 넘어오지 않았습니다.\\n\\nboard.php?bo_table=code 와 같은 방식으로 넘겨 주세요.";
    alert($msg);
}

이 부분은 굳이 필요없는 부분입니다.

$bo_table 가 없다면 $board 에 값이 없고 이미 이전의 

if (!$board['bo_table']) {
   alert('존재하지 않는 게시판입니다.', G5_URL);
}

이 부분에 걸려 여기까지 내려올수 없습니다.

만약 제대로 된 형식으로 접속하라는 경고를 보여주고 싶으면

if (!$board['bo_table']) {
   alert('존재하지 않는 게시판입니다.', G5_URL);
}

이 부분 상위에

if (!$bo_table) {
    $msg = "bo_table 값이 넘어오지 않았습니다.\\n\\nboard.php?bo_table=code 와 같은 방식으로 넘겨 주세요.";
    alert($msg);
}

이 부분을 넣는게 맞다고 보여집니다.



if (isset($wr_id) && $wr_id) {
    // 글이 없을 경우 해당 게시판 목록으로 이동
    if (!$write['wr_id']) {
        $msg = '글이 존재하지 않습니다.\\n\\n글이 삭제되었거나 이동된 경우입니다.';
        alert($msg, './board.php?bo_table='.$bo_table);
    }

    // 그룹접근 사용
    if (isset($group['gr_use_access']) && $group['gr_use_access']) {
        if ($is_guest) {
            $msg = "비회원은 이 게시판에 접근할 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.";
            alert($msg, './login.php?wr_id='.$wr_id.$qstr.'&url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&wr_id='.$wr_id.$qstr));
        }

        // 그룹관리자 이상이라면 통과
        if ($is_admin == "super" || $is_admin == "group") {
            ;
        } else {
            // 그룹접근
            $sql = " select count(*) as cnt from {$g5['group_member_table']} where gr_id = '{$board['gr_id']}' and mb_id = '{$member['mb_id']}' ";
            $row = sql_fetch($sql);
            if (!$row['cnt']) {
                alert("접근 권한이 없으므로 글읽기가 불가합니다.\\n\\n궁금하신 사항은 관리자에게 문의 바랍니다.", G5_URL);
            }
        }
    }

    // 로그인된 회원의 권한이 설정된 읽기 권한보다 작다면
    if ($member['mb_level'] < $board['bo_read_level']) {
        if ($is_member)
            alert('글을 읽을 권한이 없습니다.', G5_URL);
        else
            alert('글을 읽을 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', './login.php?wr_id='.$wr_id.$qstr.'&amp;url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;wr_id='.$wr_id.$qstr));
    }

    // 본인확인을 사용한다면
    if ($config['cf_cert_use'] && !$is_admin) {
        // 인증된 회원만 가능
        if ($board['bo_use_cert'] != '' && $is_guest) {
            alert('이 게시판은 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', './login.php?wr_id='.$wr_id.$qstr.'&amp;url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;wr_id='.$wr_id.$qstr));
        }

        if ($board['bo_use_cert'] == 'cert' && !$member['mb_certify']) {
            alert('이 게시판은 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원정보 수정에서 본인확인을 해주시기 바랍니다.', G5_URL);
        }

        if ($board['bo_use_cert'] == 'adult' && !$member['mb_adult']) {
            alert('이 게시판은 본인확인으로 성인인증 된 회원님만 글읽기가 가능합니다.\\n\\n현재 성인인데 글읽기가 안된다면 회원정보 수정에서 본인확인을 다시 해주시기 바랍니다.', G5_URL);
        }

        if ($board['bo_use_cert'] == 'hp-cert' && $member['mb_certify'] != 'hp') {
            alert('이 게시판은 휴대폰 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원정보 수정에서 휴대폰 본인확인을 해주시기 바랍니다.', G5_URL);
        }

        if ($board['bo_use_cert'] == 'hp-adult' && (!$member['mb_adult'] || $member['mb_certify'] != 'hp')) {
            alert('이 게시판은 휴대폰 본인확인으로 성인인증 된 회원님만 글읽기가 가능합니다.\\n\\n현재 성인인데 글읽기가 안된다면 회원정보 수정에서 휴대폰 본인확인을 다시 해주시기 바랍니다.', G5_URL);
        }
    }

    // 자신의 글이거나 관리자라면 통과
    if (($write['mb_id'] && $write['mb_id'] == $member['mb_id']) || $is_admin) {
        ;
    } else {
        // 비밀글이라면
        if (strstr($write['wr_option'], "secret"))
        {
            // 회원이 비밀글을 올리고 관리자가 답변글을 올렸을 경우
            // 회원이 관리자가 올린 답변글을 바로 볼 수 없던 오류를 수정
            $is_owner = false;
            if ($write['wr_reply'] && $member['mb_id'])
            {
                $sql = " select mb_id from {$write_table}
                            where wr_num = '{$write['wr_num']}'
                            and wr_reply = ''
                            and wr_is_comment = 0 ";
                $row = sql_fetch($sql);
                if ($row['mb_id'] == $member['mb_id'])
                    $is_owner = true;
            }

            $ss_name = 'ss_secret_'.$bo_table.'_'.$write['wr_num'];

            if (!$is_owner)
            {
                //$ss_name = "ss_secret_{$bo_table}_{$wr_id}";
                // 한번 읽은 게시물의 번호는 세션에 저장되어 있고 같은 게시물을 읽을 경우는 다시 비밀번호를 묻지 않습니다.
                // 이 게시물이 저장된 게시물이 아니면서 관리자가 아니라면
                //if ("$bo_table|$write['wr_num']" != get_session("ss_secret"))
                if (!get_session($ss_name))
                    goto_url('./password.php?w=s&amp;bo_table='.$bo_table.'&amp;wr_id='.$wr_id.$qstr);
            }

            set_session($ss_name, TRUE);
        }
    }

    // 한번 읽은글은 브라우저를 닫기전까지는 카운트를 증가시키지 않음
    $ss_name = 'ss_view_'.$bo_table.'_'.$wr_id;
    if (!get_session($ss_name))
    {
        sql_query(" update {$write_table} set wr_hit = wr_hit + 1 where wr_id = '{$wr_id}' ");

        // 자신의 글이면 통과
        if ($write['mb_id'] && $write['mb_id'] == $member['mb_id']) {
            ;
        } else if ($is_guest && $board['bo_read_level'] == 1 && $write['wr_ip'] == $_SERVER['REMOTE_ADDR']) {
            // 비회원이면서 읽기레벨이 1이고 등록된 아이피가 같다면 자신의 글이므로 통과
            ;
        } else {
            // 글읽기 포인트가 설정되어 있다면
            if ($config['cf_use_point'] && $board['bo_read_point'] && $member['mb_point'] + $board['bo_read_point'] < 0)
                alert('보유하신 포인트('.number_format($member['mb_point']).')가 없거나 모자라서 글읽기('.number_format($board['bo_read_point']).')가 불가합니다.\\n\\n포인트를 모으신 후 다시 글읽기 해 주십시오.');

            insert_point($member['mb_id'], $board['bo_read_point'], "{$board['bo_subject']} {$wr_id} 글읽기", $bo_table, $wr_id, '읽기');
        }

        set_session($ss_name, TRUE);
    }

    $g5['title'] = strip_tags(conv_subject($write['wr_subject'], 255))." > ".$board['bo_subject'];
}

이 부분은 $wr_id 변수가 존재하고 값이 있다면 내용보기 페이지이므로 거기에 맞는 체크를 하는 부분입니다.

if (isset($wr_id) && $wr_id) {

보다는

if (isset($wr_id) && $wr_id > 0) {

이 나아보입니다.


if (!$write['wr_id']) {
    $msg = '글이 존재하지 않습니다.\\n\\n글이 삭제되었거나 이동된 경우입니다.';
    alert($msg, './board.php?bo_table='.$bo_table);
}

이 부분은 $wr_id 변수는 존재하지만, 해당 게시글 존재하지 않을때 에러를 발생시키는 부분입니다.

if (empty($write['wr_id'])) {

정도가 적당할것 같습니다.

empty 는 인자로 들어오는 변수가 정의되어잇지 않거나

0, 0.0, false, null, 빈값, 빈배열 같은 경우에 참을 반환합니다.




참고로 게시판 리스트 일 경우 필수 변수는

$bo_table, $board, $group

게시판 내용보기 일 경우 필수 변수는

$bo_table, $board, $group, $wr_id, $write 

입니다. 모두 값이 empty 이어서는 안됩니다.



if (isset($group['gr_use_access']) && $group['gr_use_access']) {
    if ($is_guest) {
        $msg = "비회원은 이 게시판에 접근할 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.";
        alert($msg, './login.php?wr_id='.$wr_id.$qstr.'&amp;url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;wr_id='.$wr_id.$qstr));
    }

    // 그룹관리자 이상이라면 통과
    if ($is_admin == "super" || $is_admin == "group") {
        ;
    } else {
        // 그룹접근
        $sql = " select count(*) as cnt from {$g5['group_member_table']} where gr_id = '{$board['gr_id']}' and mb_id = '{$member['mb_id']}' ";
        $row = sql_fetch($sql);
        if (!$row['cnt']) {
            alert("접근 권한이 없으므로 글읽기가 불가합니다.\\n\\n궁금하신 사항은 관리자에게 문의 바랍니다.", G5_URL);
        }
    }
}

이 부분은 해당 게시판이 속한 그룹의 설정에서 

접근회원사용 이라는 설정에 체크를 한경우에 동작합니다.

즉, 해당 설정이 활성화 되어있을 경우 그 그룹에 소속된 회원만이 해당 게시판에 접근 할수 있도록 하는 것입니다.

어차피 슈퍼관리자와 그룹관리자는 해당 사항이 없으므로

if ($is_admin != "super" && $is_admin != "group") {

    if (isset($group['gr_use_access']) && $group['gr_use_access']) {

        if ($is_guest) {

            $msg = "비회원은 이 게시판에 접근할 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.";
            alert($msg, './login.php?wr_id='.$wr_id.$qstr.'&amp;url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;wr_id='.$wr_id.$qstr));
        }
        else {

            $sql = " select count(*) as cnt from {$g5['group_member_table']} where gr_id = '{$board['gr_id']}' and mb_id = '{$member['mb_id']}' ";
            $row = sql_fetch($sql);
            if (!$row['cnt']) {
                alert("접근 권한이 없으므로 글읽기가 불가합니다.\\n\\n궁금하신 사항은 관리자에게 문의 바랍니다.", G5_URL);
            }
        }
    }
}

와 같은 형태로 바꾸는것이 더 좋아 보입니다.



if ($member['mb_level'] < $board['bo_read_level']) {
    if ($is_member)
        alert('글을 읽을 권한이 없습니다.', G5_URL);
    else
        alert('글을 읽을 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', './login.php?wr_id='.$wr_id.$qstr.'&amp;url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;wr_id='.$wr_id.$qstr));
}

이 부분은 게시판의 읽기 레벨을 체크하는 부분입니다.

이 부분 역시 if ($is_admin != "super" && $is_admin != "group") { 안으로 들어가고

if ($is_admin != "board") {

안으로 넣는 것이 좋아보입니다.

어차피 관리자(슈퍼, 그룹, 게시판)로 지정된 회원은 레벨을 따지는 것은 의미가 크지 않기 때문입니다.



if ($config['cf_cert_use'] && !$is_admin) {
    // 인증된 회원만 가능
    if ($board['bo_use_cert'] != '' && $is_guest) {
        alert('이 게시판은 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', './login.php?wr_id='.$wr_id.$qstr.'&amp;url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;wr_id='.$wr_id.$qstr));
    }

    if ($board['bo_use_cert'] == 'cert' && !$member['mb_certify']) {
        alert('이 게시판은 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원정보 수정에서 본인확인을 해주시기 바랍니다.', G5_URL);
    }

    if ($board['bo_use_cert'] == 'adult' && !$member['mb_adult']) {
        alert('이 게시판은 본인확인으로 성인인증 된 회원님만 글읽기가 가능합니다.\\n\\n현재 성인인데 글읽기가 안된다면 회원정보 수정에서 본인확인을 다시 해주시기 바랍니다.', G5_URL);
    }

    if ($board['bo_use_cert'] == 'hp-cert' && $member['mb_certify'] != 'hp') {
        alert('이 게시판은 휴대폰 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원정보 수정에서 휴대폰 본인확인을 해주시기 바랍니다.', G5_URL);
    }

    if ($board['bo_use_cert'] == 'hp-adult' && (!$member['mb_adult'] || $member['mb_certify'] != 'hp')) {
        alert('이 게시판은 휴대폰 본인확인으로 성인인증 된 회원님만 글읽기가 가능합니다.\\n\\n현재 성인인데 글읽기가 안된다면 회원정보 수정에서 휴대폰 본인확인을 다시 해주시기 바랍니다.', G5_URL);
    }
}

게시판 환경설정에서 본인확인사용 설정에 사용안함 외의 값이 설정되어 있을때 동작합니다. 사용안함은 빈값입니다.

부가서비스인 아이폰 본인인증이나 핸드폰 본인인증을 사용할경우 위의 설정이 활성화됩니다.



그 외의 부분은 비밀글 열람에 관한 체크와 조회수 증가에 대한 부분입니다.

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 13개

10년 전
선감상 후추천(응?)
유익한 강좌 감사합니다..^^
9년 전
인자 변수 배열 ...초보가 이해하긴 조금 어렵지만
아무튼 좋은 강좌입니다~

게시글 목록

번호 제목
32341
32339
32326
32325
32322
32319
32318
32316
32315
32313
32312
32311
32310
32304
32303
32300
32293
32292
32291
32285
32284
32275
32271
32268
32265
32261
32258
32257
32255
32254
32253
32251
32250
32249
32247
32246
32245
32244
32243
32242
32241
32240
32239
32238
32237
32236
32232
32229
32228
32227
32217
32215
32214
32213
32211
32207
32196
32193
32192
32190
32188
32186
32184
32173
32172
32171
32167
32165
32163
32162
32158
32157
32155
32151
32149
32135
32132
32127
32125
32122
32120
32119
32117
32116
32115
32114
32112
32111
32109
32107
32104
32103
32102
32101
32094
32089
20404
31036
8279
8268