테스트 사이트 - 개발 중인 베타 버전입니다

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

smltree 3년 전 조회 3,399

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

 

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

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

 

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

 

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

 

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

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

답변 2개

채택된 답변
+20 포인트
3년 전

</p>

<p>입력한 날짜를 wr_1과 wr_2에서 동시에 검색 하는 것인가요? </p>

<p>bbs/list.php에서</p>

<p>    $sql_search = get_sql_search($sca, $sfl, $stx, $sop); 다음 행에 추가</p>

<p>

    if($bo_table=='sn_visit' && $sfl=='wr_1') $sql_search .= "and wr_2='$stx' ";</p>

<p>

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

답변에 대한 댓글 1개

s
smltree
3년 전
오!! 감사드려요~!!

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

포이치
3년 전

 

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

 

</p>

<p>function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator='and',$special='or')</p>

<p>{</p>

<p>    global $g5;</p>

<p> </p>

<p>    $str = "";</p>

<p>    if ($search_ca_name)</p>

<p>        $str = " ca_name = '$search_ca_name' ";</p>

<p> </p>

<p>    $search_text = strip_tags(($search_text));</p>

<p>    $search_text = trim(stripslashes($search_text));</p>

<p> </p>

<p>    if (!$search_text && $search_text !== '0') {</p>

<p>        if ($search_ca_name) {</p>

<p>            return $str;</p>

<p>        } else {</p>

<p>            return '0';</p>

<p>        }</p>

<p>    }</p>

<p> </p>

<p>    if ($str)</p>

<p>        $str .= " and ";</p>

<p> </p>

<p>    // 쿼리의 속도를 높이기 위하여 ( ) 는 최소화 한다.</p>

<p>    $op1 = "";</p>

<p> </p>

<p>    // 검색어를 구분자로 나눈다. 여기서는 공백</p>

<p>    $s = array();</p>

<p>    $s = explode(" ", $search_text);</p>

<p> </p>

<p>    // 검색필드를 구분자로 나눈다. 여기서는 +</p>

<p>    $tmp = array();</p>

<p>    $tmp = explode(",", trim($search_field));</p>

<p>    $field = explode("||", $tmp[0]);</p>

<p>    $not_comment = "";</p>

<p>    if (!empty($tmp[1]))</p>

<p>        $not_comment = $tmp[1];</p>

<p> </p>

<p>    $str .= "(";</p>

<p>    for ($i=0; $i<count($s); $i++) {</p>

<p>        // 검색어</p>

<p>        $search_str = trim($s[$i]);</p>

<p>        if ($search_str == "") continue;</p>

<p> </p>

<p>        // 인기검색어</p>

<p>        insert_popular($field, $search_str);</p>

<p> </p>

<p>        $str .= $op1;</p>

<p>        $str .= "(";</p>

<p> </p>

<p>$op2 = "";</p>

<p>        for ($k=0; $k<count($field); $k++) { // 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...)</p>

<p> </p>

<p>            // SQL Injection 방지</p>

<p>            // 필드값에 a-z A-Z 0-9 _ , | 이외의 값이 있다면 검색필드를 wr_subject 로 설정한다.</p>

<p>            $field[$k] = preg_match("/^[\w\,\|]+$/", $field[$k]) ? strtolower($field[$k]) : "wr_subject";</p>

<p> </p>

<p>            $str .= $op2;</p>

<p>            switch ($field[$k]) {</p>

<p>                case "mb_id" :</p>

<p>                case "wr_name" :</p>

<p>                    $str .= " $field[$k] = '$s[$i]' ";</p>

<p>                    break;</p>

<p>                case "wr_hit" :</p>

<p>                case "wr_good" :</p>

<p>                case "wr_nogood" :</p>

<p>                    $str .= " $field[$k] >= '$s[$i]' ";</p>

<p>                    break;</p>

<p>                // 번호는 해당 검색어에 -1 을 곱함</p>

<p>                case "wr_num" :</p>

<p>                    $str .= "$field[$k] = ".((-1)*$s[$i]);</p>

<p>                    break;</p>

<p>                case "wr_ip" :</p>

<p>                case "wr_password" :</p>

<p>                    $str .= "1=0"; // 항상 거짓</p>

<p>                    break;</p>

<p>                // LIKE 보다 INSTR 속도가 빠름</p>

<p>                default :</p>

<p>                    if (preg_match("/[a-zA-Z]/", $search_str))</p>

<p>                        $str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))";</p>

<p>                    else</p>

<p>                        $str .= "INSTR($field[$k], '$search_str')";</p>

<p>                    break;</p>

<p>            }</p>

<p>            $op2 = $special; //신규 조건 대입. 없다면 기존처럼 or로 대입됨.</p>

<p>        }</p>

<p>        $str .= ")";</p>

<p> </p>

<p>        $op1 = " $search_operator ";</p>

<p>    }</p>

<p>    $str .= " ) ";</p>

<p>    if ($not_comment)</p>

<p>        $str .= " and wr_is_comment = '0' ";</p>

<p> </p>

<p>    return $str;</p>

<p>}</p>

<p>

 

2. bbs/list.php 파일을 수정합니다.

get_sql_search 함수로 넘겨주는 부분에 special 이란 파라메터가 있다면 대입해줄겁니다.

해당 파일을 여시고 get_sql_search 로 검색하시면 해당 부분을 아래와같이 수정합니다.

 

</p>

<p>//41번 라인 쯤?</p>

<p>    $sql_search = get_sql_search($sca, $sfl, $stx, $sop,$special);</p>

<p>

 

 

그리고 호출을 다음과같이 하면 원하는 결과가 나올것같습니다.

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개

나에요나냐
3년 전
와우.... 정성 추
s
smltree
3년 전
우와~~ 감사드립니다~
솜결
3년 전
한수 배우고 갑니다.

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

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

로그인