답변 2개
</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개
댓글을 작성하려면 로그인이 필요합니다.
참고로 그누보드 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개
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인