안정버전을 배포하기전에 반드시 해결해야 할 한가지 > 그누3질답

그누3질답

안정버전을 배포하기전에 반드시 해결해야 할 한가지 정보

그누보드 안정버전을 배포하기전에 반드시 해결해야 할 한가지

본문

우선 매번 수정되는 그누보드를 사용해주시는 사용자님들께 감사의 말씀을 드립니다.

여러분들 덕분에 이제 그누보드가 안정되어 가고 있고 머지않아 안정버전을 배포하리라 봅니다.

안정버전을 배포하기전에 반드시 해결해야 할 한가지 일은 바로 경로문제입니다.

현재 그누보드의 경로는 gnu 폴더아래 bbs 폴더를 두어 index 부분과 그누보드 부분의 파일을 서로 분리하고 있습니다.

지금도 ccc님께서 경로문제로 고심을 하고 계시고 어느정도 해결을 하신것으로 알고 있습니다.

제가 생각하는 방안은 두가지가 있습니다.

첫째는 절대경로와 절대url을 사용하는것입니다. 이 방법은 초보님들이 설정하기에는 조금 무리가 있습니다.

둘째는 gnu , bbs , _admin 폴더를 모두 합치는 것입니다. 기존에 꾸며진 홈페이지를 모두 수정하려면 무리가 따를것입니다.

위 방안중에 첫째 방안은 경로문제 만큼은 오류를 완전히 해소할 수 있으리라 봅니다.

경로문제와 관련하여 여러분들이 생각하고 계신 또는 개선방향에 대해 생각나는 점이 있으면 말씀해 주십시오.
  • 복사

댓글 전체

저도 한마디...
일단 폴더구조는 지금 상태인 2.60,2.61버젼 상태가 좋을거 같습니다. 후에 하나씩 늘어가다보면 관리자적인 측면에서 더욱 그러합니다.

하지만 경로문제는 저는 이렇게 되면 어떨까 말해봅니다.절대경로와 상대경로의 병합(가능한지 잘 모르겠지만)
CCC님 이 하신 것처럼(그것이 상대경로가 맞다면) 어느 폴더 구조에서나 그누보드를 뽑아오고 읽을 수 있도록 상대경로를...
그리고 그누보드폴더 안의 폴더와 파일들은 절대경로로 ... 그렇다면
어디서나 읽어지고 또한 그누보드가 실행될때 에러또한 없지 않을까하는 잘 모르는 제가 한 말씀 올렸습니다.
ccc님의 의견이 좋은 것 같근요....
폴더의 이름을 바꾸어도 상간없는.....

그렇습니다.... 다른 폴더에 있는게 좋습니다......

제로보드는 첨 설치 할때 인스톨 화면에서 절대경로를 가르쳐 주더군요.....
같은 폴더 안에 있는 것이 처음에는 좋게 보일지는 몰라도 사이트를 운영하다보면
차츰 불어나는 소스와 페이지들로 인해 머리가 상당히 복자해 집니다.

이때문에 인덱스를 굳이 분리 하려는 시도 가 계속 있는 것이구요.
전 현재의 구조가 아주 좋다고 봅니다.
일단 설치를 하고 나면 data _admin bbs 폴더가 생기는데요.
이이상 좋은 구조는 나오기 힘드리라 봅니다.

어짜피 절대경로를 도입한다 해도 마찬가지 입니다.

전 그동안 관리자님이 왜 절대 경로를 도입하지 않았나 했는데, 하신 말씀을 보고 약간은 충격이었습니다.

초보자에게 힘들다는 이유라니...

초보를 위해 어렵더래도 돌아가야 하는게 있는 반면에 이와 같은 문제는 정면돌파해야 하는 문제가 아닐까요

그리고 현 구조속에서 절대경로를 사용하여 전체 소스를 뒤집어 엎을 필요는 없지만,  꼭 필요한것은 모두

대체 하는것이 좋으리라 봅니다.
gnu 폴더 하나로 합치는 것도 고려하여보는것도 괜찬다고봅니다
제로보드나 phpbb보드 설치시 경로문제 전혀 나지 않습니다 또한 지금까지 접하여본 보드중에 그누보드처럼
복잡하게 폴더로 만들어진 보드도 처음으로 구경합니다 나름대로 장단점이 있겟지요
프로그램에 능통한분들은 소쓰 수정하여서 자신에 맞는 보드로 변경하면 될것이구 일반이들은
변경없이 그대로 사용가능하게 표준적인 그누보드로 배포되엿으면 합니다
현재 버전업글이 게속되면서 너무 변경이 된것이 어렵게 보입니다
게발자인 관리자님이 표준 그누보드 발표하시고 그보드을 에러 잡는대 여려사람이 도와서 제로부드보다
훌륭한 보드가 만들어지길 바랍니다
현재 그누보드 phpbb보드처럼 폴더 구조가 되여있지요 그런대 phpbb는 경로문제 전혀 나지 않습니다
원인이 어디있는지 phpbb보드을 참고하셔 보시는것도 괜찬을것이라고 생각합니다
글구 여기 홈도 가끔 접속 할때 cpu점유률이 100% 잡아 먹더군요 마소 익스하나 뜨우는데
참고로 p-4  1.4 입니다
이미지도 별로 없는데 하도 이상해서 제컴만 바이러스인가 파티 날리고 몇번 다시 깔었어요
역시 가끔 그러더군요 왜그런지는 저도 모르고요 제홈도 가끔 그러구요 제홈엔 바탕에
이미지 깔어서 그런다 치더라도 넘무 심해서리.....
경로문제는 절대 경로와 절대주소를 사용하지 안는한 해결이안될걸 같습니다.

