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

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
검색조건을 두가지로 하려면 어떻게 해야할까요?

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

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

 

 

 

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

회원로그인

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