common.lib.php 수정 문의 드립니다. > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

common.lib.php 수정 문의 드립니다. 정보

common.lib.php 수정 문의 드립니다.

본문

라이트박스 때문에 질문을 드렸는데 답변이 없어서 질문을 바꿔서 다시 문의드립니다. ㅠ ㅠ

common.lib.php 파일 안에 보면


<?php

if (!defined('_GNUBOARD_')) exit;

/*************************************************************************
**
**  일반 함수 모음
**
*************************************************************************/

// 마이크로 타임을 얻어 계산 형식으로 만듦
function get_microtime()
{
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}

/**
 * @brief 디버그 메시지 출력
 * XpressEngine의 코드 차용. http://xpressengien.com/
 **/
function debugPrint($debug_output = null) {
    $bt = debug_backtrace();
    if(is_array($bt)) $first = array_shift($bt);
    $file_name = $first['file'];
    $line_num = $first['line'];

    $debug_file = $g4['path'].'/data/_debug_message.php';
    $debug_output = sprintf("[%s %s:%d]\n%s\n",
        date('Y-m-d H:i:s'),
        $file_name,
        $line_num,
        print_r($debug_output, true)
    );

    $debug_output = '<?php exit(); ?>'.str_repeat('=', 40)."\n".$debug_output.str_repeat('-', 40)."\n\n";

    $fp = @fopen($debug_file, 'a');
    if(!$fp) return;

    fwrite($fp, $debug_output);
    fclose($fp);
}

// 현재페이지, 총페이지수, 한페이지에 보여줄 행, URL
/*
function get_paging($write_pages, $cur_page, $total_page, $url, $add="")
{
    $str = "";
    if ($cur_page > 1) {
        $str .= "<a href=\"".$url."1{$add}\">처음</a>";
        $str .= "[<a href=\"".$url.($cur_page-1)."\">이전</a>]";
    }

    $start_page = ( ( (int)( ($cur_page - 1 ) / $write_pages ) ) * $write_pages ) + 1;
    $end_page = $start_page + $write_pages - 1;

    if ($end_page >= $total_page) $end_page = $total_page;

    if ($start_page > 1) $str .= " &nbsp;<a href=\"" . $url . ($start_page-1) . "{$add}\">이전</a>";

    if ($total_page > 1) {
        for ($k=$start_page;$k<=$end_page;$k++) {
            if ($cur_page != $k)
                $str .= "&nbsp;<a href=\"$url$k{$add}\"><span>$k</span></a>";
            else
                $str .= "&nbsp;<strong>$k</strong> ";
        }
    }

    if ($total_page > $end_page) $str .= "&nbsp;<a href=\"".$url.($end_page+1)."{$add}\">다음</a>";

    if ($cur_page < $total_page) {
        $str .= "&nbsp;[<a href=\"$url".($cur_page+1)."\">다음</a>]";
        $str .= "&nbsp;<a href=\"$url$total_page{$add}\">맨끝</a>";
    }
    $str .= "";

    return $str;
}
*/

function get_paging($write_pages, $cur_page, $total_page, $url, $add="")
{
        $str = "<div id=\"paginate\" class=\"paginate _page_area page_loaded\">";
        if ($cur_page > 1) {

            $str .= "<a href=\"".$url.($start_page)."\" class=\"pre_end\">맨앞</a><a href=\"".$url.($cur_page-1)."{$add}\" class=\"pre\">이전</a>";
        }
        else{
            $str .= "";
        }

        $start_page = ( ( (int)( ($cur_page - 1 ) / $write_pages ) ) * $write_pages ) + 1;
        $end_page = $start_page + $write_pages - 1;
        if ($end_page >= $total_page) $end_page = $total_page;

        $pre_count = $start_page-$write_pages;
        if($pre_count <= 0)$pre_count=1;
        $start_paging=$start_page-1;
        if ($start_page > 1) $str .= "<a class=\"number\" href=\"".$url.($start_page-1)."{$add}\">$pre_count  ~ $start_paging</a>";
        if ($total_page > 1) {

            for ($k=$start_page;$k<=$end_page;$k++) {

                if ($cur_page != $k)
                    $str .= "<a href=\"$url$k{$add}\">$k</a>";
                else
                    $str .= "<strong>$k</strong>";
            }
        }

        $end_paging=$end_page +1;
        $page_count=$end_page+$write_pages;
        if($total_page < $page_count) $page_count=$total_page;
        if ($total_page > $end_page) $str .= "<a href=\"".$url.($end_page+1)."{$add}\">$end_paging ~ $page_count</a>";

        if ($cur_page && $cur_page < $total_page) {

            $str .= "<a class=\"next\" href=\"$url".($cur_page+1)."\">다음</a><a href=\"$url".($total_page)."\" class=\"next_end\">맨뒤</a>";
        }
        else{
            $str .= "";
        }
        $str .= "</div>";

        return $str;
}

// 변수 또는 배열의 이름과 값을 얻어냄. print_r() 함수의 변형
function print_r2($var)
{
    ob_start();
    print_r($var);
    $str = ob_get_contents();
    ob_end_clean();
    $str = preg_replace("/ /", "&nbsp;", $str);
    echo nl2br("<span style='font-family:Tahoma, 굴림; font-size:9pt;'>$str</span>");
}


// 메타태그를 이용한 URL 이동
// header("location:URL") 을 대체
function goto_url($url)
{
    echo "<meta http-equiv=\"content-type\" content=\"text/html; charset={$g4['charset']}\">";
    echo "<script type=\"text/javascript\"> location.replace('$url'); </script>";
    exit;
}


// 세션변수 생성
function set_session($session_name, $value)
{
    if (PHP_VERSION < '5.3.0')
        session_register($session_name);
    // PHP 버전별 차이를 없애기 위한 방법
    $$session_name = $_SESSION["$session_name"] = $value;
}


// 세션변수값 얻음
function get_session($session_name)
{
    return $_SESSION[$session_name];
}


// 쿠키변수 생성
function set_cookie($cookie_name, $value, $expire)
{
    global $g4;

    setcookie(md5($cookie_name), base64_encode($value), $g4['server_time'] + $expire, '/', $g4['cookie_domain']);
}


// 쿠키변수값 얻음
function get_cookie($cookie_name)
{
    return base64_decode($_COOKIE[md5($cookie_name)]);
}


// 경고메세지를 경고창으로
function alert($msg='', $url='')
{
	global $g4;

    if (!$msg) $msg = '올바른 방법으로 이용해 주십시오.';

	echo "<meta http-equiv=\"content-type\" content=\"text/html; charset={$g4['charset']}\">";
	echo "<script type=\"text/javascript\">alert('$msg');";
    if (!$url)
        echo "history.go(-1);";
    echo "</script>";
    if ($url)
        goto_url($url);
    exit;
}


// 경고메세지 출력후 창을 닫음
function alert_close($msg)
{
	global $g4;

	echo "<meta http-equiv=\"content-type\" content=\"text/html; charset={$g4['charset']}\">";
    echo "<script type=\"text/javascript\"> alert('$msg'); window.close(); </script>";
    exit;
}