상대 경로 많이 해 봤잔아요 여전히 경로문제 해결이 안되는데

현재 제로보드도 절대 경로와 절대주를 사용하면서 많은 사용자 층을
같고 있습니다 .    그만큼 경로 오류가 적다는 것입니다. 

상대 경로 사용시
같은 홈피를 같고 어느 서버에서는 잘돌아 가고 어디서버에서는 잘안되는 문제가 생기더군요.
심지어는 게시판을 상단 까지 만 읽고 못읽어 오는 문제도 있고요.

제생각 입니다만 config.inc.php부분이나 홈피 상단이나 어느 부분에 절대경로 와 절대주소를
적어 주면 경로 문제가 발생 하지 안는 것이 좋을것 같군요.

관리자님이
첫째는 절대경로와 절대url을 사용하는것입니다. 이 방법은 초보님들이 설정하기에는 조금 무리가 있습니다.
이렇게 말씀 하셨는데
 초보 분들을 이쪽 으로 유도하는것이 나을것 같습니다 .

한번 설정으로 경로문제가 생기지 안는다면 첨엔 설정하기 힘들더라도 그렇게 하는 것이
좋을것 같습니다  한번을 넘어야 할 산이라면 넘어야지요

다시는 경로문제로 이런글이 올라오지 안았으면 하는 바램입니다.

구조는 그대로 가는것이 좋을것 같습니다 이제야 조금씩 안정되어 가는데 여기서 변경하면
또 많은 오류, 혼란, 말리고 십습니다.

제 생각이 었습니다.

또 많은  혼란이 있겠군요 하도 수시로 변형이 많이 되서리 스킨도 제데로  못 만들고  또 만든 스킨들은
많은 시간들을 투자 해서 만든 것 들인데 아깝다는 샣각이 드는 군요.......
초보자인 저도 한마디 거들어도 될지....저역시 CCC님의 말에 동감합니다. 사이트내에서 절대경로를 쓰지 않고도 충분히 해결할 수 있고 저도 그러고 있으며 사이트도 있습니다. 다만...$rootdir = "사이트 절대경로" 로 두고 있기는 합니다. 더불어 제가 그누보드로 너무많은 부분을 배워오면서 내가 원하는 대로 어떤 형태로(whatever i want, i can do express with GNU Board!!)든 사이트 내에서 표현할 수 있는 그누보드가 정말 마음에 들었습니다. 물론 저작권이 없다는 강점으로 알게된것이 사실이지만 말이죠. 고수님들의 도움으로 제가 원하는 보드의 기능이 하나씩 늘어가는 재미,,, 그리고 그 소스를 내 사이트에 딱 맞게 꾸미는 노력......그리고 완성...............정말 재이있습니다...............
config.inc.php 내용입니다.
<?
/*
**  bbsdir  이 변수를 사용한 이유는 폴더이름을 다른 이름으로 변경할 수 있기때문에 변수처리하였습니다.
**  gnudir  이 변수는 _admin 디렉토리안 파일을 상대값을 찾을때 사용합니다. 변수명은 절대 수정,삭제하시면 안됩니다. 
**  gbdir    이 변수는 많이 사용중입니다. 절대 수정, 삭제하시면 정상작동 안합니다.
*/
$gnudir = "gnu";
$bbsdir = "bbs";
$gbdir =  "$gnudir/$bbsdir";


/*
**  테이블 명
*/
$cfg[table_default]      = "gb_default";        // 기본환경설정 테이블
$cfg[table_group]        = "gb_group";          // 그룹 설정 테이블
$cfg[table_group_member] = "gb_group_member";  // 그룹회원 설정 테이블
$cfg[table_board]        = "gb_board";          // 게시판 설정 테이블
$cfg[table_login]        = "gb_login";          // 로그인 테이블 (접속자수)
$cfg[table_member]      = "gb_member";        // 회원 테이블
$cfg[table_memo]        = "gb_memo";          // 메모 테이블
$cfg[table_zip]          = "gb_zip";            // 우편번호 테이블
$cfg[table_vote]        = "gb_vote";          // 투표 테이블
$cfg[table_vote_etc]    = "gb_vote_etc";      // 투표 기타의견 테이블

/*
**  디렉토리
*/
$cfg[dir_admin]  = "_admin";
$cfg[dir_data]    = "data";
$cfg[dir_file]    = "$cfg[dir_data]/file";
$cfg[dir_session] = "$cfg[dir_data]/session";
$cfg[dir_member]  = "$cfg[dir_data]/member";  // 회원아이콘 저장 디렉토리
$cfg[dir_skin]    = "skin";

/*
**  권한
*/
$cfg[level_max] = 10;    // 권한 최대값 (최고 관리자가 아님)
$cfg[level_guest] = 1;    // 방문객 기본 권한

