검색조건을 두가지로 하려면 어떻게 해야할까요?

검색조건을 두가지로 하려면 어떻게 해야할까요?

QA

검색조건을 두가지로 하려면 어떻게 해야할까요?

본문

그누보드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 인자는 임의로 넣은거니 변경하셔도 됩니다.

잘 될지는 모르겠지만 건투를 빕니다.

 

 

 

답변을 작성하시기 전에 로그인 해주세요.
전체 123,521 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT