그누보드 search.php 질문..
본문
<?php
include_once('./_common.php');
$tmp_gr_id = $gr_id;
if(!$sfl) $sfl = 'wr_subject||wr_content';
// Page ID
$pid = ($pid) ? $pid : 'search';
$at = apms_page_thema($pid);
if(!defined('THEMA_PATH')) {
include_once(G5_LIB_PATH.'/apms.thema.lib.php');
}
$g5['title'] = '전체검색 결과';
include_once('./_head.php');
$skin_path = $search_skin_path;
$skin_url = $search_skin_url;
$gr_id = $tmp_gr_id;
$bo_list = array();
$search_table = Array();
$table_index = 0;
$write_pages = "";
$text_stx = "";
$srows = 0;
$stx = strip_tags($stx);
//$stx = preg_replace('/[[:punct:]]/u', '', $stx); // 특수문자 제거
$stx = get_search_string($stx); // 특수문자 제거
if ($stx) {
$stx = preg_replace('/\//', '\/', trim($stx));
$sop = strtolower($sop);
if (!$sop || !($sop == 'and' || $sop == 'or')) $sop = 'and'; // 연산자 and , or
$srows = isset($_GET['srows']) ? (int)preg_replace('#[^0-9]#', '', $_GET['srows']) : 10;
if (!$srows) $srows = 10; // 한페이지에 출력하는 검색 행수
$g5_search['tables'] = Array();
$g5_search['read_level'] = Array();
$sql = " select gr_id, bo_table, bo_read_level from {$g5['board_table']} where bo_use_search = 1 and bo_list_level <= '{$member['mb_level']}' ";
if ($gr_id)
$sql .= " and gr_id = '{$gr_id}' ";
$onetable = isset($onetable) ? $onetable : "";
if ($onetable) // 하나의 게시판만 검색한다면
$sql .= " and bo_table = '{$onetable}' ";
$sql .= " order by bo_order, gr_id, bo_table ";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++)
{
if ($is_admin != 'super')
{
// 그룹접근 사용에 대한 검색 차단
$sql2 = " select gr_use_access, gr_admin from {$g5['group_table']} where gr_id = '{$row['gr_id']}' ";
$row2 = sql_fetch($sql2);
// 그룹접근을 사용한다면
if ($row2['gr_use_access']) {
// 그룹관리자가 있으며 현재 회원이 그룹관리자라면 통과
if ($row2['gr_admin'] && $row2['gr_admin'] == $member['mb_id']) {
;
} else {
$sql3 = " select count(*) as cnt from {$g5['group_member_table']} where gr_id = '{$row['gr_id']}' and mb_id = '{$member['mb_id']}' and mb_id <> '' ";
$row3 = sql_fetch($sql3);
if (!$row3['cnt'])
continue;
}
}
}
$g5_search['tables'][] = $row['bo_table'];
$g5_search['read_level'][] = $row['bo_read_level'];
}
$search_query = 'sfl='.urlencode($sfl).'&stx='.urlencode($stx).'&sop='.$sop;
$text_stx = get_text(stripslashes($stx));
$op1 = '';
// 검색어를 구분자로 나눈다. 여기서는 공백
$s = explode(' ', strip_tags($stx));
// 검색필드를 구분자로 나눈다. 여기서는 +
$field = explode('||', trim($sfl));
$str = '(';
for ($i=0; $i<count($s); $i++) {
if (trim($s[$i]) == '') continue;
$search_str = $s[$i];
// 인기검색어
insert_popular($field, $search_str);
$str .= $op1;
$str .= "(";
$op2 = '';
// 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...)
for ($k=0; $k<count($field); $k++) {
$str .= $op2;
switch ($field[$k]) {
case 'mb_id' :
case 'wr_name' :
$str .= "$field[$k] = '$s[$i]'";
break;
case 'wr_subject' :
case 'wr_content' :
if (preg_match("/[a-zA-Z]/", $search_str))
$str .= "INSTR(LOWER({$field[$k]}), LOWER('{$search_str}'))";
else
$str .= "INSTR({$field[$k]}, '{$search_str}')";
break;
default :
$str .= "1=0"; // 항상 거짓
break;
}
$op2 = " or ";
}
$str .= ")";
$op1 = " {$sop} ";
}
$str .= ")";
$sql_search = $str;
$str_board_list = "";
$board_count = 0;
$time1 = get_microtime();
$z = 0;
$total_count = 0;
for ($i=0; $i<count($g5_search['tables']); $i++) {
$tmp_write_table = $g5['write_prefix'] . $g5_search['tables'][$i];
//$sql = " select wr_id from {$tmp_write_table} where {$sql_search} ";
//$result = sql_query($sql, false);
//$row['cnt'] = @mysql_num_rows($result);
$sql = " select count(wr_id) as cnt from {$tmp_write_table} where {$sql_search} ";
$result = sql_fetch($sql, false);
$row['cnt'] = (int)$result['cnt'];
$total_count += $row['cnt'];
if ($row['cnt']) {
$board_count++;
$search_table[] = $g5_search['tables'][$i];
$read_level[] = $g5_search['read_level'][$i];
$search_table_count[] = $total_count;
$sql2 = " select bo_subject from {$g5['board_table']} where bo_table = '{$g5_search['tables'][$i]}' ";
$row2 = sql_fetch($sql2);
$sch_class = "";
$sch_all = "";
if ($onetable == $g5_search['tables'][$i]) {
$sch_class = "class=sch_on";
} else {
$sch_all = "class=sch_on";
$bo_list[$z]['href'] = $_SERVER['SCRIPT_NAME'].'?'.$search_query.'&gr_id='.$gr_id.'&onetable='.$g5_search['tables'][$i];
$bo_list[$z]['name'] = $row2['bo_subject'];
$bo_list[$z]['cnt'] = $row['cnt'];
$z++;
}
$str_board_list .= '<li><a href="'.$_SERVER['SCRIPT_NAME'].'?'.$search_query.'&gr_id='.$gr_id.'&onetable='.$g5_search['tables'][$i].'" '.$sch_class.'><strong>'.$row2['bo_subject'].'</strong><span class="cnt_cmt">'.$row['cnt'].'</span></a></li>';
}
}
$rows = $srows;
$total_page = ceil($total_count / $rows); // 전체 페이지 계산
if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지)
$from_record = ($page - 1) * $rows; // 시작 열을 구함
for ($i=0; $i<count($search_table); $i++) {
if ($from_record < $search_table_count[$i]) {
$table_index = $i;
$from_record = $from_record - $search_table_count[$i-1];
break;
}
}
$bo_subject = array();
$list = array();
$k=0;
for ($idx=$table_index; $idx<count($search_table); $idx++) {
$sql = " select bo_subject from {$g5['board_table']} where bo_table = '{$search_table[$idx]}' ";
$row = sql_fetch($sql);
$bo_subject[$idx] = $row['bo_subject'];
$tmp_write_table = $g5['write_prefix'] . $search_table[$idx];
$sql = " select * from {$tmp_write_table} where {$sql_search} order by wr_id desc limit {$from_record}, {$rows} ";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++) {
// 검색어까지 링크되면 게시판 부하가 일어남
$list[$idx][$i] = $row;
$list[$idx][$i]['href'] = './board.php?bo_table='.$search_table[$idx].'&wr_id='.$row['wr_parent'];
if ($row['wr_is_comment'])
{
$sql2 = " select wr_subject, wr_option from {$tmp_write_table} where wr_id = '{$row['wr_parent']}' ";
$row2 = sql_fetch($sql2);
//$row['wr_subject'] = $row2['wr_subject'];
$row['wr_subject'] = get_text($row2['wr_subject']);
}
// 비밀글은 검색 불가
if (strstr($row['wr_option'].$row2['wr_option'], 'secret'))
$row['wr_content'] = '[비밀글 입니다.]';
$subject = apms_get_text($row['wr_subject']);
if (strstr($sfl, 'wr_subject'))
$subject = search_font($stx, $subject);
if ($read_level[$idx] <= $member['mb_level'])
{
//$content = cut_str(get_text(strip_tags($row['wr_content'])), 300, "…");
//$content = strip_tags($row['wr_content']);
$content = apms_cut_text($row['wr_content'], 300);
//$content = strip_tags($content);
$content = str_replace(' ', '', $content);
//$content = cut_str($content, 300, "…");
if (strstr($sfl, 'wr_content'))
$content = search_font($stx, $content);
}
else
$content = '';
$list[$idx][$i]['bo_table'] = $search_table[$idx];
$list[$idx][$i]['subject'] = $subject;
$list[$idx][$i]['content'] = $content;
$list[$idx][$i]['name'] = apms_sideview($row['mb_id'], get_text(cut_str($row['wr_name'], $config['cf_cut_name'])), $row['wr_email'], $row['wr_homepage'], $row['as_level']);
$list[$idx][$i]['date'] = strtotime($row['wr_datetime']);
$k++;
if ($k >= $rows)
break;
}
sql_free_result($result);
if ($k >= $rows)
break;
$from_record = 0;
}
$write_pages = get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$search_query.'&gr_id='.$gr_id.'&srows='.$srows.'&onetable='.$onetable.'&page=');
$write_page_rows = (G5_IS_MOBILE) ? $config['cf_mobile_pages'] : $config['cf_write_pages'];
$list_page = $_SERVER['SCRIPT_NAME'].'?'.$search_query.'&gr_id='.$gr_id.'&srows='.$srows.'&onetable='.$onetable.'&page=';
}
$group_option = '';
$sql = " select gr_id, gr_subject from {$g5['group_table']} order by gr_id ";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++) {
$group_option .= "<option value=\"".$row['gr_id']."\"".get_selected($_GET['gr_id'], $row['gr_id']).">".$row['gr_subject']."</option>";
}
$group_select = '<label for="gr_id" class="sound_only">게시판 그룹선택</label><select name="gr_id" id="gr_id" class="select"><option value="">전체 분류';
$group_select .= $group_option;
$group_select .= '</select>';
if (!$sfl) $sfl = 'wr_subject';
if (!$sop) $sop = 'or';
include_once($skin_path.'/search.skin.php');
include_once('./_tail.php');
?>
그누보드 게시판69개에 꾀나 많은 테이블값들이 있는데
검색시작하면 거의 검색시간만 1분이 걸려서..
몇개 공백기능이나 그런 기능을 좀 없에고 최대한 단순하게
직관적으로 변경하고싶은데
도움이 필요합니다...
선배님들
답변 2
각 게시판에서의 검색이라면
search.php 이파일을 살펴보지마시고
list.php 파일을 보셔야합니다.
search.php파일은 메인화면의 전체검색시 사용되는데 해당 기능이 맞나요?
통합검색 게시판 수가 너무 많습니다. 검색관련 커스터 마이징이 필요로 할것같습니다.
또는 검색엔진을 이용한다던가 하는 방법으로요.
답변을 작성하시기 전에 로그인 해주세요.