/*
**  기타
*/
$cfg[write_table_prefix] = "gb_write_"; // 게시판 테이블의 접두사
$cfg[link_count] = 2;  // 링크의 필드 갯수 (늘일 경우에는 테이블에 필드도 같이 추가해야함)
$cfg[file_count] = 2;  // 업로드 파일의 필드 갯수 (늘일 경우에는 테이블에 필드도 같이 추가해야함)
$cfg[image_extension] = "/(\.png|\.gif|\.jp[e]?g)$/i"; // bmp는 용량이 크므로 생략
$cfg[flash_extension] = "/(\.swf)$/i"; // 플래쉬
$cfg[movie_extension] = "/(\.as[x|f]+|\.wm[v|a]+|\.mp[e]?g|\.mov|\.avi|\.mp3)$/i"; // 동영상
$cfg[large_image_size] = 580; // 이 수치가 넘어가면 이 수치로 게시판 이미지 크기 고정
$cfg[search_section] = 10000; // 검색시 설정값 단위로 검색
$cfg[reply_max] = 10; // 답변은 설정값 단계 까지만 (늘일 경우에는 테이블에 필드사이즈를 수정해야함)
$cfg[login_minutes] = 5; // 분(설정값) 이내의 접속만 현재 접속자로 인정
$cfg[image_upload_size] = 1024; // 회원의 그림 보관함 기본값 KB 단위
$cfg[leftmargin] = 5; // HTML 좌측 마진
$cfg[topmargin] = 5; // HTML 상단 마진
$cfg[mb_icon_width] = 20; // 회원아이콘 사이즈 최대 폭
$cfg[mb_icon_height] = 20; // 회원아이콘 사이즈 최대 높이
?>
잘 알지는 못하지만 한마디 하죠
관리자님 말씀대로 첫째번 경우는 초보들에겐 무리가 있을것 같구요..
두번째 경우의 견해는 지금 2_60이나 2_61버젼 상태가 괜찮다고 봅니다... 이유는 관리자 화면에서 세부적으로 디테일한 부분까지 조정 설정부분이 없기 때문에 수 작업을 해야합니다..
한번 .php 파일을 전부 분석하기 전에는 어떤 파일이 어떤부분에 적용하는지 알기 까지는 시간이 걸린다는 겁니다.
그래서 gnu폴더안에 bbs, _admin까지 전부 합쳐버린다면 더 헷갈릴수 있다고 봅니다... 물론 프로그래밍 하시는 분의 견해가 아닌 디자인적인 부분에서의 견해이므로 더 쉬운방법이 있을것 같다는 생각도 듭니다...
그누보드를 사용하고자 여기 들어오는 사람들 저 마다의 목적이 있을줄로 압니다만, 그 중에 가장큰 이유는 바로 저작권 표시 의무가 없다는데 이견이 없을줄로 압니다... 그 다음 두번째 이유가 자기 마음대로 변형할수 있다는 점이 강점이랄수 있겠죠.. 그렇다면 두번째 경우에 그누보드가 과연 변형이 쉬운가에 있습니다... 쉬운 사용과 설치 이 부분이 잘 해결된다면 지금 최고의 호가를 누리고 있는 제로보드의 아성을 무너뜨릴 수가 있다고 봅니다... (표현이 다소 뭣합니다만 제로보드와는 원한이 없음을 밝힙니다.) 지금의 폴더구조로 볼때 예전의 폴더 구조와 확연히 정리된 폴더 구조를 가지고 있고
php 에 거의 문외한인 저 역시 많은 시행착오 끝에 설치 성공에서 부터 완전한 변형은 아니지만 디자인 변형을 할수 있는 정도까지 오게 되었습니다.. 이게 다 관리자님과 몇몇 지대한 관심을 가지신 분들의 노력이라 생각합니다.....
//########################### index.html 샘플파일 ######################################
<?
require_once "/home/cccwork/public_html/gnu/lib.inc.php";

head("그누보드");
?>

<br>
<table width=770 cellpadding=0 cellspacing=0 align=center>
<tr>
    <td colspan=3>
        <b>사용법</b>
        <br>
        이 파일의 소스를 참고하여 사용할 곳에 해당 코드를 복사해 넣으시면 됩니다.
        <br>
        <br>
    </td>