// way.co.kr 의 wayboard 참고
function url_auto_link($str)
{
    global $config;

    $str = preg_replace("/&lt;/", "\t_lt_\t", $str);
    $str = preg_replace("/&gt;/", "\t_gt_\t", $str);
    $str = preg_replace("/&amp;/", "&", $str);
    $str = preg_replace("/&quot;/", "\"", $str);
    $str = preg_replace("/&nbsp;/", "\t_nbsp_\t", $str);
    $str = preg_replace("/([^(http:\/\/)]|\(|^)(www\.[^[:space:]]+)/i", "\\1<A HREF=\"http://\\2\" TARGET=\"{$config['cf_link_target']}\">\\2</A>", $str);
    $str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[가-힣\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1<A HREF=\"\\2\" TARGET=\"{$config['cf_link_target']}\">\\2</A>", $str);
    $str = preg_replace("/([0-9a-z]([-_\.]?[0-9a-z])*@[0-9a-z]([-_\.]?[0-9a-z])*\.[a-z]{2,4})/i", "<a href=\"mailto:\\1\">\\1</a>", $str);
    $str = preg_replace("/\t_nbsp_\t/", "&nbsp;" , $str);
    $str = preg_replace("/\t_lt_\t/", "&lt;", $str);
    $str = preg_replace("/\t_gt_\t/", "&gt;", $str);

    return $str;
}


// url에 http:// 를 붙인다
function set_http($url)
{
    if (!trim($url)) return;

    if (!preg_match("/^(http|https|ftp|telnet|news|mms)\:\/\//i", $url))
        $url = "http://" . $url;

    return $url;
}


// 파일의 용량을 구한다.
function get_filesize($size)
{
    //$size = @filesize(addslashes($file));
    if ($size >= 1048576) {
        $size = number_format($size/1048576, 1) . "M";
    } else if ($size >= 1024) {
        $size = number_format($size/1024, 1) . "K";
    } else {
        $size = number_format($size, 0) . "byte";
    }
    return $size;
}


// 게시글에 첨부된 파일을 얻는다. (배열로 반환)
function get_file($bo_table, $wr_id, $board)
{
    global $g4, $qstr;

    $file["count"] = 0;
    $sql = " select * from {$g4['board_file_table']} where bo_table = '$bo_table' and wr_id = '$wr_id' order by bf_no ";
    $result = sql_query($sql);
    while ($row = sql_fetch_array($result))
    {
        $no = $row['bf_no'];
        $file[$no]['href']        = "./download.php?bo_table=$bo_table&amp;wr_id=$wr_id&amp;no=$no" . $qstr;
        $file[$no]['download']    = $row['bf_download'];
        $file[$no]['path']        = "{$g4['path']}/data/file/$bo_table";
        $file[$no]['size']        = get_filesize($row['bf_filesize']);
        $file[$no]['datetime']    = $row['bf_datetime'];
        $file[$no]['source']      = addslashes($row['bf_source']);
        $file[$no]['bf_content']  = $row['bf_content'];
        $file[$no]['content']     = get_text($row['bf_content']);
        $file[$no]['view']        = view_file_link($row['bf_file'], $row['bf_width'], $row['bf_height'], $file[$no]['content'], $board);
        $file[$no]['file']        = $row['bf_file'];
        $file[$no]['image_width'] = $row['bf_width'] ? $row['bf_width'] : 640;
        $file[$no]['image_height']= $row['bf_height'] ? $row['bf_height'] : 480;
        $file[$no]['image_type']  = $row['bf_type'];
        $file["count"]++;
    }

    return $file;
}


// 폴더의 용량 ($dir는 / 없이 넘기세요)
function get_dirsize($dir)
{
    $size = 0;
    $d = dir($dir);
    while ($entry = $d->read()) {
        if ($entry != "." && $entry != "..") {
            $size += filesize("$dir/$entry");
        }
    }
    $d->close();
    return $size;
}


/*************************************************************************
**
**  그누보드 관련 함수 모음
**
*************************************************************************/


// 게시물 정보($write_row)를 출력하기 위하여 $list로 가공된 정보를 복사 및 가공
function get_list($write_row, $board, $skin_path, $subject_len=40)
{
    global $g4, $config;
    global $qstr, $page;

    // 배열전체를 복사
    $list = $write_row;
    unset($write_row);

    $list['is_notice'] = preg_match("/[^0-9]{0,1}" .$list['wr_id'] . "[\r]{0,1}/",$board['bo_notice']);

    if ($subject_len)
        $list['subject'] = conv_subject($list['wr_subject'], $subject_len, "…");
    else
        $list['subject'] = conv_subject($list['wr_subject'], $board['bo_subject_len'], "…");

    // 목록에서 내용 미리보기 사용한 게시판만 내용을 변환함 (속도 향상) : kkal3(커피)님께서 알려주셨습니다.
    if ($board['bo_use_list_content'])
	{
		$html = 0;
		if (strstr($list['wr_option'], "html1"))
			$html = 1;
		else if (strstr($list['wr_option'], "html2"))
			$html = 2;

        $list['content'] = conv_content($list['wr_content'], $html);
	}

    $list['comment_cnt'] = "";
    if ($list['wr_comment'])
        $list['comment_cnt'] = "({$list['wr_comment']})";

    // 당일인 경우 시간으로 표시함
    $list['datetime'] = substr($list['wr_datetime'],0,10);
    $list['datetime2'] = $list['wr_datetime'];
    if ($list['datetime'] == $g4['time_ymd'])
        $list['datetime2'] = substr($list['datetime2'],11,5);
    else
        $list['datetime2'] = substr($list['datetime2'],5,5);
    // 4.1
    $list['last'] = substr($list['wr_last'],0,10);
    $list['last2'] = $list['wr_last'];
    if ($list['last'] == $g4['time_ymd'])
        $list['last2'] = substr($list['last2'],11,5);
    else
        $list['last2'] = substr($list['last2'],5,5);

    $list['wr_homepage'] = get_text(addslashes($list['wr_homepage']));

    if ($board['bo_use_sideview'])
        $list['name'] = get_sideview($list['mb_id'], $list['wr_name'], $list['wr_email'], $list['wr_homepage']);
    else
        $list['name'] = "<span class=\"".($list['mb_id']?'member':'guest')."\">{$list['wr_name']}</span>";

    $reply = $list['wr_reply'];

    $list['reply'] = "";
    if (strlen($reply) > 0)
    {
        for ($k=0; $k<strlen($reply); $k++)
            $list['reply'] .= "<span class=\"reply\"></span>";
    }

    $list['icon_reply'] = "";
    if ($list['reply'])
        $list['icon_reply'] = "<img src=\"$skin_path/img/icon_reply.gif\" alt=\"\" class=\"icon_reply\" />";

    $list['icon_link'] = "";
    if ($list['wr_link1'] || $list['wr_link2'])
        $list['icon_link'] = "<img src=\"$skin_path/img/icon_link.gif\" alt=\"link\" title=\"참조 링크가 있습니다.\" />";

    // 분류명 링크
    $list['ca_name_href'] = "{$g4['bbs_path']}/board.php?bo_table={$board['bo_table']}&amp;sca=".urlencode($list['ca_name']);

    $list['href'] = "{$g4['bbs_path']}/board.php?bo_table={$board['bo_table']}&amp;wr_id={$list['wr_id']}" . $qstr;
    $list['comment_href'] = $list['href'];

    $list['icon_new'] = "";
    if ($list['wr_datetime'] >= date("Y-m-d H:i:s", $g4['server_time'] - ($board['bo_new'] * 3600)))
        $list['icon_new'] = "<img src=\"$skin_path/img/icon_new.gif\" alt=\"new\" title=\"24시간 이내에 등록된 게시물 입니다.\" /> ";
    else
    	$list['icon_new'] = "<img src=\"$skin_path/img/icon_old.gif\" alt=\"old\" title=\"등록된지 24시간이 넘었습니다.\" /> ";

    $list['icon_hot'] = "";
    if ($list['wr_hit'] >= $board['bo_hot'])
        $list['icon_hot'] = "<img src=\"$skin_path/img/icon_hot.gif\" alt=\"hot\" title=\"다수가 읽은 게시물 입니다.\" />";

    $list['icon_secret'] = "";
    if (strstr($list['wr_option'], "secret"))
        $list['icon_secret'] = "<img src=\"$skin_path/img/icon_secret.gif\" alt=\"secret\" title=\"비공개 게시물 입니다.\" />";

    // 링크
    for ($i=1; $i<=$g4['link_count']; $i++)
    {
        $list['link'][$i] = set_http(get_text($list["wr_link{$i}"]));
        $list['link_href'][$i] = "{$g4['bbs_path']}/link.php?bo_table={$board['bo_table']}&amp;wr_id={$list['wr_id']}&amp;no=$i" . $qstr;
        $list['link_hit'][$i] = (int)$list["wr_link{$i}_hit"];
    }

    // 가변 파일
    if ($list['wr_file'])
        $list['file'] = get_file($board['bo_table'], $list['wr_id'], $board);

    if ($list['file']['count'])
        $list['icon_file'] = "<img src=\"$skin_path/img/icon_file.gif\" alt=\"attach\" title=\"첨부파일이 있습니다.\" />";

    return $list;
}

