각 국가별 우편번호 검색을 통합하여 일괄적으로 사용하기. 국가별로 공통적인 부분을 통합해서 배열로 정의해 놓습니다. 다른 국가 또는 다른 DB를 사용할 경우 DB에 맞게 선언된 배열을 수정합니다.
이 코드는 기본적으로 PHP 배열을 이용해서 만들어져 있으므로, DB를 이용할 경우 배열 부분을 수정해서 사용하시면 됩니다.
이 소스는 상업적인 용도로 사용되지 않는 한 자유롭게 수정/배포 가능합니다. 또한 원제작자 표시는 하지 않아도 됩니다.
* 기본 설명 - 국가별 설정에 따라 각 테이블에서 우편번호 또는 주소로 검색합니다. - PHP에서 변수만 설정해 주면 프로그래밍 코드는 따로 손대지 않아도 적용가능합니다. - 단, 테스트 해보지 않은 다른 국가들 우편번호의 경우 제한적일 수 있습니다. - 쿼리시 옵션을 넣을 경우 소스 중간에 있는 $query 변수 뒷부분에 적어주세요. - 버그가 있을 수 있으니 충분히 테스트 후 적용해주세요.
※ 주의!! - 모든 폼의 필드명이나 DB의 필드명은 '대소문자 구분'하여 입력해야 합니다. - 또한 사용되는 필드명들은 흔하지 않은 이름으로 변경하시기 바랍니다. (흔한 이름 사용시 str_replace 함수에서 잘못된 결과가 나올 수 있음, 특히 영어권 주소 다룰때)
* 상세 설명 - HTML 폼 작성시 필드 설정 -필드- | -필드명- | -설명- 국가 | Form_Contury | 검색하고자 하는 국가 검색대상 | Form_SearchType | 검색하고자 하는 필드 (우편번호 또는 주소) 검색어 | Form_SearchText | 검색대상에 따라 처리가 달라지지만, | | '우편번호'나 '주소'를 입력 추가 입력값 | 사용자 지정 | 각 국가마다 따로 입력해야 하는 값이 있는 경우
* 테이블 배열 설명 - 이 배열을 각 우편번호 테이블에 맞게 설정하세요. - 테이블 구조는 특히 따로 변경해야할 부분은 없습니다. - 필드명이 흔한 이름일 경우 머릿말을 붙인다던가 하는 식으로 고유 필드명으로 변경해 주십시오. - 단, 테이블명은 하나의 형식으로 통일해야 합니다. (기본 머릿말: 'ZipCode_') 예) ZipCode_KR , ZipCode_CH , ZipCode_JP , ZipCode_US - 국가별 코드는 마음대로 정해도 상관없지만 아래에서 설정하는 배열의 '키'값과는 일치해야 합니다.
[입력 받을 폼의 필드들] - HTML 폼 필드명 입력 - 이콜('=')은 기본으로 적용되는 것이니 지우지 마세요. (맨앞에 위치)
[우편번호로 검색시] - 기본형식: DB필드명 = 'HTML폼 필드명%' - 따옴표(')는 문자일 경우 넣고, 숫자일 경우는 뺍니다. - 또한 %는 SQL에서 *와 같은 역할의 특수문자로 넣거나 빼서 검색시 활용할 수 있습니다. 예) 주소로 검색시 '동작%' 를 하면 '동작구', '동작동', '동작면'등이 검색됩니다. - OR 는 둘중 하나만 맞을 경우에 검색되고, AND 는 둘다 모두 맞아야 검색 됩니다.
[주소로 검색시] - 설명은 위와 같습니다.
[나라별로 특정값에 따라 출력이 다를 경우] - HTML 폼 필드명 입력 - 예를들어 중국처럼 검색시 옵션 필드가 필요할때, 이 옵션 필드의 필드명을 적어주면 됩니다. 예) HTML폼에서 : <select option="Form_IsCapital"> ...생략... PHP에서 : 'OPTION_FIELD' => 'Form_IsCapital',
[출력 양식] - DB 필드명 입력 - DB 필드명대로 해당 문자열이 주소 값으로 변환됩니다. - 따라서 DB 필드명의 대/소문자에 맞게 정확히 적어야 합니다. - XML 로 출력시 예) <tag>필드명1 필드명2 ...</tag>... - HTML 로 출력시 예) <option value="필드명1 필드명2 ...">필드명1 필드명2 ...</option> - 한국처럼 번지수에 '-' 가 들어가는 경우, 없는 주소도 있으므로 (( 와 ))로 감싸줍니다.
[템플릿] - XML 이나 HTML 로 출력시 필요한 테그들이 있을 경우 - [OUTPUT] 고정된 문자열로, 반드시 들어가야 합니다 - 이 변수가 불필요할 경우 PHP 코드 끝 부분에 처리 루틴을 손봐주시면 됩니다. - 작성 예제: <?xml>[OUTPUT]</xml> 또는 <select>[OUTPUT]</select>
);
소스코드
[code]<?php /*** ** ** National ZipCode ** ** @ 카이 : http://kai.ibbun.net ** ** 기본 설명: ** - 국가별 설정에 따라 각 테이블에서 우편번호 또는 주소로 검색합니다. ** - PHP에서 변수만 설정해 주면 프로그래밍 코드는 따로 손대지 않아도 적용가능합니다. ** - 단, 테스트 해보지 않은 다른 국가들 우편번호의 경우 제한적일 수 있습니다. ** - 쿼리시 옵션을 넣을 경우 소스 중간에 있는 $query 변수 뒷부분에 적어주세요. ** - 버그가 있을 수 있으니 충분히 테스트 후 적용해주세요. ** **** */ $DbTableDefine = Array( 'KR' => Array( 'FORM_FIELDS' =>Array('=', 'Form_SearchText'),
'ZIPCODE' =>"ZIPCODE = 'Form_SearchText%'", 'ADDRESS' =>"DONG = 'Form_SearchText%' OR RI = 'Form_SearchText%'",
$country = trim($_REQUEST['Form_Country']); // 국가 $search_type = trim($_REQUEST['Form_SearchType']); // 검색 대상: 대소문자 정확히 입력해야합니다(모두 대문자로)
$_table_define = $DbTableDefine[$country]; // 각 국가에 따른 배열값 $_table_name = 'ZipCode_'. $country; // 각 국가에 따른 테이블명 + 국가코드 = ZipCode_KR $_magic_quotes = get_magic_quotes_gpc();
if (empty($country) || empty($search_type)) { echo '검색 대상이 선택되지 않았습니다.'; // exit; // 또는 뒤로 가기
} else { $aFormValues = Array(); foreach ($_table_define['FORM_FIELDS'] as $_v) { // 선언된 필드값 검사 if ($_v === '=') { // = 를 LIKE 로 변경하기 위해 $aFormValues[] = ' LIKE '; }
$aFormValues[$_v] = @trim($_REQUEST[$_v]); if (!empty($aFormValues[$_v])) { // 값이 비어있는지 검사 if ($_magic_quotes) { $aFormValues[$_v] = stripslashes(str_replace("\\", "\\\\", $aFormValues[$_v])); } if (!is_numeric($aFormValues[$_v])) { $aFormValues[$_v] = mysql_escape_string($aFormValues[$_v]); }
} else { // 값이 비어있으면 멈춤 break; } } }
if (empty($aFormValues[count($aReplaces) -1])) { // 입력값 검사 echo '검색어를 입력해주세요.'; // 오류 메시지 확장은 안하겠습니다.
} else { // 입력이 정상적이라면 DB에서 검색 및 출력 //$dbconnect = @mysql_connect(IP, User, Password) or die(mysql_error()); //@mysql_select_db('데이터베이스 이름', $dbconnect) or die(mysql_error()); //@mysql_query("SET NAMES 'utf8'", $dbconnect) or die(mysql_error());
$aAddress = Array(); $query = "SELECT * FROM {$_table_name} WHERE " .str_replace($_table_define['FORM_FIELDS'], $aFormValues, $_table_define[$search_type]) .' ' .";"; // 기타 옵션: LIMIT 이나, 정렬 등... //$result = @mysql_query($query, $dbconnect) or die(mysql_error());
/* 특정 필드에 따라 결과 출력이 달라질 경우. 쿼리 결과값에 따라 출력이 달라지기 때문에 while 문 안에서 비교하지 않고, 약간의 성능을 위해(사실 그리 차이는...;) while 밖에서 비교하도록 while 문을 두개로 했습니다. */ if (is_array($_table_define['OUTPUT'])) { while ($aResult = @mysql_fetch_assoc($result)) { // 쿼리 내용을 결과값으로 리턴 $_k =&$aResult[$_table_define['OPTION_FIELD']]; $aAddress[] = trim(str_replace(array_keys($aResult), $aResult, $_table_define['OUTPUT'][$_k])); } } else { while ($aResult = @mysql_fetch_assoc($result)) { // 쿼리 내용을 결과값으로 리턴 $aAddress[] = trim(str_replace(array_keys($aResult), $aResult, $_table_define['OUTPUT'])); } }
/* 출력 부분. - XML 이나 HTLM 코드로 출력시 이대로 사용하면 되고, 이외에 따로 함수를 사용할경우는 따로 코드를 적어서 사용하시면 됩니다. - DB에서 가져온 주소는 $aAddress 변수에 배열로 저장되어 있습니다. - '((', '-))'는 번지가 없는 주소에서 번지수에 들어가는 '-'를 제거하기 위한 것입니다. */ $output = implode("\n", $aAddress); echo str_replace(Array(' ((', '((', '-))', '[OUTPUT]'), Array('', '', '', $output), $_table_define['TEMPLATE']); // print base64_encode(serialize($aAddress)); // 일반 함수로 출력시 exit; } ?> <form name="Form_ZipCode" method="GET"> 국가: <select name="Form_Country"> <option value="KR">한국</option> <option value="CH">중국</option> <option value="JP">일본</option> </select>