Files
firstgarden-web-gnu/lib/common.lib.php
2013-02-01 15:30:03 +09:00

1674 lines
52 KiB
PHP

<?
if (!defined('_GNUBOARD_')) exit;
/*************************************************************************
**
** 일반 함수 모음
**
*************************************************************************/
// 마이크로 타임을 얻어 계산 형식으로 만듦
function get_microtime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
// 현재페이지, 총페이지수, 한페이지에 보여줄 행, URL
function get_paging($write_pages, $cur_page, $total_page, $url, $add="")
{
$url = preg_replace('#(&amp;|&)?page\=[0-9]+#', '', $url);
$str = '';
if ($cur_page > 1) {
$str .= '<a href="'.$url.'1'.$add.'" class="pg_page pg_start">처음</a>'.PHP_EOL;
}
$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.'" class="pg_page pg_prev">이전</a>'.PHP_EOL;
if ($total_page > 1) {
for ($k=$start_page;$k<=$end_page;$k++) {
if ($cur_page != $k)
$str .= '<a href="'.$url.$k.$add.'" class="pg_page">'.$k.'</a><span class="sound_only">페이지</span>'.PHP_EOL;
else
$str .= '<span class="sound_only">선택된</span><strong class="pg_current">'.$k.'</strong><span class="sound_only">페이지</span>'.PHP_EOL;
}
}
if ($total_page > $end_page) $str .= '<a href="'.$url.($end_page+1).$add.'" class="pg_page pg_next">다음</a>'.PHP_EOL;
if ($cur_page < $total_page) {
$str .= '<a href="'.$url.$total_page.$add.'" class="pg_page pg_end">맨끝</a>'.PHP_EOL;
}
if ($str)
return "<div class=\"pg\"><span class=\"pg_wrap\">{$str}</span></div>";
else
return "";
}
// 페이징 코드의 <div><span> 태그 다음에 코드를 삽입
function page_insertbefore($paging_html, $insert_html)
{
if ($paging_html) {
return preg_replace("/^(<div[^>]+><span[^>]+>)/", '$1'.$insert_html, $paging_html);
}
}
// 페이징 코드의 </span></div> 태그 이전에 코드를 삽입
function page_insertafter($paging_html, $insert_html)
{
if ($paging_html) {
return preg_replace("/(<\/span><\/div>)$/", $insert_html.'$1', $paging_html);
}
}
// 변수 또는 배열의 이름과 값을 얻어냄. 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)
{
$url = str_replace("&amp;", "&", $url);
//echo "<script> location.replace('$url'); </script>";
header("Location:$url");
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 isset($_SESSION[$session_name]) ? $_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)
{
$cookie = md5($cookie_name);
if (array_key_exists($cookie, $_COOKIE))
return base64_decode($_COOKIE[md5($cookie_name)]);
else
return "";
}
// 경고메세지를 경고창으로
function alert($msg='', $url='', $error=true, $post=false)
{
global $g4, $config, $member;
global $is_admin;
if (!$msg) $msg = '올바른 방법으로 이용해 주십시오.';
/*
//header("Content-Type: text/html; charset=$g4['charset']");
echo "<meta http-equiv=\"content-type\" content=\"text/html; charset={$g4['charset']}\">";
echo "<script>alert('$msg');";
if (!$url)
echo "history.go(-1);";
echo "</script>";
if ($url)
// 4.06.00 : 불여우의 경우 아래의 코드를 제대로 인식하지 못함
//echo "<meta http-equiv='refresh' content='0;url=$url'>";
goto_url($url);
exit;
*/
$header = '';
if (isset($g4['title'])) {
$header = $g4['title'];
}
include_once(G4_BBS_PATH.'/alert.php');
exit;
}
// 경고메세지 출력후 창을 닫음
function alert_close($msg, $error=true)
{
global $g4;
/*
echo "<meta http-equiv=\"content-type\" content=\"text/html; charset={$g4['charset']}\">";
echo "<script> alert('$msg'); window.close(); </script>";
exit;
*/
$header = '';
if (isset($g4['title'])) {
$header = $g4['title'];
}
include_once(G4_BBS_PATH.'/alert_close.php');
exit;
}
// confirm 창
function confirm($msg, $url1='', $url2='', $url3='')
{
global $g4;
if (!$msg) {
$msg = '올바른 방법으로 이용해 주십시오.';
alert($msg);
}
if(!trim($url1) || !trim($url2)) {
$msg = '$url1 과 $url2 를 지정해 주세요.';
alert($msg);
}
if (!$url3) $url3 = $_SERVER['HTTP_REFERER'];
$msg = str_replace("\\n", "<br>", $msg);
$header = '';
if (isset($g4['title'])) {
$header = $g4['title'];
}
include_once(G4_BBS_PATH.'/confirm.php');
exit;
}
// way.co.kr 의 wayboard 참고
function url_auto_link($str)
{
global $g4;
global $config;
// 속도 향상 031011
$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);
// 100825 : () 추가
// 120315 : CHARSET 에 따라 링크시 글자 잘림 현상이 있어 수정
if (strtoupper($g4['charset']) == 'UTF-8') {
$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);
} else {
$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);
}
// 이메일 정규표현식 수정 061004
//$str = preg_replace("/(([a-z0-9_]|\-|\.)+@([^[:space:]]*)([[:alnum:]-]))/i", "<a href='mailto:\\1'>\\1</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($file)
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)
{
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'] = G4_BBS_URL."/download.php?bo_table=$bo_table&amp;wr_id=$wr_id&amp;no=$no" . $qstr;
$file[$no]['download'] = $row['bf_download'];
// 4.00.11 - 파일 path 추가
$file[$no]['path'] = G4_DATA_URL.'/file/'.$bo_table;
//$file[$no]['size'] = get_filesize("{$file[$no]['path']}/$row['bf_file']");
$file[$no]['size'] = get_filesize($row['bf_filesize']);
//$file[$no]['datetime'] = date("Y-m-d H:i:s", @filemtime("$g4['path']/data/file/$bo_table/$row['bf_file']"));
$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'], $file[$no]['content']);
$file[$no]['view'] = view_file_link($row['bf_file'], $row['bf_width'], $row['bf_height'], $file[$no]['content']);
$file[$no]['file'] = $row['bf_file'];
// prosper 님 제안
//$file[$no]['imgsize'] = @getimagesize("{$file[$no]['path']}/$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;
//$t = get_microtime();
// 배열전체를 복사
$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'] = "<span class=\"cnt_cmt\"><span class=\"sound_only\">댓글</span>".$list['wr_comment']."</span>";
// 당일인 경우 시간으로 표시함
$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']));
$tmp_name = get_text(cut_str($list['wr_name'], $config['cf_cut_name'])); // 설정된 자리수 만큼만 이름 출력
if ($board['bo_use_sideview'])
$list['name'] = get_sideview($list['mb_id'], $tmp_name, $list['wr_email'], $list['wr_homepage']);
else
$list['name'] = '<span class="'.($list['mb_id']?'sv_member':'sv_guest').'">'.$tmp_name.'</span>';
$reply = $list['wr_reply'];
$list['reply'] = '';
if (strlen($reply) > 0)
{
for ($k=0; $k<strlen($reply); $k++)
$list['reply'] .= ' ';
}
$list['icon_reply'] = '';
if ($list['reply'])
$list['icon_reply'] = '<img src="'.$skin_path.'/img/icon_reply.gif" alt="답변글">';
$list['icon_link'] = '';
if ($list['wr_link1'] || $list['wr_link2'])
$list['icon_link'] = '<img src="'.$skin_path.'/img/icon_link.gif" alt="관련링크">';
// 분류명 링크
$list['ca_name_href'] = G4_BBS_URL.'/board.php?bo_table='.$board['bo_table'].'&amp;sca='.urlencode($list['ca_name']);
$list['href'] = G4_BBS_URL.'/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="새글">';
$list['icon_hot'] = '';
if ($list['wr_hit'] >= $board['bo_hot'])
$list['icon_hot'] = '<img src="'.$skin_path.'/img/icon_hot.gif" alt="인기글">';
$list['icon_secret'] = '';
if (strstr($list['wr_option'], 'secret'))
$list['icon_secret'] = '<img src="'.$skin_path.'/img/icon_secret.gif" alt="비밀글">';
// 링크
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_URL.'/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"];
}
// 가변 파일
$list['file'] = get_file($board['bo_table'], $list['wr_id']);
if ($list['file']['count'])
$list['icon_file'] = '<img src="'.$skin_path.'/img/icon_file.gif" alt="첨부파일">';
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 = "<b class=\"sch_word\">\\1</b>";
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)
{
$tag = $matches['1'];
$code = $matches['2'];
if (preg_match("#\bscript\b#i", $code)) {
return "$tag 태그에 스크립트는 사용 불가합니다.";
} else if (preg_match("#\bbase64\b#i", $code)) {
return "$tag 태그에 BASE64는 사용 불가합니다.";
}
return $matches['0'];
}
// 내용을 변환
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 방지는 없다.
// 이런 경우를 방지함 <IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
$content = preg_replace("#\/\*.*\*\/#iU", "", $content);
// object, embed 태그에서 javascript 코드 막기
$content = preg_replace_callback("#<(object|embed)([^>]+)>#i", "bad120422", $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_callback("#<([^>]+)#", create_function('$m', 'return "<".str_replace("<", "&lt;", $m[1]);'), $content);
$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content);
// 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다.
// value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다.
$content = preg_replace("/((?<=\<param|\<embed)[^>]+)(\s*=\s*[\'\"]?)always([\'\"]?)([^>]+(?=\>))/i", "$1$2never$3$4", $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);
$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);
}
else // text 이면
{
// & 처리 : &amp; &nbsp; 등의 코드를 정상 출력함
$content = html_symbol($content);
// 공백 처리
//$content = preg_replace("/ /", "&nbsp; ", $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 = strip_tags(($search_text));
$search_text = trim(stripslashes($search_text));
if (!$search_text) {
if ($search_ca_name) {
return $str;
} else {
return '0';
}
}
if ($str)
$str .= " and ";
// 쿼리의 속도를 높이기 위하여 ( ) 는 최소화 한다.
$op1 = "";
// 검색어를 구분자로 나눈다. 여기서는 공백
$s = array();
$s = explode(" ", $search_text);
// 검색필드를 구분자로 나눈다. 여기서는 +
$tmp = array();
$tmp = explode(",", trim($search_field));
$field = explode("||", $tmp[0]);
$not_comment = "";
if (!empty($tmp[1]))
$not_comment = $tmp[1];
$str .= "(";
for ($i=0; $i<count($s); $i++) {
// 검색어
$search_str = trim($s[$i]);
if ($search_str == "") continue;
// 인기검색어
$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;
case "wr_ip" :
case "wr_password" :
$str .= "1=0"; // 항상 거짓
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 ";
}
$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 (isset($group['gr_admin']) && ($group['gr_admin'] == $mb_id)) return 'group';
if (isset($board['bo_admin']) && ($board['bo_admin'] == $mb_id)) return 'board';
return '';
}
// 분류 옵션을 얻음
// 4.00 에서는 카테고리 테이블을 없애고 보드테이블에 있는 내용으로 대체
function get_category_option($bo_table='', $ca_name='')
{
global $g4, $board;
$arr = explode("|", $board['bo_category_list']); // 구분자가 , 로 되어 있음
$str = "";
for ($i=0; $i<count($arr); $i++) {
$category = trim($arr[$i]);
if (!$category) continue;
$str .= "<lioption value=\"$arr[$i]\"";
if ($category == $ca_name) {
$str .= ' selected="selected"';
}
$str .= ">$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 id=\"$name\" name=\"$name\" $event>\n";
for ($i=0; $row=sql_fetch_array($result); $i++) {
$str .= option_selected($row['gr_id'], $selected, $row['gr_subject']);
}
$str .= "</select>";
return $str;
}
function option_selected($value, $selected, $text='')
{
if (!$text) $text = $value;
if ($value == $selected)
return "<option value=\"$value\" selected=\"selected\">$text</option>\n";
else
return "<option value=\"$value\">$text</option>\n";
}
// '예', '아니오'를 SELECT 형식으로 얻음
function get_yn_select($name, $selected='1', $event='')
{
$str = "<select name=\"$name\" $event>\n";
if ($selected) {
$str .= "<option value=\"1\" selected>예</option>\n";
$str .= "<option value=\"0\">아니오</option>\n";
} else {
$str .= "<option value=\"1\">예</option>\n";
$str .= "<option value=\"0\" selected>아니오</option>\n";
}
$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;
global $bo_table, $sca, $is_admin;
$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;
$tmp_name = "";
if ($mb_id) {
$tmp_name = "<a href=\"".G4_BBS_URL."/profile.php?mb_id=".$mb_id."\" class=\"sv_member\" title=\"$name 자기소개\" target=\"_blank\" onclick=\"win_profile(this.href); return false;\">$name</a>";
if ($config['cf_use_member_icon']) {
$mb_dir = substr($mb_id,0,2);
$icon_file = G4_DATA_PATH.'/member/'.$mb_dir.'/'.$mb_id.'.gif';
if (file_exists($icon_file)) {
$width = $config['cf_member_icon_width'];
$height = $config['cf_member_icon_height'];
$icon_file_url = G4_DATA_URL.'/member/'.$mb_dir.'/'.$mb_id.'.gif';
$tmp_name = '<img src="'.$icon_file_url.'" width="'.$width.'" height="'.$height.'" border="0" alt="">';
if ($config['cf_use_member_icon'] == 2) // 회원아이콘+이름
$tmp_name = $tmp_name . " <a href=\"".G4_BBS_URL."/profile.php?mb_id=".$mb_id."\" class=\"sv_member\" title=\"$name 자기소개\" target=\"_blank\" onclick=\"win_profile(this.href); return false;\">$name</a>";
}
}
$title_mb_id = '['.$mb_id.']';
} else {
$tmp_name = "<a href=\"".G4_BBS_URL."/board.php?bo_table=".$bo_table."&amp;sca=".$sca."&amp;sfl=wr_name,1&stx=".$name."\" title=\"$name 이름으로 검색\"class=\"sv_guest\">$name</a>";
$title_mb_id = '[비회원]';
}
$name = get_text($name);
$email = get_text($email);
$homepage = get_text($homepage);
$str = "<strong class=\"sv\">\n";
$str .= $tmp_name."\n";
$str2 = "<span class=\"sv_wrap\">\n";
if($mb_id)
$str2 .= "<a href=\"".G4_BBS_URL."/memo_form.php?me_recv_mb_id=".$mb_id."\" onclick=\"win_memo(this.href); return false;\">쪽지보내기</a>\n";
if($email)
$str2 .= "<a href=\"".G4_BBS_URL."/formmail.php?mb_id=".$mb_id."&amp;name=".urlencode($name)."&amp;email=".$email."\" onclick=\"win_email(this.href); return false;\">메일보내기</a>\n";
if($homepage)
$str2 .= "<a href=\"".$homepage."\" target=\"_blank\">홈페이지</a>\n";
if($mb_id)
$str2 .= "<a href=\"".G4_BBS_URL."/profile.php?mb_id=".$mb_id."\" onclick=\"win_profile(this.href); return false;\">자기소개</a>\n";
if($bo_table) {
if($mb_id)
$str2 .= "<a href=\"".G4_BBS_URL."/board.php?bo_table=".$bo_table."&amp;sca=".$sca."&amp;sfl=mb_id,1&amp;stx=".$mb_id."\">아이디로 검색</a>\n";
else
$str2 .= "<a href=\"".G4_BBS_URL."/board.php?bo_table=".$bo_table."&amp;sca=".$sca."&amp;sfl=wr_name,1&stx=".$name."\">이름으로 검색</a>\n";
}
if($mb_id)
$str2 .= "<a href=\"".G4_BBS_URL."/new.php?mb_id=".$mb_id."\">전체게시물</a>\n";
if($is_admin == "super" && $mb_id) {
$str2 .= "<a href=\"".G4_ADMIN_URL."/member_form.php?w=u&amp;mb_id=".$mb_id."\" target=\"_blank\">회원정보변경</a>\n";
$str2 .= "<a href=\"".G4_ADMIN_URL."/point_list.php?sfl=mb_id&amp;stx=".$mb_id."\" target=\"_blank\">포인트내역</a>\n";
}
$str2 .= "</span>\n";
$str .= $str2."\n<noscript class=\"sv_nojs\">".$str2."</noscript>";
$str .= "</strong>";
return $str;
}
// 파일을 보이게 하는 링크 (이미지, 플래쉬, 동영상)
function view_file_link($file, $width, $height, $content='')
{
global $config, $board;
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 = '';
if (preg_match("/\.({$config['cf_image_extension']})$/i", $file))
// 이미지에 속성을 주지 않는 이유는 이미지 클릭시 원본 이미지를 보여주기 위한것임
// 게시판설정 이미지보다 크다면 스킨의 자바스크립트에서 이미지를 줄여준다
return "<img src='".G4_DATA_URL."/file/{$board['bo_table']}/".urlencode($file)."' onclick='image_window(this);' 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."번 링크 없음}";
}
*/
function cut_str($str, $len, $suffix="")
{
$arr_str = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
$str_len = count($arr_str);
if ($str_len >= $len) {
$slice_str = array_slice($arr_str, 0, $len);
$str = join("", $slice_str);
return $str . ($str_len > $len ? $suffix : '');
} else {
$str = join("", $arr_str);
return $str;
}
}
// 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;
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";
}
$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";
}
$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";
}
$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";
}
$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";
}
$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";
}
$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 ($options & G4_HANGUL) {
$s .= $c . $str[$i+1] . $str[$i+2];
}
$i+=2;
}
// 숫자
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 " <font color=blue>(type={$row['type']} , key={$row['key']})</font>";
}
}
// 악성태그 변환
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 _token()
{
return md5(uniqid(rand(), true));
}
// 불법접근을 막도록 토큰을 생성하면서 토큰값을 리턴
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;
}
// 문자열에 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;
}
/*
-----------------------------------------------------------
Charset 을 변환하는 함수
-----------------------------------------------------------
iconv 함수가 있으면 iconv 로 변환하고
없으면 mb_convert_encoding 함수를 사용한다.
둘다 없으면 사용할 수 없다.
*/
function convert_charset($from_charset, $to_charset, $str)
{
if( function_exists('iconv') )
return iconv($from_charset, $to_charset, $str);
elseif( function_exists('mb_convert_encoding') )
return mb_convert_encoding($str, $to_charset, $from_charset);
else
die("Not found 'iconv' or 'mbstring' library in server.");
}
// mysql_real_escape_string 의 alias 기능을 한다.
function escape_trim($field)
{
return mysql_real_escape_string(trim($field));
}
// $_POST 형식에서 checkbox 엘리먼트의 checked 속성에서 checked 가 되어 넘어 왔는지를 검사
function is_checked($field)
{
return !empty($_POST[$field]);
}
function abs_ip2long($ip='')
{
$ip = $ip ? $ip : $_SERVER['REMOTE_ADDR'];
return abs(ip2long($ip));
}
function get_selected($field, $value, $first=false)
{
$selected = ($field==$value) ? ' selected="selected"' : '';
if ($first && !$selected)
$selected = ($field=="") ? ' selected="selected"' : '';
return $selected;
}
function skin_path()
{
global $g4;
$skin_path = $g4['path'].'/'.$g4['skin_dir'];
if (G4_IS_MOBILE) $skin_path = $g4['mobile_path'].'/'.$skin_dir;
return $skin_path;
}
function is_mobile()
{
return preg_match('/'.G4_MOBILE_AGENT.'/i', $_SERVER['HTTP_USER_AGENT']);
}
?>