</tr>
<tr>
    <td width=150 valign=top>

       
        <!-- 외부 로그인 시작 -->
        <table width=100% border=0 cellpadding=1 cellspacing=0 class=tablebg>
        <tr>
            <td><? include "$reldir/$gbdir/outlogin.php"; ?></td>
        </tr>
        </table>
        <!-- 외부 로그인 끝 -->
       
        <!-- 공백 -->
        <table width=100% height=5><tr><td></td></tr></table>

        <!-- 현재접속자수 표시 시작 -->
        <table width=100% border=0 cellpadding=1 cellspacing=0 class=tablebg>
        <tr>
            <td>
                <table width=100% height=100% cellpadding=2 cellspacing=0>
                <tr>
                    <td bgcolor=FFFFFF>
                        <table width=100% cellpadding=2 cellspacing=0>
                        <tr><td width=50% align=right>손님&nbsp;</td><td width=50%><? echo get_login_count('guest') ?>명</td></tr>
                        <tr><td width=50% align=right>회원&nbsp;</td><td width=50%><? echo get_login_count('member') ?>명</td></tr>
                        <tr><td width=50% align=right>전체&nbsp;</td><td width=50%><? echo get_login_count('total') ?>명</td></tr>
                        </table>
                    </td>
                </tr>
                </table>
            </td>
        </tr>
        </table>
        <!-- 현재접속자수 표시 끝 -->

        <!-- 공백 -->
        <table width=100% height=5><tr><td></td></tr></table>

        <!-- 회원수 표시 시작 -->
        <table width=100% border=0 cellpadding=1 cellspacing=0 class=tablebg>
        <tr>
            <td>
                <table width=100% height=100% cellpadding=2 cellspacing=0>
                <tr>
                    <td bgcolor=FFFFFF>
                        <?
                        $sql = " select count(*) from $cfg[table_member] ";
                        $row = sql_fetch_array($sql);
                        $total_member = $row[0];
                       
                        $sql = " select count(*) from $cfg[table_member]
                                  where TO_DAYS(CURDATE()) - TO_DAYS(mb_datetime) = 0 ";
                        $row = sql_fetch_array($sql);
                        $today_member = $row[0];
                        ?>
                        <table width=100% cellpadding=2 cellspacing=0>
                        <tr><td width=60% align=right>전체회원수&nbsp;</td><td width=40%><?=$total_member?>명</td></tr>
                        <tr><td width=60% align=right>오늘가입&nbsp;</td><td width=40%><?=$today_member?>명</td></tr>
                        </table>
                    </td>
                </tr>
                </table>
            </td>
        </tr>
        </table>
        <!-- 회원수 표시 끝 -->

        <!-- 공백 -->
        <table width=100% height=5><tr><td></td></tr></table>

        <!-- 접속 회원 표시 시작 -->
        <table width=100% border=0 cellpadding=1 cellspacing=0 class=tablebg>
        <tr>
            <td>
                <table width=100% bgcolor=#ffffff cellpadding=0 cellspacing=0>
                <tr>
                    <td align=center bgcolor=FFFFFF>
                        <table width=100%>
                        <?
                        include "$reldir/$gbdir/gblayer.php";
                        $sql = " select a.mb_id, b.mb_name, b.mb_icon, a.lo_ip
                                  from $cfg[table_login] a left join $cfg[table_member] b on (a.mb_id = b.mb_id)
                                  where a.mb_id <> ''
                                  order by a.lo_ip ";
                        $result = sql_query_error($sql);
                        for ($i=0; $row=mysql_fetch_array($result); $i++) {
                            $mb_name = gblayer($row[mb_id], $row[mb_name], $row[mb_email], $row[mb_homepage]);
                         
                            echo "
                            <tr>
                                <td width=85% align=right style='color:777777'>$mb_name&nbsp;</td>
                                <td width=15% align=left>&nbsp;</td>
                            </tr>";
                           
                        }
                        mysql_free_result($result);
                        if ($i==0)
                            echo "<tr><td colspan=2 align=center><font color=222222>없음</font></td></tr>";
                        ?>
                        </table>
                    </td>
                </table>
            </td>
        </tr>
        </table>
        <!-- 접속 회원 표시 끝 -->

    </td>

    <td width=10></td>
    <td width='' valign=top>
        <a href='http://61.40.183.198/~cccwork/test/ccc/index.php'>http://61.40.183.198/~cccwork/test/ccc/index.php</a><br>
        현재경로는 : <?=$reldir?>입니다.
        <!-- 투표 시작 -->
        <? include "$reldir/$gbdir/vote.php"; ?>
        <!-- 투표 끝 -->
       
        <br>

        <!-- 최신글 시작 -->
        <?
            print_bbs('newlist','free', '자유게시판', 10, 40) ;
        ?>
        <?
            print_bbs('newlist','qa', '질문게시판', 10, 40) ;
        ?>
        <!-- 최신글 끝 -->

    </td>
</tr>
</table>


<?
tail();
?>

//####################################################################################
lib.inc.php내에  function head($title="", $script="")
//##########################################################################
// 화면 머리부분
function head($title="", $script="")
{
global $reldir, $bbsdir, $gnudir, $cfg, $board, $group, $default, $member;
global $board_skin, $outlogin_skin, $member_skin, $memo_skin, $latest_skin, $dir;
global $is_admin;
global $HTTP_SERVER_VARS;

$gmnow = gmdate('D, d M Y H:i:s') . ' GMT';
header('Expires: 0'); // rfc2616 - Section 14.21
header('Last-Modified: ' . $gmnow);
header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1
header('Pragma: no-cache'); // HTTP/1.0

// 쪽지가 전달되었나?
if ($member[mb_memo_call_mb_id]) {
    $mb = get_member($member[mb_memo_call_mb_id]);
    $sql = " update $cfg[table_member]
                set mb_memo_call_mb_id = ''
              where mb_id = '$member[mb_id]' ";
    sql_query_error($sql);

    alert("{$mb[mb_name]}($member[mb_memo_call_mb_id])님으로부터 쪽지가 전달되었습니다.", $HTTP_SERVER_VARS[REQUEST_URI]);
}

echo "<html>
<head>
<meta http-equiv='content-type' content='text/html; charset=euc-kr'>
<title>{$title}</title>
<link rel='stylesheet' href='{$reldir}/{$gnudir}/style.css' type='text/css'>
</head>

<script language='JavaScript' src='{$reldir}/{$gnudir}/javascript.js'></script>

<body leftmargin='{$cfg[leftmargin]}' topmargin='{$cfg[topmargin]}' {$script}>

<!-- 상단 책갈피 -->

<table width=100% cellpadding=0 cellspacing=0 border=0><tr><td>
";

if ($board[bo_include_head]) { @include $board[bo_include_head]; }
if ($board[bo_content_head]) { echo stripslashes($board[bo_content_head]); }
}