// get_list 의 alias
function get_view($write_row, $board, $skin_path, $subject_len=125)
{
    return get_list($write_row, $board, $skin_path, $subject_len);
}


// set_search_font(), get_search_font() 함수를 search_font() 함수로 대체
function search_font($stx, $str)
{
    global $config;

    // 문자앞에 \ 를 붙입니다.
    $src = array("/", "|");
    $dst = array("\/", "\|");

    if (!trim($stx)) return $str;

    // 검색어 전체를 공란으로 나눈다
    $s = explode(" ", $stx);

    // "/(검색1|검색2)/i" 와 같은 패턴을 만듬
    $pattern = "";
    $bar = "";
    for ($m=0; $m<count($s); $m++) {
        if (trim($s[$m]) == "") continue;
        // 태그는 포함하지 않아야 하는데 잘 안되는군. ㅡㅡa
        //$pattern .= $bar . '([^<])(' . quotemeta($s[$m]) . ')';
        //$pattern .= $bar . quotemeta($s[$m]);
        //$pattern .= $bar . str_replace("/", "\/", quotemeta($s[$m]));
        $tmp_str = quotemeta($s[$m]);
        $tmp_str = str_replace($src, $dst, $tmp_str);
        $pattern .= $bar . $tmp_str . "(?![^<]*>)";
        $bar = "|";
    }

    // 지정된 검색 폰트의 색상, 배경색상으로 대체
    $replace = "<span style=\"background-color: {$config['cf_search_bgcolor']}; color: {$config['cf_search_color']};\">\\1</span>";

    return preg_replace("/($pattern)/i", $replace, $str);
}


// 제목을 변환
function conv_subject($subject, $len, $suffix="")
{
    return cut_str(get_text($subject), $len, $suffix);
}

// OBJECT 태그의 XSS 막기
function bad120422($matches)
{
    $code = $matches[1];
    if (preg_match("#script#i", $code)) {
        return "OBJECT 태그에 스크립트는 사용 불가합니다.";
    } else if (preg_match("#base64#i", $code)) {
        return "OBJECT 태그에 BASE64는 사용 불가합니다.";
    }
}


// 내용을 변환
function conv_content($content, $html)
{
    global $config, $board;

    if ($html)
    {
        $source = array();
        $target = array();

        $source[] = "//";
        $target[] = "";

        if ($html == 2) { // 자동 줄바꿈
            $source[] = "/\n/";
            $target[] = "<br />";
        }

        // 테이블 태그의 갯수를 세어 테이블이 깨지지 않도록 한다.
        $table_begin_count = substr_count(strtolower($content), "<table");
        $table_end_count = substr_count(strtolower($content), "</table");
        for ($i=$table_end_count; $i<$table_begin_count; $i++)
        {
            $content .= "</table>";
        }

        $content = preg_replace($source, $target, $content);
        $content = bad_tag_convert($content);

        // XSS (Cross Site Script) 막기
        // 완벽한 XSS 방지는 없다.

        // object 태그에서 javascript 코드 막기
        $content = preg_replace_callback("#<object([^>]+)>#i", "bad120422", $content);

        // 081022 : CSRF 방지
        //$content = preg_replace("/(on)(abort|blur|change|click|dblclick|dragdrop|error|focus|keydown|keypress|keyup|load|mousedown|mousemove|mouseout|mouseover|mouseup|mouseenter|mouseleave|move|reset|resize|select|submit|unload)/i", "$1<!-- XSS Filter -->$2", $content);
        //$content = preg_replace("/(on)([^\=]+)/i", "&#111;&#110;$2", $content);
        
        // 이런 경우를 방지함 <IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
        $content = preg_replace("#\/\*.*\*\/#iU", "", $content);

        $content = preg_replace("/(on)([a-z]+)([^a-z]*)(\=)/i", "&#111;&#110;$2$3$4", $content);
        $content = preg_replace("/(dy)(nsrc)/i", "&#100;&#121;$2", $content);
        $content = preg_replace("/(lo)(wsrc)/i", "&#108;&#111;$2", $content);
        $content = preg_replace("/(sc)(ript)/i", "&#115;&#99;$2", $content);
        //$content = preg_replace("/(ex)(pression)/i", "e&#120;$2", $content);
        $content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content);

        // 이미지 태그의 src 속성에 삭제등의 링크가 있는 경우 게시물을 확인하는 것만으로도 데이터의 위변조가 가능하므로 이것을 막음
        $content = preg_replace("/<(img[^>]+delete\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : &lt;$1", $content);
        $content = preg_replace("/<(img[^>]+delete_comment\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : &lt;$1", $content);
        $content = preg_replace("/<(img[^>]+logout\.php[^>]+)/i", "*** CSRF 감지 : &lt;$1", $content);
        $content = preg_replace("/<(img[^>]+download\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : &lt;$1", $content);

        // 이런 경우를 방지함 <IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
        //$content = preg_replace("#\/\*.*\*\/#iU", "", $content); // 이 코드를 위로 올립니다.

        $pattern = "";
        $pattern .= "(e|&#(x65|101);?)";
        $pattern .= "(x|&#(x78|120);?)";
        $pattern .= "(p|&#(x70|112);?)";
        $pattern .= "(r|&#(x72|114);?)";
        $pattern .= "(e|&#(x65|101);?)";
        $pattern .= "(s|&#(x73|115);?)";
        $pattern .= "(s|&#(x73|115);?)";
        $pattern .= "(i|&#(x6a|105);?)";
        $pattern .= "(o|&#(x6f|111);?)";
        $pattern .= "(n|&#(x6e|110);?)";
        $content = preg_replace("/".$pattern."/i", "__EXPRESSION__", $content);

        /*
        $content = preg_replace("/\#/", "&#35;", $content);
        $content = preg_replace("/\</", "&lt;", $content);
        $content = preg_replace("/\>/", "&gt;", $content);
        $content = preg_replace("/\(/", "&#40;", $content);
        $content = preg_replace("/\)/", "&#41;", $content);
        */
    }
    else // text 이면
    {
        // & 처리 : &amp; &nbsp; 등의 코드를 정상 출력함
        $content = html_symbol($content);

        // 공백 처리
		$content = str_replace("  ", "&nbsp; ", $content);
		$content = str_replace("\n ", "\n&nbsp;", $content);

        $content = get_text($content, 1);

        $content = url_auto_link($content);
    }

    return $content;
}


