그누보드, get_sql_search() 변형 – Exact 검색
페이지 정보
작성자 서방님 댓글 0건 조회 201회 작성일 15-08-13 15:21본문
그누보드 게시판내 검색을 담당하는 함수인 get_sql_search()
는 검색 대상 필드에 따라서 이미 정해진 규칙에 따라서 검색 방법을 결정합니다. ( lib/common.lib.php
line 575-600)
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;
}
mb_id
와 wr_name
은 exact match를, wr_hit
, wr_good
, wr_nogood
은 숫자 정보이기에 검색어(숫자) 보다 크거나 같은 경우 비교로, wr_num
은 (사용자가 사용하는 경우는 거의 없지만) 검색어의 음수로 비교, wr_ip
와 wr_password
는 검색을 불가하게 하고, 나머지 검색 필드들은 INSTR
함수로 처리합니다.
이 나머지 검색 필드들에 해당하는 대표적인 경우가 제목(wr_subject
)과 내용(wr_content
)이며, 이들에 대해서는 당연히 INSTR
을 통한 일부 검색을 하는 것이 맞습니다.
하지만 가끔 여분필드 (wr_1
~ wr_10
)를 특정 정보로 사용하는 경우, 검색시에 exact match를 했으면 할때가 있습니다. 예를 들어 wr_1
에 음식재료명을 넣어둔다면 ‘고추’와 ‘고추장’에 대해서 ‘고추’로 검색하게 되면 두 경우 모두 검색되는데, 전체 필드가 같은 경우만 검색했으면 하는 것이죠.
만일 exact match를 원하는 경우라면, 다음 처럼 $exact
변수를 하나 더 사용하여default
경우에 판단을 하게 하는 것입니다.
function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator='and', $exact='')
....
default :
if ($exact) // exact match
$str .= " $field[$k] = '$s[$i]' ";
elseif (preg_match("/[a-zA-Z]/", $search_str))
$str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))";
else
$str .= "INSTR($field[$k], '$search_str')";
break;
}
물론 이에 해당하는 (GET 방법을 이용한) (wr_1가 ‘고추’인지 검색하는) 검색 링크는
http://domain.com/bbs/board.php?bo_table=TABLE&sfl=wr_1&stx=고추&exact=1
와 같이 exact 값을 넘겨야 겠죠.
댓글목록
등록된 댓글이 없습니다.