1) { $str .= '처음'.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 .= '이전'.PHP_EOL; if ($total_page > 1) { for ($k=$start_page;$k<=$end_page;$k++) { if ($cur_page != $k) $str .= ''.$k.'페이지'.PHP_EOL; else $str .= '열린'.$k.'페이지'.PHP_EOL; } } if ($total_page > $end_page) $str .= '다음'.PHP_EOL; if ($cur_page < $total_page) { $str .= '맨끝'.PHP_EOL; } if ($str) return ""; else return ""; } // 페이징 코드의
태그 다음에 코드를 삽입 function page_insertbefore($paging_html, $insert_html) { if ($paging_html) { return preg_replace("/^(]+>]+>)/", '$1'.$insert_html, $paging_html); } } // 페이징 코드의
태그 이전에 코드를 삽입 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("/ /", " ", $str); echo nl2br("$str"); } // 메타태그를 이용한 URL 이동 // header("location:URL") 을 대체 function goto_url($url) { $url = str_replace("&", "&", $url); //echo ""; if (!headers_sent()) header('Location: '.$url); else { echo ''; echo ''; } 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 = ''; if (isset($g4['title'])) { $header = $g4['title']; } include_once(G4_BBS_PATH.'/alert.php'); exit; } // 경고메세지 출력후 창을 닫음 function alert_close($msg, $error=true) { global $g4; $header = ''; if (isset($g4['title'])) { $header = $g4['title']; } include_once(G4_BBS_PATH.'/alert_close.php'); exit; } // 경고메세지 출력후 창을 닫음 function alert_login($msg, $url) { global $g4; $header = ''; if (isset($g4['title'])) { $header = $g4['title']; } include_once(G4_BBS_PATH.'/alert_login.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", "
", $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("/</", "\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\\2", $str); //$str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,]+)/i", "\\1\\2", $str); // 100825 : () 추가 // 120315 : CHARSET 에 따라 링크시 글자 잘림 현상이 있어 수정 $str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[가-힣\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1\\2", $str); // 이메일 정규표현식 수정 061004 //$str = preg_replace("/(([a-z0-9_]|\-|\.)+@([^[:space:]]*)([[:alnum:]-]))/i", "\\1", $str); $str = preg_replace("/([0-9a-z]([-_\.]?[0-9a-z])*@[0-9a-z]([-_\.]?[0-9a-z])*\.[a-z]{2,4})/i", "\\1", $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($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&wr_id=$wr_id&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($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'], $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']; $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; } // 게시글 리스트에 쓰일 1개의 파일 정보를 얻는다. function get_list_file($bo_table, $wr_id) { global $g4; $sql = " select * from {$g4['board_file_table']} where bo_table = '$bo_table' and wr_id = '$wr_id' order by bf_no "; $row = sql_fetch($sql); return $row; } // 폴더의 용량 ($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_url, $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'] = "".$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'])); $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'] = ''.$tmp_name.''; $reply = $list['wr_reply']; $list['reply'] = strlen($reply)*10; $list['icon_reply'] = ''; if ($list['reply']) $list['icon_reply'] = '답변글'; $list['icon_link'] = ''; if ($list['wr_link1'] || $list['wr_link2']) $list['icon_link'] = '관련링크'; // 분류명 링크 $list['ca_name_href'] = G4_BBS_URL.'/board.php?bo_table='.$board['bo_table'].'&sca='.urlencode($list['ca_name']); $list['href'] = G4_BBS_URL.'/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'] = '새글'; $list['icon_hot'] = ''; if ($list['wr_hit'] >= $board['bo_hot']) $list['icon_hot'] = '인기글'; $list['icon_secret'] = ''; if (strstr($list['wr_option'], 'secret')) $list['icon_secret'] = '비밀글'; // 링크 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'].'&wr_id='.$list['wr_id'].'&no='.$i.$qstr; $list['link_hit'][$i] = (int)$list["wr_link{$i}_hit"]; } // 가변 파일 if ($board['bo_use_list_file'] || ($list['wr_file'] && $subject_len == 255) /* view 인 경우 */) { $list['file'] = get_file($board['bo_table'], $list['wr_id']); } else { $list['file']['count'] = $list['wr_file']; } if ($list['file']['count']) $list['icon_file'] = '첨부파일'; return $list; } // get_list 의 alias function get_view($write_row, $board, $skin_url) { return get_list($write_row, $board, $skin_url, 255); } // 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)"; $bar = "|"; } // 지정된 검색 폰트의 색상, 배경색상으로 대체 $replace = "\\1"; 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']; } // tag 내의 주석문 무효화 하기 function bad130128($matches) { $str = $matches[2]; return '<'.$matches[1].preg_replace('#(\/\*|\*\/)#', '', $str).'>'; } // 내용을 변환 function conv_content($content, $html) { global $config, $board; if ($html) { $source = array(); $target = array(); $source[] = "//"; $target[] = ""; if ($html == 2) { // 자동 줄바꿈 $source[] = "/\n/"; $target[] = "
"; } // 테이블 태그의 갯수를 세어 테이블이 깨지지 않도록 한다. $table_begin_count = substr_count(strtolower($content), "]+)>/s", 'bad130128', $content); $content = preg_replace($source, $target, $content); // XSS (Cross Site Script) 막기 // 완벽한 XSS 방지는 없다. // 이런 경우를 방지함 //$content = preg_replace("#\/\*.*\*\/#iU", "", $content); // 위의 정규식이 아래와 같은 내용을 통과시키므로 not greedy(비탐욕수량자?) 옵션을 제거함. ignore case 옵션도 필요 없으므로 제거 // $content = preg_replace("#\/\*.*\*\/#", "", $content); // object, embed 태그에서 javascript 코드 막기 $content = preg_replace_callback("#<(object|embed)([^>]+)>#i", "bad120422", $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_callback("#<([^>]+)#", create_function('$m', 'return "<".str_replace("<", "<", $m[1]);'), $content); //$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content); $content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "_$1$2_", $content); // 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다. // value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다. $content = preg_replace("/((?<=\]+)(\s*=\s*[\'\"]?)always([\'\"]?)([^>]+(?=\>))/i", "$1$2never$3$4", $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); $content = preg_replace_callback("#style\s*=\s*[\"\']?[^\"\']+[\"\']?#i", create_function('$matches', 'return str_replace("\\\\", "", stripslashes($matches[0]));'), $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 .= "(i|&#(x69|105);?)"; $pattern .= "(o|&#(x6f|111);?)"; $pattern .= "(n|&#(x6e|110);?)"; //$content = preg_replace("/".$pattern."/i", "__EXPRESSION__", $content); $content = preg_replace("/<[^>]*".$pattern."/i", "__EXPRESSION__", $content); // 와 같은 코드에 취약점이 있어 수정함. 121213 $content = preg_replace("/(?<=style)(\s*=\s*[\"\']?xss\:)/i", '="__XSS__', $content); $content = bad_tag_convert($content); } else // text 이면 { // & 처리 : &   등의 코드를 정상 출력함 $content = html_symbol($content); // 공백 처리 //$content = preg_replace("/ /", "  ", $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 = 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"; } // 관리자 정보를 얻음 function get_admin($admin='super', $fields='*') { global $config, $group, $board; global $g4; $is = false; if ($admin == 'board') { $mb = sql_fetch("select {$fields} 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 {$fields} 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 {$fields} 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, $is_admin; $categories = explode("|", $board['bo_category_list'].($is_admin?"|공지":"")); // 구분자가 , 로 되어 있음 $str = ""; for ($i=0; $i\n"; for ($i=0; $row=sql_fetch_array($result); $i++) { if ($i == 0) $str .= ""; $str .= option_selected($row['gr_id'], $selected, $row['gr_subject']); } $str .= ""; return $str; } function option_selected($value, $selected, $text='') { if (!$text) $text = $value; if ($value == $selected) return "\n"; else return "\n"; } // '예', '아니오'를 SELECT 형식으로 얻음 function get_yn_select($name, $selected='1', $event='') { $str = ""; 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("/\'/", "", $name); $name = preg_replace("/\'/", "", $name); $name = preg_replace("/\"/", """, $name); $title_name = $name; $tmp_name = ""; if ($mb_id) { //$tmp_name = "$name"; $tmp_name = ''; 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 .= ''; if ($config['cf_use_member_icon'] == 2) // 회원아이콘+이름 $tmp_name = $tmp_name.' '.$name; } else { $tmp_name = $tmp_name." ".$name; } } else { $tmp_name = $tmp_name.' '.$name; } $tmp_name .= ''; $title_mb_id = '['.$mb_id.']'; } else { if(!$bo_table) return $name; $tmp_name = ''.$name.''; $title_mb_id = '[비회원]'; } $name = get_text($name); $email = get_text($email); $homepage = get_text($homepage); $str = "\n"; $str .= $tmp_name."\n"; if(!G4_IS_MOBILE) { $str2 = "\n"; if($mb_id) $str2 .= "쪽지보내기\n"; if($email) $str2 .= "메일보내기\n"; if($homepage) $str2 .= "홈페이지\n"; if($mb_id) $str2 .= "자기소개\n"; if($bo_table) { if($mb_id) $str2 .= "아이디로 검색\n"; else $str2 .= "이름으로 검색\n"; } if($mb_id) $str2 .= "전체게시물\n"; if($is_admin == "super" && $mb_id) { $str2 .= "회원정보변경\n"; $str2 .= "포인트내역\n"; } $str2 .= "\n"; $str .= $str2; $str .= "\n"; } $str .= ""; 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)) { $img = ''; $img .= ''.$content.''; $img .= ''; return $img; } } // 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 "{$view['link'][$number]['link']}"; } 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[] = "  "; */ // 3.31 // TEXT 출력일 경우 &   등의 코드를 정상으로 출력해 주기 위함 if ($html == 0) { $str = html_symbol($str); } $source[] = "//"; $target[] = ">"; //$source[] = "/\"/"; //$target[] = """; $source[] = "/\'/"; $target[] = "'"; //$source[] = "/}/"; $target[] = "}"; if ($html) { $source[] = "/\n/"; $target[] = "
"; } 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; return @mysql_connect($host, $user, $pass); } // DB 선택 function sql_select_db($db, $connect) { global $g4; return @mysql_select_db($db, $connect); } // mysql_query 와 mysql_error 를 한꺼번에 처리 function sql_query($sql, $error=TRUE) { if ($error) $result = @mysql_query($sql) or die("

$sql

" . mysql_errno() . " : " . mysql_error() . "

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("

$sql

" . mysql_errno() . " : " . mysql_error() . "

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 $schema_create .= $crlf . ') DEFAULT CHARSET=utf8'; 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 .= "