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

그누보드4를 쓰고 있는데 관련 게시판을 못찾아 여기에 질문합니다.

검색조건을 두가지로 하고 싶습니다.

wr_1 과 wr_2를 and로 검색하고 싶은데요

일단 이렇게 하면 하나는 됩니다.

board.php?bo_table=sn_visit&sca=&sfl=wr_1&stx=2022/02/11

여기에 붙여서 두번째 검색을 넣고 싶은데 어떻게 하면 좋을까요?

답변 2개

채택된 답변
+20 포인트
Copy
입력한 날짜를 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' ";
로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

오!! 감사드려요~!!

댓글을 작성하려면 로그인이 필요합니다.

참고로 그누보드 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 인자를 추가하였습니다.

Copy
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 로 검색하시면 해당 부분을 아래와같이 수정합니다.

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

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

와우.... 정성 추
우와~~ 감사드립니다~
한수 배우고 갑니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고