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

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

· 10년 전 · 5102 · 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년 전
처음으로 유창화님의 강좌를 보고 있습니다
앞으로도 꾸준히 보도록 노력하겠습니다
좋은 강좌 만들어 주셔서 정말 감사합니다
네에 고맙습니다.

게시글 목록

번호 제목
8050
8048
19969
19968
19967
19966
19965
19964
19963
19962
19961
28345
31017
19960
19959
19958
19957
8039
8035
8029
28344
28339
8019
28338
8017
8010
8007
8004
8003
28332
28322
7999
28317
20956
7992
20945
28314
20936
20931
7986
20925
7982
7979
7978
7975
28307
7973
7966
28305
7963
28300
7961
28297
28295
7959
19948
19947
28292
31016
19946
19945
28286
7958
7956
7952
7946
28285
28283
19943
7944
7936
7931
28279
24666
24663
7928
7923
19941
28274
28257
28249
28248
7914
7912
7911
20912
7908
31755
28233
28232
28228
7903
28217
20900
24662
20891
20882
19936
20853
31011