// 화면 꼬리부분
function tail()
{
global $reldir, $bbsdir, $gnudir, $cfg, $board;

if ($board[bo_content_tail]) { echo stripslashes($board[bo_content_tail]); }
if ($board[bo_include_tail]) { @include $board[bo_include_tail]; }

echo "
</td></tr></table>

<script language='JavaScript' src='{$reldir}/{$gnudir}/wrest.js'></script>

</body>
</html>";
}

//##########################################################################
gbview.php내용
//##########################################################################
<?
if (!defined("IN_GNUBOARD")) {
    die('Hacking 시도');
}

//@set_time_limit(0);
include_once "../lib.inc.php";

$begin_time = get_microtime();

// 쿠키에 저장된 ID값과 넘어온 ID값을 비교하여 같지 않을 경우 Hit 수를 증가 시킴
if ("$bo_table|$wr_id" != $HTTP_SESSION_VARS[ss_view]) {
    session_register("ss_view");
    $ss_view = "$bo_table|$wr_id";

    sql_query_error(" update $write_table set wr_hit = wr_hit + 1 where wr_id = '$wr_id' ");

    insert_point($member[mb_id], $default[de_read_point]);
}

$html_title = cut_str($write[wr_subject], 255);

$sql_search = "";
// 검색이면
if ($stext) {
    // where 문을 얻음
    $sql_search = get_sql_search($sselect, $stext);
    $a_search_list = "<a href='gnuboard.php?$qstr&page=$page'>";
    $a_list = "<a href='gnuboard.php?bo_table=$bo_table'>";
} else {
    $show_search_list_begin = "<!--";
    $show_search_list_end = "-->";
    $a_list = "<a href='gnuboard.php?bo_table=$bo_table&page=$page'>";
}

if (!$board[bo_use_listview]) {
    // 이전 글을 얻음
    $sql = " select wr_id, wr_subject from $write_table where wr_comment = '0' and wr_notice = '$write[wr_notice]' and wr_num = '$write[wr_num]' and wr_reply < '$write[wr_reply]' $sql_search order by wr_notice desc, wr_num desc, wr_reply desc limit 1 ";
    $prev = sql_fetch_array($sql);
    // 위의 쿼리문으로 값을 얻지 못했다면
    if (!$prev[0]) {
        $sql = " select wr_id, wr_subject from $write_table where wr_comment = '0' and wr_notice = '$write[wr_notice]' and wr_num < '$write[wr_num]' $sql_search order by wr_notice desc, wr_num desc, wr_reply desc limit 1 ";
        $prev = sql_fetch_array($sql);
        if (!$prev[0]) {
            $sql = " select wr_id, wr_subject from $write_table where wr_comment = '0' and wr_notice < '$write[wr_notice]' $sql_search order by wr_notice desc, wr_num desc, wr_reply desc limit 1 ";
            $prev = sql_fetch_array($sql);
        }
    }

    // 다음 글을 얻음
    $sql = " select wr_id, wr_subject from $write_table where wr_comment = '0' and wr_notice = '$write[wr_notice]' and wr_num = '$write[wr_num]' and wr_reply > '$write[wr_reply]' $sql_search order by wr_notice, wr_num, wr_reply limit 1 ";
    $next = sql_fetch_array($sql);
    // 위의 쿼리문으로 값을 얻지 못했다면
    if (!$next[0]) {
        $sql = " select wr_id, wr_subject from $write_table where wr_comment = '0' and wr_notice = '$write[wr_notice]' and wr_num > '$write[wr_num]' $sql_search order by wr_notice, wr_num, wr_reply limit 1 ";
        $next = sql_fetch_array($sql);
        // 위의 쿼리문으로 값을 얻지 못했다면
        if (!$next[0]) {
            $sql = " select wr_id, wr_subject from $write_table where wr_comment = '0' and wr_notice > '$write[wr_notice]' $sql_search order by wr_notice, wr_num, wr_reply limit 1 ";
            $next = sql_fetch_array($sql);
        }
    }
}

if ($prev[0]) {
    $prev_wr_subject = get_text(cut_str($prev[wr_subject], 255));
    $prev_wr_id = $prev[wr_id];
    $a_prev = "<a href='gnuboard.php?$qstr&wr_id={$prev_wr_id}&page=$page'>";
} else {
    $show_prev_begin = "<!--";
    $show_prev_end = "-->";
}

if ($next[0]) {
    $next_wr_subject = get_text(cut_str($next[wr_subject], 255));
    $next_wr_id = $next[wr_id];
    $a_next = "<a href='gnuboard.php?$qstr&wr_id={$next_wr_id}&page=$page'>";
} else {
    $show_next_begin = "<!--";
    $show_next_end = "-->";
}