// 검색 구문을 얻는다.
function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator='and')
{
    global $g4;

    $str = "";
    if ($search_ca_name)
        $str = " ca_name = '$search_ca_name' ";

    // 게시판에서 \ 를 검색할 수 있도록 수정
    $search_text = trim(stripslashes($search_text));

    if (!$search_text)
        return $str;

    if ($str)
        $str .= " and ";

    // 쿼리의 속도를 높이기 위하여 ( ) 는 최소화 한다.
    $op1 = "";

    // 검색어를 구분자로 나눈다. 여기서는 공백
    $s = array();
    $s = explode(" ", strip_tags($search_text));

    // 검색필드를 구분자로 나눈다. 여기서는 +
    //$field = array();
    //$field = explode("||", trim($search_field));
    $tmp = array();
    $tmp = explode(",", trim($search_field));
    $field = explode("||", $tmp[0]);
    $not_comment = $tmp[1];

    if(trim($tmp[0]) == "")
	{
		$str .= "(1)";
	}
	else
	{

    $str .= "(";
    for ($i=0; $i<count($s); $i++) {
        // 검색어
        $search_str = trim($s[$i]);
        if ($search_str == "") continue;

        /*
        인기검색어 기능 삭제 : 101202
        // 인기검색어
        $sql = " insert into {$g4['popular_table']} set pp_word = '$search_str', pp_date = '{$g4['time_ymd']}', pp_ip = '{$_SERVER['REMOTE_ADDR']}' ";
        sql_query($sql, FALSE);
        */

        $str .= $op1;
        $str .= "(";

        $op2 = "";
        for ($k=0; $k<count($field); $k++) { // 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...)
            // SQL Injection 방지
            // 필드값에 a-z A-Z 0-9 _ , | 이외의 값이 있다면 검색필드를 wr_subject 로 설정한다.
            $field[$k] = preg_match("/^[\w\,\|]+$/", $field[$k]) ? $field[$k] : "wr_subject";
            $str .= $op2;
            switch ($field[$k]) {
                case "mb_id" :
                case "wr_name" :
                    $str .= " $field[$k] = '$s[$i]' ";
                    break;
                case "wr_hit" :
                case "wr_good" :
                case "wr_nogood" :
                    $str .= " $field[$k] >= '$s[$i]' ";
                    break;
                // 번호는 해당 검색어에 -1 을 곱함
                case "wr_num" :
                    $str .= "$field[$k] = ".((-1)*$s[$i]);
                    break;
                // LIKE 보다 INSTR 속도가 빠름
                default :
                    if (preg_match("/[a-zA-Z]/", $search_str))
                        $str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))";
                    else
                        $str .= "INSTR({$field[$k]}, '$search_str')";
                    break;
            }
            $op2 = " or ";
        }
        $str .= ")";

        //$op1 = ($search_operator) ? ' and ' : ' or ';
        $op1 = " $search_operator ";
    }
    $str .= " ) ";

    }
    if ($not_comment)
        $str .= " and wr_is_comment = '0' ";

    return $str;
}


// 게시판 테이블에서 하나의 행을 읽음
function get_write($write_table, $wr_id)
{
    return sql_fetch(" select * from $write_table where wr_id = '$wr_id' ");
}


// 게시판의 다음글 번호를 얻는다.
function get_next_num($table)
{
    // 가장 작은 번호를 얻어
    $sql = " select min(wr_num) as min_wr_num from $table ";
    $row = sql_fetch($sql);
    // 가장 작은 번호에 1을 빼서 넘겨줌
    return (int)($row['min_wr_num'] - 1);
}


// 그룹 설정 테이블에서 하나의 행을 읽음
function get_group($gr_id)
{
    global $g4;

    return sql_fetch(" select * from {$g4['group_table']} where gr_id = '$gr_id' ");
}


// 회원 정보를 얻는다.
function get_member($mb_id, $fields='*')
{
    global $g4;

    return sql_fetch(" select $fields from {$g4['member_table']} where mb_id = TRIM('$mb_id') ");
}


// 날짜, 조회수의 경우 높은 순서대로 보여져야 하므로 $flag 를 추가
// $flag : asc 낮은 순서 , desc 높은 순서
// 제목별로 컬럼 정렬하는 QUERY STRING
function subject_sort_link($col, $query_string='', $flag='asc')
{
    global $sst, $sod, $sfl, $stx, $page;

    $q1 = "sst=$col";
    if ($flag == 'asc')
    {
        $q2 = 'sod=asc';
        if ($sst == $col)
        {
            if ($sod == 'asc')
            {
                $q2 = 'sod=desc';
            }
        }
    }
    else
    {
        $q2 = 'sod=desc';
        if ($sst == $col)
        {
            if ($sod == 'desc')
            {
                $q2 = 'sod=asc';
            }
        }
    }

    return "<a href=\"{$_SERVER['PHP_SELF']}?$query_string&amp;$q1&amp;$q2&amp;sfl=$sfl&amp;stx=$stx&amp;page=$page\">";
}


// 관리자 정보를 얻음
function get_admin($admin='super')
{
    global $config, $group, $board;
    global $g4;

    $is = false;
    if ($admin == 'board') {
        $mb = sql_fetch("select * from {$g4['member_table']} where mb_id in ('{$board['bo_admin']}') limit 1 ");
        $is = true;
    }

    if (($is && !$mb['mb_id']) || $admin == 'group') {
        $mb = sql_fetch("select * from {$g4['member_table']} where mb_id in ('{$group['gr_admin']}') limit 1 ");
        $is = true;
    }

    if (($is && !$mb['mb_id']) || $admin == 'super') {
        $mb = sql_fetch("select * from {$g4['member_table']} where mb_id in ('{$config['cf_admin']}') limit 1 ");
    }

    return $mb;
}


// 관리자인가?
function is_admin($mb_id)
{
    global $config, $group, $board;

    if (!$mb_id) return;

    if ($config['cf_admin'] == $mb_id) return 'super';
    if ($group['gr_admin'] == $mb_id) return 'group';
    if ($board['bo_admin'] == $mb_id) return 'board';
    return '';
}


// 분류 옵션을 얻음
// 4.00 에서는 카테고리 테이블을 없애고 보드테이블에 있는 내용으로 대체
function get_category_option($bo_table='')
{
    global $g4, $board;

    $arr = explode("|", $board['bo_category_list']); // 구분자가 , 로 되어 있음
    $str = "";
    for ($i=0; $i<count($arr); $i++)
        if (trim($arr[$i]))
            $str .= "<option value=\"{$arr[$i]}\">{$arr[$i]}</option>\n";

    return $str;
}


