검색 기능에 대해서.. 채택완료
페이지를 만들어 게시판과 검색 기능을 분리했는데
검색 시 해당 게시판이 검색되게 할 수 있나요?
<?php
?>
$g5['title'] = '전체검색 결과';
include_once('./_head.php');
$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']) ? $_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();
$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);
$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";
$str_board_list .= '<li><a href="'.$_SERVER['PHP_SELF'].'?'.$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 = 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 = get_text($content, 1);
$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]['subject'] = $subject;
$list[$idx][$i]['content'] = $content;
$list[$idx][$i]['name'] = get_sideview($row['mb_id'], get_text(cut_str($row['wr_name'], $config['cf_cut_name'])), $row['wr_email'], $row['wr_homepage']);
$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['PHP_SELF'].'?'.$search_query.'&gr_id='.$gr_id.'&srows='.$srows.'&onetable='.$onetable.'&page=');
}
$group_select = '<label for="gr_id" class="sound_only">게시판 그룹선택</label><select name="gr_id" id="gr_id" class="select"><option value="">전체 분류';
$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_select .= "<option value=\"".$row['gr_id']."\"".get_selected($_GET['gr_id'], $row['gr_id']).">".$row['gr_subject']."</option>";
$group_select .= '</select>';
if (!$sfl) $sfl = 'wr_subject';
if (!$sop) $sop = 'or';
include_once($search_skin_path.'/search.skin.php');
?>
위에서 해당 게시판으로 검색이 되게 할려면 어디를 수정해야 합니까?
게시판 2개에서 동시에 검색되게 할려고 합니다
도움 부탁드립니다..
답변 1개
특정 게시판 2개만 검색하게 하시려는 건가요?
2가지 방법이 있습니다.
1. 특별히 소스 변경할 필요없이 관리자가서 게시판목록에서 검색가능하게할 게시판만 검색체크를 켜면 됩니다.
2. 통합검색과는 달리 별도로 2개의 테이블만 검색하는 검색페이지를 만드는 경우라면 위 소스에서
for(...) {
...
$g5_search['tables'][] = $row['bo_table'];
$g5_search['read_level'][] = $row['bo_read_level'];
}
이부분에서 검색할 테이블을 지정하고 있습니다.
코드를 테스트해보지 않아서 정확하진 않습니다만
$g5_search['tables']에 배열로 검색할 테이블 bo_table값을 배열로 넣어주시고요.
$g5_search['read_level']에도 검색할 테이블의 읽기레벨값을 넣어주시고
이 코드를 위 for문을 삭제하고 그자리에 넣거나 아니면 for문 끝난 다음에 넣으면 될거 같습니다.
행운을 빕니다. ^^;
답변에 대한 댓글 1개
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
답변에 감사드립니다..
현재 메인에 list.skin.php"를 복사해서 넣어서 게시판 하단 검색 시 list.skin.php"에 다시 나오게 하는 의도인데
전혀 검색이 안되고 있어서 난감하네요..