if ($member[mb_level] >= $board[bo_write_level]) {
    $a_write = "<a href='gbform.php?bo_table=$bo_table'>";
} else {
    $show_write_begin = "<!--";
    $show_write_end = "-->";
}

if ($write[wr_notice] == 0 && ($member[mb_level] >= $board[bo_reply_level])) {
    $a_reply = "<a href='gbform.php?w=r&$qstr&wr_id=$wr_id'>";
} else {
    $show_reply_begin = "<!--";
    $show_reply_end = "-->";
}

// 로그인중이고 자신의 글이라면 또는 관리자라면 비밀번호를 묻지 않고 바로 수정, 삭제 가능
if (($member[mb_id] && ($member[mb_id] == $write[mb_id])) || $is_admin) {
    $a_update = "<a href='gbform.php?w=u&$qstr&page=$page&wr_id=$wr_id'>";
    $a_delete = "<a href=\"javascript:if (confirm('삭제하시겠습니까?')) {location='gbdelete.php?w=d&$qstr&page=$page&wr_id=$wr_id';}\">";
} else if (!$write[mb_id]) { // 회원이 쓴 글이 아니라면
    $a_update = "<a href='gbpasswd.php?w=u&$qstr&page=$page&wr_id=$wr_id'>";
    $a_delete = "<a href='gbpasswd.php?w=d&$qstr&page=$page&wr_id=$wr_id'>";
} else {
    $show_update_begin = "<!--";
    $show_update_end = "-->";
    $show_delete_begin = "<!--";
    $show_delete_end = "-->";
}

// 최고, 그룹관리자라면 글 복사, 이동 가능
if ($write[wr_reply] == '' && ($is_admin == 'default' || $is_admin == 'group')) {
    $a_copy = "<a href='javascript:void(0);' onclick=\"window.open('gbmove.php?w=c&$qstr&wr_id=$wr_id&page=$page', 'gbcopy', 'left=50, top=50, width=400, height=400, scrollbars=1');\">";
    $a_move = "<a href='javascript:void(0);' onclick=\"window.open('gbmove.php?w=m&$qstr&wr_id=$wr_id&page=$page', 'gbmove', 'left=50, top=50, width=400, height=400, scrollbars=1');\">";
} else {
    $show_copymove_begin = "<!--";
    $show_copymove_end = "-->";
}

//$name = get_text(cut_str($write[wr_name], 20));

// 메일 주소가 있다면 @ 대신 &#064; 캐릭터 엔티티로 변환 (스팸방지)
//if ($write[wr_email]) {
//    $wr_name = "<a href='mailto:" . preg_replace("/@/", "&#064;", $write[wr_email]) . "'>$wr_name</a>";
//    $wr_email = $write[wr_email];
//}

$name = gblayer($write[mb_id], get_text(cut_str($write[wr_name],20)), $write[wr_email], $write[wr_homepage]);

$datetime = $write[wr_datetime];
$hit = $write[wr_hit];
$good = $write[wr_good];
$nogood = $write[wr_nogood];

// 관리자가 아니라면 중간 IP 주소 두개를 감춘후 보여줍니다.
$ip = $write[wr_ip];
if (!$is_admin) {
    $ip = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", "\\1.*.*.\\4", $ip);
}

$show_homepage_begin = "<!--";
$show_homepage_end = "-->";
if ($write[wr_homepage]) {
    $homepage = set_http(get_text(cut_str($write[wr_homepage], 255)));
    $a_homepage = "<a href='$homepage' target='$default[de_link_target]'>";
    $show_homepage_begin = "";
    $show_homepage_end = "";
}

$show_link1_begin = "<!--"; $show_link1_end = "-->";
if ($write[wr_link1]) {
    $link1 = set_http(get_text(cut_str($write[wr_link1], 255)));
    $a_link1 = "<a href='gblink.php?$qstr&wr_id=$wr_id&index=1' target='$default[de_link_target]'>";
    $link1_hit = $write[wr_link1_hit];
    $show_link1_begin = "";
    $show_link1_end = "";
}

$show_link2_begin = "<!--"; $show_link2_end = "-->";
if ($write[wr_link2]) {
    $link2 = set_http(get_text(cut_str($write[wr_link2], 255)));
    $a_link2 = "<a href='gblink.php?$qstr&wr_id=$wr_id&index=2' target='$default[de_link_target]'>";
    $link2_hit = $write[wr_link2_hit];
    $show_link2_begin = "";
    $show_link2_end = "";
}

$show_file1_begin = "<!--";
$show_file1_end = "-->";

if ($write[wr_file1]) {
    if (!(preg_match($cfg[image_extension],$write[wr_file1]) ||
        preg_match($cfg[flash_extension],$write[wr_file1]) ||
        preg_match($cfg[movie_extension],$write[wr_file1]))) {
        $a_file1 = "<a href='gbdownload.php?$qstr&wr_id=$wr_id&index=1'>";
        $file1_download = $write[wr_file1_download];
        $file1_size = get_filesize("$reldir/$gnudir/$cfg[dir_file]/$bo_table/$write[wr_file1]");
        $file1 = $write[wr_file1_source];
        $show_file1_begin = "";
        $show_file1_end = "";
    }
    $file1_view = view_file_link($write[wr_file1]);
}

