그누보드 검색버그. 정보
그누보드 검색버그.
본문
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;
}
해결책좀 알려 주시면 감사하겠습니다.
댓글 전체
======= 방법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 ";
==============================================