// 게시판 그룹을 SELECT 형식으로 얻음
function get_group_select($name, $selected='', $event='')
{
    global $g4, $is_admin, $member;

    $sql = " select gr_id, gr_subject from {$g4['group_table']} a ";
    if ($is_admin == "group") {
        $sql .= " left join {$g4['member_table']} b on (b.mb_id = a.gr_admin)
                  where b.mb_id = '{$member['mb_id']}' ";
    }
    $sql .= " order by a.gr_id ";

    $result = sql_query($sql);
    $str = "<select name=\"$name\" $event>";
    for ($i=0; $row=sql_fetch_array($result); $i++)
    {
        $str .= "<option value=\"{$row['gr_id']}\"";
        if ($row['gr_id'] == $selected) $str .= " selected=\"selected\"";
        $str .= ">{$row['gr_subject']}</option>";
    }
    $str .= "</select>";
    return $str;
}


// '예', '아니오'를 SELECT 형식으로 얻음
function get_yn_select($name, $selected='1', $event='')
{
    $str = "<select name=\"$name\" $event>";
    if ($selected) {
        $str .= "<option value=\"1\" selected=\"selected\">예</option>";
        $str .= "<option value=\"0\">아니오</option>";
    } else {
        $str .= "<option value=\"1\">예</option>";
        $str .= "<option value=\"0\" selected=\"selected\">아니오</option>";
    }
    $str .= "</select>";
    return $str;
}


// 포인트 부여
function insert_point($mb_id, $point, $content='', $rel_table='', $rel_id='', $rel_action='')
{
    global $config;
    global $g4;
    global $is_admin;

    // 포인트 사용을 하지 않는다면 return
    if (!$config['cf_use_point']) { return 0; }

    // 포인트가 없다면 업데이트 할 필요 없음
    if ($point == 0) { return 0; }

    // 회원아이디가 없다면 업데이트 할 필요 없음
    if ($mb_id == "") { return 0; }
    $mb = sql_fetch(" select mb_id from {$g4['member_table']} where mb_id = '$mb_id' ");
    if (!$mb['mb_id']) { return 0; }

    // 이미 등록된 내역이라면 건너뜀
    if ($rel_table || $rel_id || $rel_action)
    {
        $sql = " select count(*) as cnt from {$g4['point_table']} where mb_id = '$mb_id' and po_rel_table = '$rel_table' and po_rel_id = '$rel_id' and po_rel_action = '$rel_action' ";
        $row = sql_fetch($sql);
        if ($row['cnt'])
            return -1;
    }

    // 포인트 건별 생성
    $sql = " insert into {$g4['point_table']}
                set mb_id = '$mb_id',
                    po_datetime = '{$g4['time_ymdhis']}',
                    po_content = '".addslashes($content)."',
                    po_point = '$point',
                    po_rel_table = '$rel_table',
                    po_rel_id = '$rel_id',
                    po_rel_action = '$rel_action' ";
    sql_query($sql);

    // 포인트 내역의 합을 구하고
    $sql = " select sum(po_point) as sum_po_point from {$g4['point_table']} where mb_id = '$mb_id' ";
    $row = sql_fetch($sql);
    $sum_point = $row['sum_po_point'];

    // 포인트 UPDATE
    $sql = " update {$g4['member_table']} set mb_point = '$sum_point' where mb_id = '$mb_id' ";
    sql_query($sql);

    return 1;
}

// 포인트 삭제
function delete_point($mb_id, $rel_table, $rel_id, $rel_action)
{
    global $g4;

    $result = false;
    if ($rel_table || $rel_id || $rel_action)
    {
        $result = sql_query(" delete from {$g4['point_table']}
                     where mb_id = '$mb_id'
                       and po_rel_table = '$rel_table'
                       and po_rel_id = '$rel_id'
                       and po_rel_action = '$rel_action' ", false);

        // 포인트 내역의 합을 구하고
        $sql = " select sum(po_point) as sum_po_point from {$g4['point_table']} where mb_id = '$mb_id' ";
        $row = sql_fetch($sql);
        $sum_point = $row['sum_po_point'];

        // 포인트 UPDATE
        $sql = " update {$g4['member_table']} set mb_point = '$sum_point' where mb_id = '$mb_id' ";
        $result = sql_query($sql);
    }

    return $result;
}

// 회원 레이어
function get_sideview($mb_id, $name="", $email="", $homepage="")
{
    global $config;
    global $g4;

    $email = base64_encode($email);
    $homepage = set_http($homepage);

    $name = preg_replace("/\&#039;/", "", $name);
    $name = preg_replace("/\'/", "", $name);
    $name = preg_replace("/\"/", "&#034;", $name);
    $title_name = $name;
    $mb_no_file = "<img src=\"/img/img_mnoicon.gif\" alt=\"member_no_icon\" />";
    $gu_no_file = "<img src=\"/img/img_noicon.png\" alt=\"guest_icon\" />";

    $tmp_name = get_text(cut_str($name, $config['cf_cut_name'])); // 설정된 자리수 만큼만 이름 출력
    if ($mb_id) {
        $tmp_name = "<span class=\"member\">$tmp_name</span>";

        if ($config['cf_use_member_icon']) {
            $mb_dir = substr($mb_id,0,2);
            $icon_file = "{$g4['path']}/data/member/$mb_dir/$mb_id.gif";

            if (file_exists($icon_file) && is_file($icon_file))
            {
            //if (file_exists($icon_file)) {
                //$size = getimagesize($icon_file);
                //$width = $size[0];
                //$height = $size[1];
                $width = $config['cf_member_icon_width'];
                $height = $config['cf_member_icon_height'];
                $tmp_name = "<img src=\"$icon_file\" width=\"$width\" height=\"$height\" alt=\"$name\" />";

                if ($config['cf_use_member_icon'] == 2) // 회원아이콘+이름, 등록된 아이콘이 있을 때
                    $tmp_name = $tmp_name." <span class=\"member\">$name</span>";
            }
            else
            {
                $tmp_name = "<img src=\"$icon_file\" style=\"width: $width; height: $height;\" alt=\"$name\" />";

                if ($config['cf_use_member_icon'] == 2) // 회원 기본아이콘+이름, 등록된 아이콘이 없을 때
                    $tmp_name = $mb_no_file." <span class=\"member\">$name</span>";
            }
        }
        $title_mb_id = "[$mb_id]";
    } else {
        $tmp_name = $gu_no_file."<span class=\"guest\">$tmp_name</span>";
        $title_mb_id = "[비회원]";
    }
    
    $name     = get_text($name);
    $email    = get_text($email);
    $homepage = get_text($homepage);
    
    //return "<a href=\"javascript:showSideView(this, '$mb_id', '$name', '$email', '$homepage');\" title=\"{$title_mb_id}{$title_name}\">$tmp_name</a>";
    return "<a href=\"#\" class=\"sidebox\" rel=\"mb_id={$mb_id}&amp;name={$name}&amp;email={$email}&amp;homepage={$homepage}\" onclick=\"return false;\">$tmp_name</a>";
}

// 파일을 보이게 하는 링크 (이미지, 플래쉬, 동영상)
function view_file_link($file, $width, $height, $content="", $board)
{
    global $config;
    global $g4;
    static $ids;

    if (!$file) return;

    $ids++;

    // 파일의 폭이 게시판설정의 이미지폭 보다 크다면 게시판설정 폭으로 맞추고 비율에 따라 높이를 계산
    if ($width > $board['bo_image_width'] && $board['bo_image_width'])
    {
        $rate = $board['bo_image_width'] / $width;
        $width = $board['bo_image_width'];
        $height = (int)($height * $rate);
    }

    // 폭이 있는 경우 폭과 높이의 속성을 주고, 없으면 자동 계산되도록 코드를 만들지 않는다.
    if ($width)
        $attr = " width=\"$width\" height=\"$height\" ";
    else
        $attr = "";


        // 이미지에 속성을 주지 않는 이유는 이미지 클릭시 원본 이미지를 보여주기 위한것임
        // 게시판설정 이미지보다 크다면 스킨의 자바스크립트에서 이미지를 줄여준다
        $img_file = "{$g4['path']}/data/file/{$board['bo_table']}/".urlencode($file);
        $size = getimagesize($img_file);
        if ($size[0] > $board['bo_image_width'])
            return "<a href=\"$img_file\" rel=\"lightbox\"><img src=\"$img_file\" width=\"{$board['bo_image_width']}\" alt=\"lightbox\" />***실제파일명 출력***</a>";
        else
            return "<img src=\"$img_file\" alt=\"$content\" />";

	/* 110106 : FLASH XSS 공격으로 인하여 코드 자체를 막음
    else if (preg_match("/\.($config['cf_flash_extension'])$/i", $file))
        //return "<embed src='{$g4['path']}/data/file/{$board['bo_table']}/$file' $attr></embed>";
        return "<script>doc_write(flash_movie('{$g4['path']}/data/file/{$board['bo_table']}/$file', '_g4_{$ids}', '$width', '$height', 'transparent'));</script>";

    //=============================================================================================
    // 동영상 파일에 악성코드를 심는 경우를 방지하기 위해 경로를 노출하지 않음
    //---------------------------------------------------------------------------------------------

    else if (preg_match("/\.($config['cf_movie_extension'])$/i", $file))
        //return "<embed src='{$g4['path']}/data/file/{$board['bo_table']}/$file' $attr></embed>";
        return "<script>doc_write(obj_movie('{$g4['path']}/data/file/{$board['bo_table']}/$file', '_g4_{$ids}', '$width', '$height'));</script>";
    //=============================================================================================
	*/
}


// view_file_link() 함수에서 넘겨진 이미지를 보이게 합니다.
// {img:0} ... {img:n} 과 같은 형식
function view_image($view, $number, $attribute)
{
    if ($view['file'][$number]['view'])
        return preg_replace("/>$/", " $attribute>", $view['file'][$number]['view']);
    else
        //return "{".$number."번 이미지 없음}";
        return "";
}


/*
// {link:0} ... {link:n} 과 같은 형식
function view_link($view, $number, $attribute)
{
    global $config;

    if ($view['link'][$number]['link'])
    {
        if (!preg_match("/target/i", $attribute))
            $attribute .= " target=\"$config['cf_link_target']\"";
        return "<a href=\"{$view['link'][$number]['href']}\" $attribute>{$view['link'][$number]['link']}</a>";
    }
    else
        return "{".$number."번 링크 없음}";
}
*/


// 한글 한글자(2byte, 유니코드 3byte)는 길이 2, 공란.영숫자.특수문자는 길이 1
// 유니코드는 http://g4uni.winnwe.net/bbs/board.php?bo_table=g4uni_faq&wr_id=7 의 Mr.Learn님의 글을 참고하였습니다.
function cut_str($str, $len, $suffix="…")
{
    global $g4;

    if (strtoupper($g4['charset']) == 'UTF-8') {
        $c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2); 
        if ($c == '10') 
            for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2)); 
        return substr($str,0,$len) . (strlen($str)-strlen($suffix) >= $len ? $suffix : ''); 
    } else {
        $s = substr($str, 0, $len);
        $cnt = 0;
        for ($i=0; $i<strlen($s); $i++)
            if (ord($s[$i]) > 127)
                $cnt++;
        $s = substr($s, 0, $len - ($cnt % 2));
        if (strlen($s) >= strlen($str))
            $suffix = "";
        return $s . $suffix;
    }
}


