그누보드 검색버그. > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

그누보드 검색버그. 정보

그누보드 검색버그.

본문

select distinct wr_parent from g4_write_community01 where ((INSTR(LOWER(wr_subject), LOWER('as'))) ) and (wr_num between '-14' and '9986')
select distinct wr_parent from g4_write_community01 where ca_name = '장소' and (wr_num between '-14' and '9986')

일단, 위 두개의 query 는 공백이 들어가지 않은 상태의 검색입니다.

아래의 query 는 공백이 들어간 쿼리고요.
select distinct wr_parent from g4_write_community01 where and (wr_num between '-14' and '9986')

검색폼에서 유효성 검사를 하지만 카테고리 검색을 할 수 있도록 하기위해 검색어 없이도 검색되게해놨습니다.

공백을 넣고 검색할때 아래와 같이 오류가 나네요.

1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'and (wr_num between '-14' and '9986')' at line 1

error file : /board/board.php


// 분류 선택 또는 검색어가 있다면
if ($sca || $stx)
{
    $sql_search = get_sql_search($sca, $sfl, $stx, $sop);

    // 가장 작은 번호를 얻어서 변수에 저장 (하단의 페이징에서 사용)
    $sql = " select MIN(wr_num) as min_wr_num from $write_table ";
    $row = sql_fetch($sql);
    $min_spt = $row[min_wr_num];

    if (!$spt) $spt = $min_spt;

    $sql_search .= " and (wr_num between '".$spt."' and '".($spt + $config[cf_search_part])."') ";

    // 원글만 얻는다. (코멘트의 내용도 검색하기 위함)
    $sql = " select distinct wr_parent from $write_table where $sql_search ";
  echo $sql;
    $result = sql_query($sql);
    $total_count = mysql_num_rows($result);
}

//function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator=false)
function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator='and')
{
    global $g4;

    $str = "";
    if ($search_ca_name)
        $str = " ca_name = '$search_ca_name' ";

    $search_text = trim($search_text);

    if (!$search_text)
        return $str;

    if ($str)
        $str .= " and ";

    // 쿼리의 속도를 높이기 위하여 ( ) 는 최소화 한다.
    $op1 = "";

    // 검색어를 구분자로 나눈다. 여기서는 공백
    $s = array();
    $s = explode(" ", $search_text);

    // 검색필드를 구분자로 나눈다. 여기서는 +
    //$field = array();
    //$field = explode("||", trim($search_field));
    $tmp = array();
    $tmp = explode(",", trim($search_field));
    $field = explode("||", $tmp[0]);
    $not_comment = $tmp[1];

    $str .= "(";
    for ($i=0; $i<count($s); $i++) {
        // 검색어
        $search_str = trim($s[$i]);
        if ($search_str == "") continue;

        // 인기검색어
        $sql = " insert into $g4[popular_table] set pp_word = '$search_str', pp_date = '$g4[time_ymd]', pp_ip = '$_SERVER[REMOTE_ADDR]' ";
        sql_query($sql, FALSE);

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

        $op2 = "";
        for ($k=0; $k<count($field); $k++) { // 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...)
            $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;
                // 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 = " or ";
        }
        $str .= ")";

        //$op1 = ($search_operator) ? ' and ' : ' or ';
        $op1 = " $search_operator ";
    }
    $str .= " ) ";
    if ($not_comment)
        $str .= " and wr_is_comment = '0' ";

    return $str;
}


해결책좀 알려 주시면 감사하겠습니다.

  • 복사

댓글 전체

이런 방법 어떠신지... 2가지 방법 중 편한 걸로 하시면 되겠네요.

======= 방법1. 수정 전 ========================
 $search_text = trim($search_text);

    if (!$search_text)
        return $str;
==============================================

======= 방법1. 수정 후 ========================
 $search_text = trim($search_text);

    if (!$search_text)
        return "1";
==============================================


======= 방법2. 수정 전 ========================
// 원글만 얻는다. (코멘트의 내용도 검색하기 위함)
    $sql = " select distinct wr_parent from $write_table where $sql_search ";
==============================================

======= 방법2. 수정 후 ========================
// 원글만 얻는다. (코멘트의 내용도 검색하기 위함)
    $sql = " select distinct wr_parent from $write_table where 1 $sql_search ";
==============================================
© SIRSOFT
현재 페이지 제일 처음으로