그누보드5 search.php에서 계시판 쿼리 만들어내는 부분은 어딘가요?

그누보드5 search.php에서 계시판 쿼리 만들어내는 부분은 어딘가요?

QA

그누보드5 search.php에서 계시판 쿼리 만들어내는 부분은 어딘가요?

본문

/list.php는 해당 계시판의 검색창 search.php는 전체 검색창의 검색기능으로 알고 있는데

실제 쿼리를 만들어내는 lib/common.lib.php 파일의 get_sql_search() 함수는 list.php에서만 사용하고

search.php에서는 사용을 안하나 바요.

search.php에서 아래부분이 호출될 당시의 bo_table은 어떻게 가져와야 하는지요?

fulltext공부를 하다보니 bo_table에 따라 쿼리를 달리 만들어야 할거 같아서요.

일단 $bo_table에는 값이 없는거 같네요.

 

    $str = '(';
    for ($i=0; $i<count($s); $i++) {
        if (trim($s[$i]) == '') continue;

        $search_str = $s[$i];

        // 인기검색어
        insert_popular($field, $search_str);

        $str .= $op1;
        $str .= "(";

        $op2 = '';
        // 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...)
        for ($k=0; $k<count($field); $k++) {
            $str .= $op2;
            switch ($field[$k]) {
                case 'mb_id' :
                case 'wr_name' :
 

이 질문에 댓글 쓰기 :

답변 3

검색부분에 적용 하실 정확한 조건들이 어떻게 되나요?

말씀하신 것을 토대로 한다면 약간 변수를 확장해서 처리 가능한듯 한데요

큰 분기조건이 2가지 정도라면 $sql_search / $sql_search2 로 확장 하시고 원본은 건드리지 않코 

$sql_search2만 확장 해서 처리 가능 해 보입니다.

적요은 


$sql = " select wr_id from {$tmp_write_table} where {$sql_search} ";

해당 부분만 확장처리 하면 되겠네요

// 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...)
            for ($k=0; $k<count($field); $k++) {
                $str .= $op2;
                switch ($field[$k]) {
                    case 'mb_id' :
                    case 'wr_name' :
                        $str .= "$field[$k] = '$s[$i]'";
                        break;
                    case 'wr_subject' :
                    case 'wr_2' :
                        $_search_str = '"'.$search_str.'*"';
                        if($bo_table=="free" or $bo_table=="note" or $bo_table=="vote")
                                    $str1 = str." MATCH($field[$k]) AGAINST('$_search_str')";
                            else
                                    $str2 = str." INSTR(LOWER($field[$k]), LOWER('$search_str'))";
                        break;
                    default :
                        $str .= "1=0"; // 항상 거짓
                        break;
            }

사실은 이렇게 간단히 $bo_table 에 따라 2가지로만 하면 되는데 결국
조건문 2개를 만들어놓고 각 테이블마다 사용할 조건문 자체 혹은 변수명을 넣어놓고 처리 하는수 밖에 없네요

search.php 파일 33번째~55번째줄 확인해보세요

해당 부분에서 $g5_search['tables'] 로 변수처리 하네요

테이블 별 처리 원하시면 해당 변수로 처리하시면 됩니다

네 KAIKAI 님 일단 성의에 감사드립니다.
search.php는 전체 검색이니 예를들어 30개의 계시판중 전체검색에 관리자가 포함시켜놓은 계시판이 15개라면 15개 테이블명에 대한 리스트가.. $g5_search['tables']라는 배열에 하단에 보면 집에넣는거 같네요.  그럼 하단에    for ($i=0; $i<count($s); $i++) {
 이부분에서 $sql_search 라는 조건문을 bo_table명과는 상관없이 만들어 내고 있는데  이 조건문 만드는 부분을 
 for ($i=0; $i<count($g5_search['tables']); $i++) {
이문장 안으로 옮겨 각 테이블마다 서로다른 조건문을 만들어 g5_search['condition'][] 이라는 배열에 집어넣고... 테이블에따라 wr_subject에 wr_content혹은 wr_2참조가 틀리고 또는 INSTR로 검색할지 MATCH AGAINST 로 검색할지를 결정하고

for ($idx=$table_index; $idx<count($search_table); $idx++) {
}
이분이 출력부분 같은데 여기서 실제 쿼리를 만들어내어 출력해야 한다면 너무많은 소스를 수정해야해서 다른 좋은 방법이 있으면 부탁하겠습니다.
감사합니다.

kaiki님 감사해요 덕분에 조금 간단하고 정리가 됬어요.

 

for($i-0; $i<count($g5_search['tables']); $i++) {
     // iam add modify

    if( $g5_search['tables'][$i]=='free'||$g5_search['tables'][$i]=='note'||$g5_search['tables'][$i]=='vote')
         $sql = " select count(wr_id) as cnt from {$tmp_write_table} where {$sql_search2} ";

    else

        $sql = " select count(wr_id) as cnt from {$tmp_write_table} where {$sql_search} ";

 
    $result = sql_fetch($sql, false);
    $row['cnt'] = (int)$result['cnt'];

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

회원로그인

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