// TEXT 형식으로 변환
function get_text($str, $html=0)
{
    /* 3.22 막음 (HTML 체크 줄바꿈시 출력 오류때문)
    $source[] = "/  /";
    $target[] = " &nbsp;";
    */

    // 3.31
    // TEXT 출력일 경우 &amp; &nbsp; 등의 코드를 정상으로 출력해 주기 위함
    if ($html == 0) {
        $str = html_symbol($str);
    }

    $source[] = "/</";
    $target[] = "&lt;";
    $source[] = "/>/";
    $target[] = "&gt;";
    //$source[] = "/\"/";
    //$target[] = "&#034;";
    $source[] = "/\'/";
    $target[] = "&#039;";
    //$source[] = "/}/"; $target[] = "&#125;";
    if ($html) {
        $source[] = "/\n/";
        $target[] = "<br />";
    }

    return preg_replace($source, $target, $str);
}


/*
// HTML 특수문자 변환 htmlspecialchars
function hsc($str)
{
    $trans = array("\"" => "&#034;", "'" => "&#039;", "<"=>"&#060;", ">"=>"&#062;");
    $str = strtr($str, $trans);
    return $str;
}
*/

// 3.31
// HTML SYMBOL 변환
// &nbsp; &amp; &middot; 등을 정상으로 출력
function html_symbol($str)
{
    return preg_replace("/\&([a-z0-9]{1,20}|\#[0-9]{0,3});/i", "&#038;\\1;", $str);
}


/*************************************************************************
**
**  SQL 관련 함수 모음
**
*************************************************************************/

// DB 연결
function sql_connect($host, $user, $pass)
{
    global $g4;

    /*
    if (strtolower($g4['charset']) == 'utf-8') @mysql_query(" set names utf8 ");
    else if (strtolower($g4['charset']) == 'euc-kr') @mysql_query(" set names euckr ");
    */
    return @mysql_connect($host, $user, $pass);
}


// DB 선택
function sql_select_db($db, $connect)
{
    global $g4;

    if (strtolower($g4['charset']) == 'utf-8') @mysql_query(" set names utf8 ");
    else if (strtolower($g4['charset']) == 'euc-kr') @mysql_query(" set names euckr ");
    return @mysql_select_db($db, $connect);
}


// mysql_query 와 mysql_error 를 한꺼번에 처리
function sql_query($sql, $error=TRUE)
{
    if ($error)
        $result = @mysql_query($sql) or die("<p>$sql<p>" . mysql_errno() . " : " .  mysql_error() . "<p>error file : {$_SERVER['PHP_SELF']}");
    else
        $result = @mysql_query($sql);
    return $result;
}


// 쿼리를 실행한 후 결과값에서 한행을 얻는다.
function sql_fetch($sql, $error=TRUE)
{
    $result = sql_query($sql, $error);
    //$row = @sql_fetch_array($result) or die("<p>$sql<p>" . mysql_errno() . " : " .  mysql_error() . "<p>error file : {$_SERVER['PHP_SELF']}");
    $row = sql_fetch_array($result);
    return $row;
}


// 결과값에서 한행 연관배열(이름으로)로 얻는다.
function sql_fetch_array($result)
{
    $row = @mysql_fetch_assoc($result);
    return $row;
}


// $result에 대한 메모리(memory)에 있는 내용을 모두 제거한다.
// sql_free_result()는 결과로부터 얻은 질의 값이 커서 많은 메모리를 사용할 염려가 있을 때 사용된다.
// 단, 결과 값은 스크립트(script) 실행부가 종료되면서 메모리에서 자동적으로 지워진다.
function sql_free_result($result)
{
    return mysql_free_result($result);
}