$show_file2_begin = "<!--";
$show_file2_end = "-->";
if ($write[wr_file2]) {
    if (!(preg_match($cfg[image_extension],$write[wr_file2]) ||
        preg_match($cfg[flash_extension],$write[wr_file2]) ||
        preg_match($cfg[movie_extension],$write[wr_file2]))) {
        $a_file2 = "<a href='gbdownload.php?$qstr&wr_id=$wr_id&index=2'>";
        $file2_download = $write[wr_file2_download];
        $file2_size = get_filesize("$reldir/$gnudir/$cfg[dir_file]/$bo_table/$write[wr_file2]");
        $file2 = $write[wr_file2_source];
        $show_file2_begin = "";
        $show_file2_end = "";
    }
    $file2_view = view_file_link($write[wr_file2]);
}

if ($write[ca_id]) {
    $category_name = get_category_name($write_table, $write[ca_id]);
}

$subject = conv_subject($write[wr_subject], 255);
$content = conv_content($write[wr_content], $write[wr_html]);

for ($i=1; $i<=$cfg[file_count]; $i++) {

    $wr_file = $write["wr_file$i"];

    if (eregi($cfg[image_extension], $wr_file) ||
        eregi($cfg[flash_extension], $wr_file) ||
        eregi($cfg[movie_extension], $wr_file)) {

        $size = getimagesize("$reldir/$cfg[dir_file]/$wr_file");
        $file[$i]->source_width  = $size[0];
        $file[$i]->source_height = $size[1];

        if ($board[bo_table_width] <= 100) {
            if ($size[0] > $cfg[large_image_size]) {
                $rate = $size[1] / $size[0];
                $size[0] = $cfg[large_image_size];
                $size[1] = (int)($size[0] * $rate);
            }
        } else {
            if ($size[0] > $board[bo_table_width]) {
                $rate = $size[1] / $size[0];
                $size[0] = $board[bo_table_width];
                $size[1] = (int)($size[0] * $rate);
            }
        }

        $file[$i]->wr_file = $wr_file;
        $file[$i]->width  = $size[0];
        $file[$i]->height  = $size[1];

        if (eregi($cfg[image_extension], $wr_file)) {
            $file[$i]->kind = 'image';
        } else if (eregi($cfg[swf_extension], $wr_file)) {
            $file[$i]->kind = 'flash';
        } else if (eregi($cfg[movie_extension], $wr_file)) {
            $file[$i]->kind = 'movie';
        }
    }

}

if ($write[mb_id]) {
    $mb = get_member($write[mb_id]);

    $show_signature_begin = "<!--";
    $show_signature_end = "-->";
    if ($board[bo_use_signature]) {
        $signature = convert_signature($mb[mb_signature]);
        if ($signature) {
            $signature = "<br><br><br><br>" . $signature;
        }
        $show_signature_begin = "";
        $show_signature_end = "";
    }
}

include_once "$board_skin/gbview_main.skin.php";

if ($board[bo_use_comment]) {
    // 코멘트 출력
    $sql = " select * from $write_table
              where wr_parent_id = '$write[wr_id]'
                and wr_comment > 0
              order by wr_comment ";
    $result = sql_query_error($sql);
    for ($i=0; $row=mysql_fetch_array($result); $i++) {
        $comment_content = conv_content($row[wr_content], 0);
        /*
        $comment_content = $row[wr_content];

        if ($stext) {
            $comment_content = set_search_font($stext, $comment_content);
        }

        $comment_content = get_text($comment_content, 1);

        if ($stext) {
            $comment_content = get_search_font($comment_content);
        }

        $comment_content = urlautolink($comment_content);
        */

        $comment_name = gblayer($row[mb_id], cut_str($row[wr_name], 20, ''), $row[wr_email], $row[wr_homepage]);

        $comment_mb_id = $comment_mb_icon = "";
        if ($row[mb_id]) {
            $mb = get_member($row[mb_id]);
            $comment_mb_id = $mb[mb_id];
            if ($mb[mb_icon]) {
                $comment_mb_icon = "<img src='$cfg[dir_member]/$mb[mb_icon]' align=absmiddle>";
            }
        }

        $comment_email = $row[wr_email];
        $comment_datetime = substr($row[wr_datetime],2,14);
        $comment_wr_id = $row[wr_id];

        // 관리자가 아니라면 중간 IP 주소 두개를 감춘후 보여줍니다.
        $comment_ip = $row[wr_ip];
        if (!$is_admin) {
            $comment_ip = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", "\\1.*.*.\\4", $comment_ip);
        }

        $show_comment_delete_begin = "<!--";
        $show_comment_delete_end = "-->";
        if ($member[mb_id]) {
            if ($row[mb_id] == $member[mb_id] || $is_admin) {
                $a_comment_delete = "<a href=\"javascript:if (confirm('삭제하시겠습니까?')) {location='gbdelete.php?w=x&$qstr&wr_id=$comment_wr_id';}\">";
                $show_comment_delete_begin = "";
                $show_comment_delete_end = "";
            }
        } else {
            if (!$row[mb_id]) {
                $a_comment_delete = "<a href='gbpasswd.php?w=x&$qstr&wr_id=$comment_wr_id'>";
                $show_comment_delete_begin = "";
                $show_comment_delete_end = "";
            }
        }

        include "$board_skin/gbview_clist.skin.php";
    }
    mysql_free_result($result);

    if ($default[de_use_cookie]) {
        $tmp_c_name = $HTTP_COOKIE_VARS[ck_wr_name];
    }

    if ($member[mb_id]) {
        $show_c_passwd_begin = "<!--";
        $show_c_passwd_end = "-->";
        $c_name = "<b>$member[mb_name]</b>";
    } else {
        $show_c_passwd_begin = "";
        $show_c_passwd_end = "";
        $c_name = "<input type=text name=wr_name size=10 value='$tmp_c_name' class=input required itemname='이름'>";
    }

    if ($member[mb_level] >= $board[bo_comment_level]) {
        include_once "$board_skin/gbview_cwrite.skin.php";
    }
}

