검색조건을 두가지로 하려면 어떻게 해야할까요?
본문
그누보드4를 쓰고 있는데 관련 게시판을 못찾아 여기에 질문합니다.
검색조건을 두가지로 하고 싶습니다.
wr_1 과 wr_2를 and로 검색하고 싶은데요
일단 이렇게 하면 하나는 됩니다.
board.php?bo_table=sn_visit&sca=&sfl=wr_1&stx=2022/02/11
여기에 붙여서 두번째 검색을 넣고 싶은데 어떻게 하면 좋을까요?
답변 2
입력한 날짜를 wr_1과 wr_2에서 동시에 검색 하는 것인가요?
bbs/list.php에서
$sql_search = get_sql_search($sca, $sfl, $stx, $sop); 다음 행에 추가
if($bo_table=='sn_visit' && $sfl=='wr_1') $sql_search .= "and wr_2='$stx' ";
참고로 그누보드 5 입니다 ㅜㅜ
그누4는 없어서요.
sfl=wr_1||wr_2 를 하면 or 로 검색이되지만
질문자님이 원하시는 답변은 and 답변이네요. wr_1과 wr_2 에 모두 존재했을때만 검색결과 노출.
[수정대상파일]
bbs/list.php
lib/common.lib.php
1. 먼저 lib/common.lib.php 파일의 get_sql_search 함수를 수정합니다.
원본함수를 백업하시고 아래내용으로 함수를 변경합니다.
special 인자를 추가하였습니다.
function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator='and',$special='or')
{
global $g5;
$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 && $search_text !== '0') {
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;
// 인기검색어
insert_popular($field, $search_str);
$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]) ? strtolower($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 = $special; //신규 조건 대입. 없다면 기존처럼 or로 대입됨.
}
$str .= ")";
$op1 = " $search_operator ";
}
$str .= " ) ";
if ($not_comment)
$str .= " and wr_is_comment = '0' ";
return $str;
}
2. bbs/list.php 파일을 수정합니다.
get_sql_search 함수로 넘겨주는 부분에 special 이란 파라메터가 있다면 대입해줄겁니다.
해당 파일을 여시고 get_sql_search 로 검색하시면 해당 부분을 아래와같이 수정합니다.
//41번 라인 쯤?
$sql_search = get_sql_search($sca, $sfl, $stx, $sop,$special);
그리고 호출을 다음과같이 하면 원하는 결과가 나올것같습니다.
board.php?bo_table=sn_visit&sca=&sfl=wr_1||wr_2&stx=2022/02/11&special=and
테스트는 안해봤습니다.
원본파일을 건드리는거니 원본소스 꼭 백업하고 하세요.
간단히 설명드리면
그누보드의 게시판 검색함수인 get_sql_search는 sfl이 || 구분자로 멀티로 들어왔을때
$op2 변수가 or 을 대입하여 or 검색을 하게 됩니다.
wr_1='test' or wr_2='test' 이런식으로요.
그래서 special 인자를 추가하였고 기본조건은 종전과 마찬가지로 or 로 검색되게 하고
만약 special 인자에 값이 and 가 들어있다면 or 검색이 아닌 and 검색으로 넣어줍니다.
special 인자는 임의로 넣은거니 변경하셔도 됩니다.
잘 될지는 모르겠지만 건투를 빕니다.
!-->!-->