function sql_password($value)
{
    // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
    // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
    $row = sql_fetch(" select password('$value') as pass ");
    return $row['pass'];
}


// PHPMyAdmin 참고
function get_table_define($table, $crlf="\n")
{
    global $g4;

    // For MySQL < 3.23.20
    $schema_create .= 'CREATE TABLE ' . $table . ' (' . $crlf;

    $sql = 'SHOW FIELDS FROM ' . $table;
    $result = sql_query($sql);
    while ($row = sql_fetch_array($result))
    {
        $schema_create .= '    ' . $row['Field'] . ' ' . $row['Type'];
        if (isset($row['Default']) && $row['Default'] != '')
        {
            $schema_create .= ' DEFAULT \'' . $row['Default'] . '\'';
        }
        if ($row['Null'] != 'YES')
        {
            $schema_create .= ' NOT NULL';
        }
        if ($row['Extra'] != '')
        {
            $schema_create .= ' ' . $row['Extra'];
        }
        $schema_create     .= ',' . $crlf;
    } // end while
    sql_free_result($result);

    $schema_create = preg_replace('/,' . $crlf . '$/', '', $schema_create);

    $sql = 'SHOW KEYS FROM ' . $table;
    $result = sql_query($sql);
    while ($row = sql_fetch_array($result))
    {
        $kname    = $row['Key_name'];
        $comment  = (isset($row['Comment'])) ? $row['Comment'] : '';
        $sub_part = (isset($row['Sub_part'])) ? $row['Sub_part'] : '';

        if ($kname != 'PRIMARY' && $row['Non_unique'] == 0) {
            $kname = "UNIQUE|$kname";
        }
        if ($comment == 'FULLTEXT') {
            $kname = 'FULLTEXT|$kname';
        }
        if (!isset($index[$kname])) {
            $index[$kname] = array();
        }
        if ($sub_part > 1) {
            $index[$kname][] = $row['Column_name'] . '(' . $sub_part . ')';
        } else {
            $index[$kname][] = $row['Column_name'];
        }
    } // end while
    sql_free_result($result);

    while (list($x, $columns) = @each($index)) {
        $schema_create     .= ',' . $crlf;
        if ($x == 'PRIMARY') {
            $schema_create .= '    PRIMARY KEY (';
        } else if (substr($x, 0, 6) == 'UNIQUE') {
            $schema_create .= '    UNIQUE ' . substr($x, 7) . ' (';
        } else if (substr($x, 0, 8) == 'FULLTEXT') {
            $schema_create .= '    FULLTEXT ' . substr($x, 9) . ' (';
        } else {
            $schema_create .= '    KEY ' . $x . ' (';
        }
        $schema_create     .= implode($columns, ', ') . ')';
    } // end while

    if (strtolower($g4['charset']) == "utf-8")
        $schema_create .= $crlf . ') DEFAULT CHARSET=utf8';
    else
        $schema_create .= $crlf . ')';

    return $schema_create;
} // end of the 'PMA_getTableDef()' function


// 리퍼러 체크
function referer_check($url="")
{
    /*
    // 제대로 체크를 하지 못하여 주석 처리함
    global $g4;

    if (!$url)
        $url = $g4['url'];

    if (!preg_match("/^http['s']?:\/\/".$_SERVER['HTTP_HOST']."/", $_SERVER['HTTP_REFERER']))
        alert("제대로 된 접근이 아닌것 같습니다.", $url);
    */
}


// 한글 요일
function get_yoil($date, $full=0)
{
    $arr_yoil = array ("일", "월", "화", "수", "목", "금", "토");

    $yoil = date("w", strtotime($date));
    $str = $arr_yoil[$yoil];
    if ($full) {
        $str .= "요일";
    }
    return $str;
}


// 날짜를 select 박스 형식으로 얻는다
function date_select($date, $name="")
{
    global $g4;

    $s = "";
    if (substr($date, 0, 4) == "0000") {
        $date = $g4['time_ymdhis'];
    }
    preg_match("/([0-9]{4})-([0-9]{2})-([0-9]{2})/", $date, $m);

    // 년
    $s .= "<select name=\"{$name}_y\">";
    for ($i=$m[0]-3; $i<=$m[0]+3; $i++) {
        $s .= "<option value=\"$i\"";
        if ($i == $m[0]) {
            $s .= " selected=\"selected\"";
        }
        $s .= ">$i";
    }
    $s .= "</select>년 \n";

    // 월
    $s .= "<select name=\"{$name}_m\">";
    for ($i=1; $i<=12; $i++) {
        $s .= "<option value=\"$i\"";
        if ($i == $m[2]) {
            $s .= " selected=\"selected\"";
        }
        $s .= ">$i";
    }
    $s .= "</select>월 \n";

    // 일
    $s .= "<select name=\"{$name}_d\">";
    for ($i=1; $i<=31; $i++) {
        $s .= "<option value=\"$i\"";
        if ($i == $m[3]) {
            $s .= " selected=\"selected\"";
        }
        $s .= ">$i";
    }
    $s .= "</select>일 \n";

    return $s;
}


// 시간을 select 박스 형식으로 얻는다
// 1.04.00
// 경매에 시간 설정이 가능하게 되면서 추가함
function time_select($time, $name="")
{
    preg_match("/([0-9]{2}):([0-9]{2}):([0-9]{2})/", $time, $m);

    // 시
    $s .= "<select name=\"{$name}_h\">";
    for ($i=0; $i<=23; $i++) {
        $s .= "<option value=\"$i\"";
        if ($i == $m[0]) {
            $s .= " selected=\"selected\"";
        }
        $s .= ">$i";
    }
    $s .= "</select>시 \n";

    // 분
    $s .= "<select name='{$name}_i'>";
    for ($i=0; $i<=59; $i++) {
        $s .= "<option value=\"$i\"";
        if ($i == $m[2]) {
            $s .= " selected=\"selected\"";
        }
        $s .= ">$i";
    }
    $s .= "</select>분 \n";

    // 초
    $s .= "<select name=\"{$name}_s\">";
    for ($i=0; $i<=59; $i++) {
        $s .= "<option value=\"$i\"";
        if ($i == $m[3]) {
            $s .= " selected=\"selected\"";
        }
        $s .= ">$i";
    }
    $s .= "</select>초 \n";

    return $s;
}


// DEMO 라는 파일이 있으면 데모 화면으로 인식함
function check_demo()
{
    global $g4;
    if (file_exists("{$g4['path']}/DEMO"))
        alert("데모 화면에서는 하실(보실) 수 없는 작업입니다.");
}