$run_time = get_microtime() - $begin_time;

include_once "$board_skin/gbview_tail.skin.php";
?>
//##################################################################################
스킨은 거의 수정 불필요합니다.
outlogout.skin.php
//###################################################################################
<?
/*
    ===============
    사용가능 변수 설명
    ===============

    <?=$member_skin?> // 회원 스킨경로
    <?=$script_name?> // 현재페이지 경로
    <?=$query_string?> // get 방식으로 넘어온 변수목록 (?뒤의 문자열)
*/
?>
<table width=100% cellpadding=2 cellspacing=0>
<tr>
    <td bgcolor=FFFFFF align=center>
        <table width=100% cellpadding=0 cellspacing=0>
        <form name=fhead method='post' action='<?=$reldir?>/<?=$gbdir?>/mblogincheck.php'>
        <input type=hidden name=url value='<?=$script_name?><?=$query_string?>'>
        <tr>
            <td width=50% align=right height=20>아이디 &nbsp;</td>
            <td width=50%><input type=text name=mb_id class=input size=10 maxlength=20 required itemname="아이디" autocomplete='off'></td>
        </tr>
        <tr>
            <td align=right height=20>비밀번호 &nbsp;</td>
            <td><input type=password name=mb_passwd class=input size=10 maxlength=20 required itemname="암호"></td>
        </tr>
        <tr>
            <td colspan=2 align=center height=30>
                <input type=submit value='  로그인  ' class=button>
                <a href="javascript:void(0);" onclick="window.open('<?=$reldir?>/<?=$gbdir?>/mbform.php?w=', '', 'left=50, top=50, width=500, height=500, scrollbars=1');">회원가입</a>
            </td>
        </tr>
        </form>
        </table>

        <a href="javascript:void(0);" onclick="window.open('<?=$reldir?>/<?=$gbdir?>/mbpasswdforget.php', '', 'left=50, top=50, width=400, height=200, scrollbars=1');">비밀번호 찾기</a>

    </td>
</tr>
</table>

<script language='javascript'>
    function autologin(fld)
    {
        if (fld.checked) {
            if (!confirm("자동 로그인을 사용하시겠습니까?\n\n자동 로그인을 사용하시면 다음부터는 로그인을 하실 필요가 없습니다.\n\n단, 여러 사람이 사용하는 학교, 피씨방등에서에서는 개인정보가 유출될 수 있으니 주의하십시오.")) {
                fld.checked = false;
            }
        }
    }
</script>

소스전체 공개안하는 이유는 잡담란에 올렸습니다. 필요하신면 개인적으로는 보내드립니다.(사실 별것도 없네요)
보시고 판단해주시고요! 운영자님이 적용시킨다면 소스전체 바로 올리겠습니다.
전체 페이지가 아닙니다.
index.html등에서 lib.inc.php를 include하는데 말그대로 상대주소찾기를 lib.inc.php에서 하는데
아무것도 선언안된상태에서 lib.inc.php를 찾을수가 없죠...
그러기 때문에 그누보드자원을 끌어다 쓸때 꼭 한번 /home/ccc/www/gnu/lib.inc.php 절대값으로
넘겨줄 필요가 있습니다.
대략적인 소스 간략하게 올려봅니다. 이해가 되시리라 믿으며...
그리고 경로문제는 100%해결되었다고 봅니다. 약간 경로수정안본게 어디서 나올지 모르겠네요...그것만 찾아다니면서
수정하면 전혀문제없습니다....예로

<?=$reldir?>/<?=$gbdir?>
<?=$reldir?>/<?=$gnudir?> 이 두가지 경로사용으로 모두 해결되었습니다. 또한
config.inc.php또는  lib.inc.php상에 어던 절대경로나 절대 url를 사용하지 않습니다.
오직 lin.inc.php를 일반 페이지에서 불러올때만
<? include "/home/ccc/www/gnu/lib.in.php"; ?> 이렇게만 사용해주시면
전혀 문제 발생을 안합니다. *^^*
지금 제가 구현한 방식은 절대경로와 절대 url를 사용하지 않고 구현햇습니다.
전혀 무리 없이 작동합니다. 지금구도 그대로구요! 참고해주세요!
© SIRSOFT
현재 페이지 제일 처음으로