[Naver Blog 2004/06/12 03:41] 자유롭게 검색할 수 있도록 폼에서 쿼리문 추출하기

// 검색을 위해 입력된 폼에서 쿼리문을 만들어내는 함수
function combiQuery($tablename, $attributes, $order) { // table name으로 인자를 받는다.
global $HTTP_POST_VARS; // POST 연관배열을 전역변수로 선언하고
for($i = 0; $i < count($HTTP_POST_VARS); $i++) { // count를 계산
if(current($HTTP_POST_VARS)) $formcount++;
next($HTTP_POST_VARS);
}
reset($HTTP_POST_VARS); // 배열 포인터를 처음으로 돌림

if($formcount != 0) { // 입력된 폼이 하나 이상일 때
$query = "select ".$attributes." from ".$tablename." where"; // 쿼리문에 where 절 삽입

for($i = 0; $i < count($HTTP_POST_VARS); $i++) { // 폼의 최대값만큼 루프를 돌며
if(current($HTTP_POST_VARS)) { // POST 연관배열에 값이 있을 때
$query .= " ".key($HTTP_POST_VARS)." like '%".current($HTTP_POST_VARS)."%'"; // 쿼리문에 like 조건 절 삽입
$formcount--; // n개의 조건이면 n-1만큼 and 절 삽입
if($formcount != 0) $query .= " and"; // n개의 조건이면 n-1만큼 and 절 삽입
next($HTTP_POST_VARS); // POST 연관배열의 다음 값.. 계속해서 연관배열의 값을 조사하여 루프
}
else next($HTTP_POST_VARS); // 연관배열의 현재 참조시 값이 없으면 다시 루프
}
$query .= " order by ".$order;
}
else $query = "select ".$attributes." from ".$tablename." order by ".$order; // 폼에 값이 없을 때 기본 쿼리문

return $query; // 계산된 쿼리문 리턴
}

-----------------------------------------------

그러니까 method가 post로 넘어온 폼은 $HTTP_POST_VARS에 저장된는데 이것을 처리해서 쿼리를 만들어내는 함수이다.

폼에 여러 개의 textbox가 있을 때 or로 검색 가능하게 하는 것이지.

문제는 textbox에 아무것도 들어있지 않아도 완전한 null이 아니라는 것이다.

(그래서 count()를 해 보면 textbox나 기타 폼의 숫자만큼 count된다. 따라서 그만큼 루프.)

따라서 새로운 배열에 복사하는데 값이 ""(just like null ^^)가 아닐 때 current()를 사용하여 값을 복사.

복사한 배열의 index가 0일 때는 where절이 붙지 않고

index가 n 일 때 n-1 만큼의 and 절이 붙는다.

그래서 formcount를 계산하여 formcount가 n-1만큼 and절을 삽입한다.

이것이 이 함수의 비법이다.

^^v

댓글 없음:

댓글 쓰기