common.lib.php 수정 문의 드립니다. 정보
common.lib.php 수정 문의 드립니다.본문
라이트박스 때문에 질문을 드렸는데 답변이 없어서 질문을 바꿔서 다시 문의드립니다. ㅠ ㅠ
common.lib.php 파일 안에 보면
이라고 첨부파일이 이미지 일 때 라이트박스 작동여부를 지정하는 부분이 있는데요.
첨부(이미지 던 아니던)파일의 실제 파일명(bf_source 던가요? view.skin.php 에서는 $view[file][$i][source] 던데...)을
넣고 싶거든요.
어...어떻게 해야 할까요? ㅠ ㅠ $file 이라고 해 놓으면 파일명이 나오긴 하는데 변경된? 파일일명(bf_file)이 나오더라구요.
설명은 장황하게 해도 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 .= " <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 .= " <a href=\"$url$k{$add}\"><span>$k</span></a>";
else
$str .= " <strong>$k</strong> ";
}
}
if ($total_page > $end_page) $str .= " <a href=\"".$url.($end_page+1)."{$add}\">다음</a>";
if ($cur_page < $total_page) {
$str .= " [<a href=\"$url".($cur_page+1)."\">다음</a>]";
$str .= " <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("/ /", " ", $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("/</", "\t_lt_\t", $str);
$str = preg_replace("/>/", "\t_gt_\t", $str);
$str = preg_replace("/&/", "&", $str);
$str = preg_replace("/"/", "\"", $str);
$str = preg_replace("/ /", "\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/", " " , $str);
$str = preg_replace("/\t_lt_\t/", "<", $str);
$str = preg_replace("/\t_gt_\t/", ">", $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&wr_id=$wr_id&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']}&sca=".urlencode($list['ca_name']);
$list['href'] = "{$g4['bbs_path']}/board.php?bo_table={$board['bo_table']}&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']}&wr_id={$list['wr_id']}&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", "on$2", $content);
// 이런 경우를 방지함 <IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
$content = preg_replace("#\/\*.*\*\/#iU", "", $content);
$content = preg_replace("/(on)([a-z]+)([^a-z]*)(\=)/i", "on$2$3$4", $content);
$content = preg_replace("/(dy)(nsrc)/i", "dy$2", $content);
$content = preg_replace("/(lo)(wsrc)/i", "lo$2", $content);
$content = preg_replace("/(sc)(ript)/i", "sc$2", $content);
//$content = preg_replace("/(ex)(pression)/i", "ex$2", $content);
$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content);
// 이미지 태그의 src 속성에 삭제등의 링크가 있는 경우 게시물을 확인하는 것만으로도 데이터의 위변조가 가능하므로 이것을 막음
$content = preg_replace("/<(img[^>]+delete\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content);
$content = preg_replace("/<(img[^>]+delete_comment\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content);
$content = preg_replace("/<(img[^>]+logout\.php[^>]+)/i", "*** CSRF 감지 : <$1", $content);
$content = preg_replace("/<(img[^>]+download\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$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("/\#/", "#", $content);
$content = preg_replace("/\</", "<", $content);
$content = preg_replace("/\>/", ">", $content);
$content = preg_replace("/\(/", "(", $content);
$content = preg_replace("/\)/", ")", $content);
*/
}
else // text 이면
{
// & 처리 : & 등의 코드를 정상 출력함
$content = html_symbol($content);
// 공백 처리
$content = str_replace(" ", " ", $content);
$content = str_replace("\n ", "\n ", $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&$q1&$q2&sfl=$sfl&stx=$stx&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("/\'/", "", $name);
$name = preg_replace("/\'/", "", $name);
$name = preg_replace("/\"/", """, $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}&name={$name}&email={$email}&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[] = " ";
*/
// 3.31
// TEXT 출력일 경우 & 등의 코드를 정상으로 출력해 주기 위함
if ($html == 0) {
$str = html_symbol($str);
}
$source[] = "/</";
$target[] = "<";
$source[] = "/>/";
$target[] = ">";
//$source[] = "/\"/";
//$target[] = """;
$source[] = "/\'/";
$target[] = "'";
//$source[] = "/}/"; $target[] = "}";
if ($html) {
$source[] = "/\n/";
$target[] = "<br />";
}
return preg_replace($source, $target, $str);
}
/*
// HTML 특수문자 변환 htmlspecialchars
function hsc($str)
{
$trans = array("\"" => """, "'" => "'", "<"=>"<", ">"=>">");
$str = strtr($str, $trans);
return $str;
}
*/
// 3.31
// HTML SYMBOL 변환
// & · 등을 정상으로 출력
function html_symbol($str)
{
return preg_replace("/\&([a-z0-9]{1,20}|\#[0-9]{0,3});/i", "&\\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", "<$1$2$3>", $code);
// script 나 iframe 태그를 막지 않는 경우 필터링이 되도록 수정
return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>?/i", "<$1$2$3>", $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 에서 edho $view[file][$i][source] 하시면 원본명이 나올텐데요..
모니터군님 ^^
view.skin.php 에서는 그렇게 하면 나오거든요.
그런데 common.lib.php에 보면 첨부이미지가 폭이 지정된 사이즈 이상일 때
라이트박스를 작동하게 하는 부분에서 라이트박스 창이 뜰 때 라이트박스 창에 보면 파일명이나 타이틀이
뜨게 되어 있는데요. 라이트박스 창에다 실제 파일명을 출력하고 싶어서 입니다.
그런데 common.lib.php에서 $view[file][$i][source]를 쓰면 안나오고 에러가 나더라구요.
그래서 실제 파일명이 $file[bf_source] 인것 같은데 이것도 안되더라구요.
질문의 요지는 common.lib.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_~~]이렇게는 사용할 수 없습니다
위 코드가 들어있는 함수 전체를 올려보세요
urlencode($file)<---$file 이것이 화일명이니 $file[bf_~~]이렇게는 사용할 수 없습니다
아 네 균이님 ^^ 그렇군요.
사용중인 그누보드가 DTD 버전이에요. sir 사이트에 DTD 버전 프로젝트 링크를 따라가면
있는 그누보드 입니다.
일단 해결했습니다. ㅠㅠ 그냥 주먹구구식으로...
답변 정말 감사드립니다.
사용중인 그누보드가 DTD 버전이에요. sir 사이트에 DTD 버전 프로젝트 링크를 따라가면
있는 그누보드 입니다.
일단 해결했습니다. ㅠㅠ 그냥 주먹구구식으로...
답변 정말 감사드립니다.