// 문자열이 한글, 영문, 숫자, 특수문자로 구성되어 있는지 검사
function check_string($str, $options)
{
    global $g4;

    $s = '';
    for($i=0;$i<strlen($str);$i++) {
        $c = $str[$i];
        $oc = ord($c);

        // 한글
        if ($oc >= 0xA0 && $oc <= 0xFF) {
            if (strtoupper($g4['charset']) == 'UTF-8') {
                if ($options & _G4_HANGUL_) {
                    $s .= $c . $str[$i+1] . $str[$i+2];
                }
                $i+=2;
            } else {
                // 한글은 2바이트 이므로 문자하나를 건너뜀
                $i++;
                if ($options & _G4_HANGUL_) {
                    $s .= $c . $str[$i];
                }
            }
        }
        // 숫자
        else if ($oc >= 0x30 && $oc <= 0x39) {
            if ($options & _G4_NUMERIC_) {
                $s .= $c;
            }
        }
        // 영대문자
        else if ($oc >= 0x41 && $oc <= 0x5A) {
            if (($options & _G4_ALPHABETIC_) || ($options & _G4_ALPHAUPPER_)) {
                $s .= $c;
            }
        }
        // 영소문자
        else if ($oc >= 0x61 && $oc <= 0x7A) {
            if (($options & _G4_ALPHABETIC_) || ($options & _G4_ALPHALOWER_)) {
                $s .= $c;
            }
        }
        // 공백
        else if ($oc >= 0x20) {
            if ($options & _G4_SPACE_) {
                $s .= $c;
            }
        }
        else {
            if ($options & _G4_SPECIAL_) {
                $s .= $c;
            }
        }
    }

    // 넘어온 값과 비교하여 같으면 참, 틀리면 거짓
    return ($str == $s);
}


// 한글(2bytes)에서 마지막 글자가 1byte로 끝나는 경우
// 출력시 깨지는 현상이 발생하므로 마지막 완전하지 않은 글자(1byte)를 하나 없앰
function cut_hangul_last($hangul)
{
    global $g4;

    // 한글이 반쪽나면 ?로 표시되는 현상을 막음
    $cnt = 0;
    for($i=0;$i<strlen($hangul);$i++) {
        // 한글만 센다
        if (ord($hangul[$i]) >= 0xA0) {
            $cnt++;
        }
    }

    // 홀수라면 한글이 반쪽난 상태이므로
    if (strtoupper($g4['charset']) != 'UTF-8') {
        if ($cnt%2) {
            $hangul = substr($hangul, 0, $cnt-1);
        }
    }

    return $hangul;
}


// 테이블에서 INDEX(키) 사용여부 검사
function explain($sql)
{
    if (preg_match("/^(select)/i", trim($sql))) {
        $q = "explain $sql";
        echo $q;
        $row = sql_fetch($q);
        if (!$row['key']) $row['key'] = "NULL";
        echo " <span style=\"color: #00F\">(type={$row['type']} , key={$row['key']})</span>";
    }
}


// 악성태그 변환
function bad_tag_convert($code)
{
    global $view;
    global $member, $is_admin;

    if ($is_admin && $member['mb_id'] != $view['mb_id']) {
        //$code = preg_replace_callback("#(\<(embed|object)[^\>]*)\>(\<\/(embed|object)\>)?#i",
	// embed 또는 object 태그를 막지 않는 경우 필터링이 되도록 수정
        $code = preg_replace_callback("#(\<(embed|object)[^\>]*)\>?(\<\/(embed|object)\>)?#i",
                    create_function('$matches', 'return "<div class=\"embedx\">보안문제로 인하여 관리자 아이디로는 embed 또는 object 태그를 볼 수 없습니다. 확인하시려면 관리권한이 없는 다른 아이디로 접속하세요.</div>";'),
                    $code);
    }

    //return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>/i", "&lt;$1$2$3&gt;", $code);
    // script 나 iframe 태그를 막지 않는 경우 필터링이 되도록 수정
    return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>?/i", "&lt;$1$2$3&gt;", $code);
}


// 불법접근을 막도록 토큰을 생성하면서 토큰값을 리턴
function get_token()
{
    $token = md5(uniqid(rand(), true));
    set_session("ss_token", $token);

    return $token;
}


// POST로 넘어온 토큰과 세션에 저장된 토큰 비교
function check_token()
{
    set_session('ss_token', '');
    return true;

    /*
    // 세션에 저장된 토큰과 폼값으로 넘어온 토큰을 비교하여 틀리면 에러
    if ($_POST['token'] && get_session('ss_token') == $_POST['token']) {
        // 맞으면 세션을 지운다. 세션을 지우는 이유는 새로운 폼을 통해 다시 들어오도록 하기 위함
        set_session('ss_token', '');
    } else {
        alert_close('토큰 에러');
    }
    */
}

function isnot($val=null, $pre=null) {
	return $val ? $val : $pre;
}

function isget($val=null, $key=null, $def=null) {
	if (is_null($val)) return isnot($def, null);
	switch (gettype($val)) {
		case 'string':
			return isset($GLOBALS[$val]) ? $GLOBALS[$val] : $key;
		case 'array':
			return isset($val[$key]) ? $val[$key] : $def;
		case 'object':
			if (is_callable(array($val, $key)))
				return $val->{$key}();
			else if (isset($val->$key))
				return $val->$key;
			return $def;
	}
	return null;
}

// 문자열에 utf8 문자가 들어 있는지 검사하는 함수
// 코드 : http://in2.php.net/manual/en/function.mb-check-encoding.php#95289
function is_utf8($str) 
{ 
    $len = strlen($str); 
    for($i = 0; $i < $len; $i++) {
        $c = ord($str[$i]); 
        if ($c > 128) { 
            if (($c > 247)) return false; 
            elseif ($c > 239) $bytes = 4; 
            elseif ($c > 223) $bytes = 3; 
            elseif ($c > 191) $bytes = 2; 
            else return false; 
            if (($i + $bytes) > $len) return false; 
            while ($bytes > 1) { 
                $i++; 
                $b = ord($str[$i]); 
                if ($b < 128 || $b > 191) return false; 
                $bytes--; 
            } 
        } 
    } 
    return true; 
}

?>


이라고 첨부파일이 이미지 일 때 라이트박스 작동여부를 지정하는 부분이 있는데요.

첨부(이미지 던 아니던)파일의 실제 파일명(bf_source 던가요? view.skin.php 에서는 $view[file][$i][source] 던데...)을
넣고 싶거든요.

어...어떻게 해야 할까요? ㅠ  ㅠ $file 이라고 해 놓으면 파일명이 나오긴 하는데 변경된? 파일일명(bf_file)이 나오더라구요.
설명은 장황하게 해도 php 이해수준이 많이 떨어집니다. ㅠ ㅠ

도움 부탁드립니다.

댓글 전체

모니터군님 ^^
view.skin.php 에서는 그렇게 하면 나오거든요.
그런데 common.lib.php에 보면 첨부이미지가 폭이 지정된 사이즈 이상일 때
라이트박스를 작동하게 하는 부분에서 라이트박스 창이 뜰 때 라이트박스 창에 보면 파일명이나 타이틀이
뜨게 되어 있는데요. 라이트박스 창에다 실제 파일명을 출력하고 싶어서 입니다.
그런데 common.lib.php에서 $view[file][$i][source]를 쓰면 안나오고 에러가 나더라구요.
그래서 실제 파일명이 $file[bf_source] 인것 같은데 이것도 안되더라구요.

질문의 요지는 common.lib.php 에서는 어떤게 해야하는 것일까요?
원본 common.lib.php 에서는 위와 같은 기능은 없으니 위 코드만으로는 답변 불가능 합니다
위 코드가 들어있는 함수 전체를 올려보세요
urlencode($file)<---$file 이것이 화일명이니 $file[bf_~~]이렇게는 사용할 수 없습니다
아 네 균이님 ^^ 그렇군요.
사용중인 그누보드가 DTD 버전이에요. sir 사이트에 DTD 버전 프로젝트 링크를 따라가면
있는 그누보드 입니다.

일단 해결했습니다. ㅠㅠ 그냥 주먹구구식으로...
답변 정말 감사드립니다.
전체 66,558 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT