그누보드, get_sql_search() 변형 – Exact 검색 > php

본문 바로가기
사이트 내 전체검색

php

그누보드, get_sql_search() 변형 – Exact 검색

페이지 정보

작성자 서방님 댓글 0건 조회 201회 작성일 15-08-13 15:21

본문

그누보드 게시판내 검색을 담당하는 함수인 get_sql_search()는 검색 대상 필드에 따라서 이미 정해진 규칙에 따라서 검색 방법을 결정합니다. ( lib/common.lib.php line 575-600)

        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;
        }

mb_id와 wr_name은 exact match를, wr_hitwr_goodwr_nogood은 숫자 정보이기에 검색어(숫자) 보다 크거나 같은 경우 비교로, wr_num은 (사용자가 사용하는 경우는 거의 없지만) 검색어의 음수로 비교, wr_ip와 wr_password는 검색을 불가하게 하고, 나머지 검색 필드들은 INSTR 함수로 처리합니다.

이 나머지 검색 필드들에 해당하는 대표적인 경우가 제목(wr_subject)과 내용(wr_content)이며, 이들에 대해서는 당연히 INSTR을 통한 일부 검색을 하는 것이 맞습니다.

하지만 가끔 여분필드 (wr_1 ~ wr_10)를 특정 정보로 사용하는 경우, 검색시에 exact match를 했으면 할때가 있습니다. 예를 들어 wr_1에 음식재료명을 넣어둔다면 ‘고추’와 ‘고추장’에 대해서 ‘고추’로 검색하게 되면 두 경우 모두 검색되는데, 전체 필드가 같은 경우만 검색했으면 하는 것이죠.

만일 exact match를 원하는 경우라면, 다음 처럼 $exact 변수를 하나 더 사용하여default 경우에 판단을 하게 하는 것입니다.

function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator='and', $exact='')
....
            default :
                if ($exact) // exact match
                    $str .= " $field[$k] = '$s[$i]' ";
                elseif (preg_match("/[a-zA-Z]/", $search_str))
                    $str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))";
                else
                    $str .= "INSTR($field[$k], '$search_str')";
                break;
        }

물론 이에 해당하는 (GET 방법을 이용한) (wr_1가 ‘고추’인지 검색하는) 검색 링크는

http://domain.com/bbs/board.php?bo_table=TABLE&sfl=wr_1&stx=고추&exact=1

와 같이 exact 값을 넘겨야 겠죠.

댓글목록

등록된 댓글이 없습니다.

Total 612건 19 페이지
게시물 검색

회원로그인

접속자집계

오늘
82
어제
163
최대
1,347
전체
154,616
Latest Crypto Fear & Greed Index

그누보드5
Copyright © 서방님.kr All rights reserved.