()와 and, or 등의 검색식을 지원하는 검색엔진 함수

navyism
http://navyism.com

예전에 n@search라는 로컬검색엔진에 넣기 위해
만들어 두었던 검색기의 쿼리생성 함수 입니다.

호출은 아래와 같이 해주시면 됩니다.

$array = make_where (A, B, C, D)

A : 검색어의 공백을 대체할 연산자 (and | or)
B : 검색 할 컬럼 이름 (,으로 연결)
C : 검색어
D : 검색어/부정어 선택 (1 : 부정어, 0 : 검색어)

리턴되는 $array라는 배열에는 다음과 같은 값이 저장됩니다.

$array[where] : Where절의 내용
$array[word] : 검색에 사용된 검색어 (공백으로 연결)

예)
$result = make_where (“and”, “name,title”, “사과 포도”, 0); // 호출
echo “$result[where]
$result[word]”; // 결과출력

결과)
( name like ‘%사과%’ or title like ‘%사과%’) and ( name like ‘%포도%’ or title like ‘%포도%’)
사과 포도

검색식은 “(사과 and 포도) or 바나나” 와 같이 사용 하실 수도 있습니다.
그리고 바로 where절에 포함하기 때문에 Mysql에서 지원하는 _ 와 %도 가능 하겠죠~

그저그런 소스지만…검색부분 작업하실때 유용한 자료가 되시기를…^^;;

/*

*** 검색을 위한 SQL구문의 Where절 생성 함수

*** by navyism
*** http://navyism.com
*** 2003.7.7

$array = make_where (A, B, C, D)

A : 검색어의 공백을 대체할 연산자 (and | or)
B : 검색 할 컬럼 이름 (,으로 연결)
C : 검색어
D : 검색어/부정어 선택 (1 : 부정어, 0 : 검색어)

-> return
$array[where] : Where절의 내용
$array[word] : 검색에 사용된 검색어 (공백으로 연결)

*/

function make_where ($blank_is, $column_list, $word, $ban)
{
global $word_list;

if($ban)
{
$like = “NOT LIKE”;
$join = “AND”;
}
else
{
$like = “LIKE”;
$join = “OR”;
}

$word = stripslashes($word);
$temp = eregi_replace(“(“)(.*)( +)(.*)(“)”,”\2[###blank###]\4″,$word);
$temp = eregi_replace(“(|)| and | or “,” \0 “,$temp);
$temp = trim(eregi_replace(” {2,}”,” “,$temp));
$result[word] = eregi_replace(“(|)| and | or “,” “,$temp);
$temp = explode(” “,$temp);

for($i=0; $i {
if($i)
{
if(eregi(“^)$”,$temp[$i-1]) && !eregi(“^or$|^and$”,$temp[$i]))
{
$temp2[] = $blank_is;
}

if(!eregi(“^((|)|and|or)$”,$temp[$i-1]) && eregi(“^($”,$temp[$i]))
{
$temp2[] = $blank_is;
}

if(!eregi(“^((|)|and|or)$”,$temp[$i-1]) && !eregi(“^((|)|and|or)$”,$temp[$i]))
{
$temp2[] = $blank_is;
}
}

$temp2[] = $temp[$i];
}

for($i=0; $i {
if(eregi(“^((|)|and|or)$”,$temp2[$i]))
{
continue;
}

unset($temp);
$temp .= “(“;
$temp2[$i] = addslashes($temp2[$i]);
$column_list_array =explode(“,”,$column_list);

for($j=0; $j {
if($j && $temp && $temp!=”(“)
{
$temp .= ” $join”;
}

$temp .= ” $column_list_array[$j] $like ‘%$temp2[$i]%'”;

}

$temp .= “)”;
$temp2[$i] = $temp;
}

$temp = implode(” “,$temp2);
$result[where] = str_replace(“[###blank###]”,” “,$temp);

return $result;
}
?>

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다