 |  |
|
난이도 : 초급 Deepak Vohra, Web Developer, Independent
2007 년 6 월 12 일 PHP는 웹 애플리케이션을 개발하는데 일반적으로 사용되는 스크립팅 언어입니다. Asynchronous JavaScript and XML (Ajax)은 JavaScript, Document Object Model (DOM), XMLHttpRequest 기술을 결합하여 클라이언트와 서버 간 동적인 상호 작동을 제공하는 웹 기술입니다. 다양한 PHP 클래스 라이브러리들은 PHP에서 Ajax를 사용할 때 활용할 수 있습니다. 무엇보다도 Xajax는 오픈 소스, 객체 지향의 PHP 클래스 라이브러리 입니다. 이 글에서, PHP, Ajax, Xajax를 사용하여 IBM® DB2® 9 for Linux®, UNIX®, Windows®에 액세스 하는 동적인 웹 애플리케이션 솔루션을 개발하는 방법을 배워봅시다.
머리말
40% 이상의 웹 애플리케이션들이 스크립팅 언어로 PHP를 사용하고 있다. Asynchronous JavaScript and XML (Ajax)은 JavaScript, Document Object Model (DOM), XMLHttpRequest 기술들을 결합하여 클라이언트와 서버 간 동적인 상호 작동을 제공하는 웹 기술이다. 다양한 PHP 클래스 라이브러리들은 PHP에서 Ajax를 사용할 때 활용할 수 있다. Xajax는 오픈 소스, 객체 지향의 PHP 클래스로서 PHP에서 Ajax와 함께 사용된다.
사용자가 웹 사이트에 등록하기 위해 폼을 채운다고 생각해 보자. 폼이 제출되기 전까지는 폼의 데이터 유효성은 검사되지 않는다. Ajax를 사용하여, 폼에 추가된 데이터는 서버 애플리케이션에서 비즈니스 로직을 사용하여 동적으로 유효성 검사가 수행된다. 따라서 폼에 있는 데이터가 유효한 것인지 여부를 검사하기 위해 완성된 폼이 서버에 게시 될 필요가 없다. 비동기성(Asynchronous)에는 XMLHttpRequest 객체의 send() 메소드가 HTTP 요청이 완료되지 않고도 즉시에 리턴되고, 요청을 초기화 했던 HTML/JavaScript 페이지의 프로세싱이 지속된다는 의미가 함축되어 있다. 결국, XMLHttpRequest 객체가 HTTP 응답을 비동기식으로 처리하기 때문에, XMLHttpRequest 요청을 초기화 하는 HTML/JavaScript 페이지가 계속 처리된다.
Xajax 개요
Xajax는 클라이언트 애플리케이션과 PHP 스크립트들로 구성된 서버 측 애플리케이션 간 비동기식으로 통신하는데 사용된다. Xajax는 클라이언트 애플리케이션으로부터 액세스 되는 서버 측의 PHP 함수들용 JavaScript 래퍼(wrapper) 함수들을 생성한다. 클라이언트 애플리케이션이 래퍼 함수를 호출할 때, XMLHttpRequest 객체는 초기화 되고 XMLHttpRequest HTTP 요청은 서버로 보내진다.
서버에서, xajax 객체는 XMLHttpRequest를 받고 JavaScript 래퍼 함수에 상응하는 PHP 함수들을 호출한다. Xajax를 통해 등록된 PHP 함수들의 기본 요청 유형은 POST이다. PHP 함수들은 xajax 객체에 의해 클라이언트 애플리케이션으로 리턴된 XML 응답을 리턴한다. XML 응답의 명령어에 기반하여, Xajax의 JavaScript 메시지는 클라이언트 인풋 페이지의 내용을 업데이트 한다. Xajax에는 데이터가 수정되었을 경우에만 업데이트 되도록 하는 기능이 있다.
여러분의 웹 애플리케이션 구현을 시작하려면 먼저 제품을 설치하고 데이터베이스를 생성해야 한다. 그리고 나서 애플리케이션 구현을 시작할 수 있다.
DB2 for Linux, UNIX, Windows 설치하기
DB2 데이터베이스용 PHP 확장은 DB2 for Linux, UNIX, Windows V8.2 또는 이후 버전에서 사용된다. 다음의 설치 과정은 DB2 Enterprise 9 for Windows에 해당한다.
- DB2 9 데이터 서버를 다운로드 한다. (참고자료) (본 예제에서는 DB2 Enterprise 9을 사용하지만, 다른 DB2 에디션을 사용해도 된다.)
- db2_v9_ese_win_32.zip을 디렉토리에 추출한다.
- C:\DB2\ESE\image\setup.exe 애플리케이션을 더블 클릭하여 DB2를 설치한다.
- IBM DB2 Setup Launchpad에서 Install a Product를 클릭한다.
- DB2 Enterprise Server 헤더에서 Install New를 클릭한다. DB2 Setup Wizard가 시작할 것이다. Next를 클릭한다.
- 라이센스 계약을 수락하고 Next를 클릭한다.
- Installation Type (Typical)을 선택하고 Next를 클릭한다.
- 설치 및 응답 파일 생성(기본)을 선택하고 Next를 클릭한다.
- 설치 폴더(C:\Program Files\IBM\SQLLIB\ 이 기본이다.)를 선택하고 Next를 클릭한다.
- 사용자 이름(db2)과 패스워드(db2admin)를 정하고 Next를 클릭한다.
- DB2 인스턴스
DB2가 기본 DB2 인스턴스로서 리스팅 된다. Configure 버튼을 클릭하여 기본 DB2 인스턴스에 대한 서비스 이름과 프로토콜을 설정할 수 있다. 기본 서비스 이름은 db2c_DB2이고, 기본 포트는 5000이다. Next를 클릭한다.
- Prepare the DB2 tools catalog frame에서 기본 설정을 선택하고 Next를 클릭한다.
- 필요할 경우 공지를 설정하고 Next를 클릭한다.
- Enable operating system security for DB2 objects에서 기본 설정을 선택하고 Next를 클릭한다.
-
Finish 버튼을 클릭하면 데이터베이스 서버 설치가 완료된다.
이제 샘플 데이터베이스를 만든다. 전제 조건으로, DB2INSTANCE 환경 변수를 DB2로 설정한다. System Properties > Advanced > Environment
Variables > System Variables를 선택한다. DB2 명령어 윈도우에서 다음과 같은 명령을 사용하여 DB2INSTANCE 환경 변수를 설정할 수도 있다.
샘플 데이터베이스를 만들려면, DB2 First Steps 프레임에서 Database Creation을 선택한다. Create SAMPLE Database 버튼을 클릭한다. 다음 명령어를 사용하여 샘플 데이터베이스를 생성할 수도 있다.
다음과 같은 DB2 명령어를 사용하여 DB2 database SAMPLE 을 ODBC 데이터 소스로 등록한다.
db2 catalog system odbc data source sample
|
PHP와 Xajax 설치하기
Xajax는 PHP 클래스 라이브러리이기 때문에 PHP 5를 다운로드 하여 설치한다. PHP 5는 수 많은 웹 서버들에 설치되어 있을 수 있다. 이 글에서는 Windows 기반 Apache 웹 서버에 PHP 5를 설정하는 것을 설명하겠다.
다음은 PHP를 설치 및 구성하는 단계이다.
- PHP 5.2.0을 다운로드 한다. (참고자료).
- PHP 압축 파일을 설치 디렉토리에 푼다. (예를 들어, C:/PHP)
- Apache HTTP Server 2.0을 다운로드 및 설치한다.
-
PATH 환경 시스템 변수에 PHP 5가 설치될 디렉토리를 추가한다. (C:/PHP)
- C:/PHP 디렉토리에 있는 php.init 권장 파일을 php.ini로 수정한다.
이 글에서 설명하는 예제 애플리케이션은 DB2 데이터베이스에서 데이터를 저장하고 페치(fetch)한다. PHP PDO 확장을 사용하여 DB2 데이터베이스로 연결한다.
php.ini 설정 파일에서, extension_dir = "./ext"를 설정하여 확장 디렉토리를 설정해야 한다. php.ini 파일의 다음 라인 앞에 있는 ';'를 제거하여 PDO 확장을 활성화 해야 한다.
PDO ODBC 드라이버 역시 활성화 되어야 한다. php.ini 파일에서, 다음 라인 앞에 ';'를 제거한다.
extension=php_pdo_odbc.dll
|
Apache HTTP 서버에 PHP 5를 설치한다. <Apache2>/conf/httpd.conf 파일에 다음을 추가한다.
# For PHP 5
LoadModule php5_module "C:/PHP/php5apache2.dll"
AddType application/x-httpd-php .php
# configure the path to php.ini
PHPIniDir "C:/PHP/" |
기본적으로, <Apache2> 디렉토리는 C:/Program Files/Apache Group/Apache2이다. 우리는 C:/Apache2/Apache2 디렉토리에 Apache2 서버를 설치했다. PHP 5가 C:/PHP외 다른 디렉토리에 설치되었다면 C:/PHP를 PHP 5가 설치된 디렉토리로 대체한다. httpd.conf 디렉토리를 서정한 후에 Apache 웹 서버를 재시작 한다. Apache 웹 서버에서 실행될 PHP 파일들을 C:/Apache2/Apache2/htdocs 디렉토리에 복사한다.
Xajax 0.2.4를 다운로드 한다. C:/Apache2/Apache2/htdocs 디렉토리에 xajax 디렉토리를 만든다. xajax_0.2.4.zip 파일을 xajax 디렉토리에 압축을 푼다.
DB2 데이터베이스 테이블 만들기
Xajax 애플리케이션은 DB2 데이터베이스 테이블에서 데이터를 가져온다. 이 데이터베이스 테이블은 PHP 스크립트를 사용하여 생성된다. PHP 스크립트, createTable.php를 만든다. 사용자 및 패스워드용 변수를 정의한다.
$user = 'db2';
$password = 'db2admin'; |
PDO 컨스트럭터를 사용하여 DB2 SAMPLE 데이터베이스에 대한 연결을 구축한다.
$connection = new PDO('odbc:SAMPLE', $user, $password);
|
기본적으로, PDO 컨스트럭터는 비 영속 연결을 만들어 낸다. PDO 컨스트럭터는 연결이 성공할 경우 DB2 데이터베이스 연결 리소스를 리턴한다. 연결이 성공하면 "Connection succeeded"라는 아웃풋 메시지가 읽힌다. 데이터베이스 연결이 실패하면, 연결 에러 메시지가 나타난다. SQL 문을 정의하여 테이블을 만든다.
$createtable = "CREATE TABLE DB2.Catalog(CatalogId VARCHAR(25),
Journal VARCHAR(25), Section Varchar(25), Edition
VARCHAR(25), Title Varchar(45), Author Varchar(25))"; |
exec() 함수를 사용하여 SQL 문을 실행한다.
$connection->exec($createtable);
|
테이블 행(row)을 추가하는 SQL 문을 정의한다.
$addrow = "INSERT INTO DB2.Catalog VALUES('catalog1', 'IBM developerWorks',
'XML', 'July 2006', 'The Java XPath API', 'Elliotte Harold')"; |
exec() 함수를 사용하여 SQL 문을 실행한다.
$result=$connection->exec($addrow);
|
데이터베이스 테이블 행이 추가된다. 추가된 행의 수를 나타내내는 메시지를 출력한다.
print("Added $result rows.\n");
|
마찬가지로, 또 다른 행을 데이터베이스 테이블 Catalog에 추가한다.
$addrow = "INSERT INTO DB2.Catalog VALUES('catalog2', 'IBM developerWorks',
'XML', 'October 2005', 'JAXP validation', 'Brett McLaughlin')";
$result=$connection->exec($addrow); |
PHP scriptcreateTable.php가 Listing 1에 나타나 있다. createTable.php를 C:/Apache2/Apache2/htdocs 디렉토리에 복사한다. 아직 Apache 웹 서버가 시작되지 않았다면 이를 시작한다. URL http://localhost/createTable.php로 브라우저에서 PHP 스크립트를 실행한다. 데이터베이스 테이블, DB2.Catalog가 생성되고 데이터가 테이블에 추가된다.
Listing 1. createTable.php
<?php
try {
$user = 'db2';
$password = 'db2admin';
$connection = new PDO('odbc:SAMPLE', $user, $password);
echo "Connection succeeded\n";
$createtable = "CREATE TABLE DB2.Catalog(CatalogId VARCHAR(25),
Journal VARCHAR(25), Section Varchar(25), Edition
VARCHAR(25), Title Varchar(45), Author Varchar(25))";
$connection->exec($createtable);
$addrow = "INSERT INTO DB2.Catalog VALUES('catalog1', 'IBM developerWorks',
'XML', 'July 2006', 'The Java XPath API',
'Elliotte Harold')";
$result=$connection->exec($addrow);
print("Added $result rows.\n");
$addrow = "INSERT INTO DB2.Catalog VALUES('catalog2', 'IBM developerWorks',
'XML', 'October 2005', 'JAXP validation',
'Brett McLaughlin')";
$result=$connection->exec($addrow);
} catch (PDOException $e) {
$e->getMessage();
}
?>
|
요청 보내기
이제 인풋 폼으로 구성된 예제 애플리케이션을 만들어 보자. 이 인풋 폼은 카탈로그 엔트리에서 데이터베이스 테이블 Catalog에 추가한다. 사용자가 인풋 필드 Catalog Id에 데이터를 입력하기 시작하면 XMLHttpRequest HTTP 요청은 서버로 보내져서 Catalog Id 값이 추가되었는지가 검사된다. Catalog Id가 아직 데이터베이스에 정의되지 않으면 "Catalog Id is Valid" 메시지가 디스플레이 된다. Catalog Id가 데이터베이스에 정의되어 있으면, "Catalog Id is not Valid"라는 메시지가 디스플레이 되고, Create Catalog 버튼이 비활성화 되고, Catalog Id용 필드 값이 폼에 추가된다.
xajax PHP 객체는 클라이언트 애플리케이션과 서버 간 매개 함수를 실행한다. 우선, xajax 클래스 라이브러리를 포함시킨다.
require('./xajax/xajax_0.2.4/xajax.inc.php');
|
xajax 객체를 만든다.
서버 측 프로세싱은 PHP 함수에 의해 수행된다. PHP 함수 validateCatalogId($formValues)와 updateCatalog($formValues)를 만든다. 이 두 개의 함수 모두 $formValues 매개변수를 취한다.
function validateCatalogId($formValues){}
function updateCatalog($formValues){}
|
registerFunction() 메소드를 사용하여 xajax 객체로 PHP 함수들을 등록한다. xajax 객체는 PHP 스크립트나 인풋 폼 이벤트 핸들러에서 호출되는 PHP 함수용 래퍼 함수들을 만든다.
$xajax->registerFunction("validateCatalogId");
$xajax->registerFunction("updateCatalog"); |
Xajax는 등록된 PHP 함수에 대해 비동기식 래퍼 함수를 만든다. 래퍼 함수 이름은 xajax_phpfunction 포맷을 따른다. phpfunction은 서버 측 PHP 함수로서, 이것에 대해 래퍼 함수가 정의된다. Xajax는 비동기식 폼 프로세싱에 getFormValues(string formId) 메소드를 제공한다. getFormValues() 메소드를 사용하여 폼 필드 값의 어레이가 xajax 비동기식 래퍼 함수에 대한 인자로서 제출된다. getFormValues(string formID ,boolean submitDisabledElements, string prefix]) 함수로 완전한 폼 대신 한 폼의 섹션들도 제출된다. prefix 매개변수는 그러한 접두사로 시작하는 폼 엘리먼트들만 제출되어야 한다는 것을 지정한다. Boolean 매개변수 submitDisabledElements는 금지된 엘리먼트의 제출 여부를 설정한다. PHP 함수 validateCatalogId와 updateCatalog는 폼 필드 값의 어레이에 대한 매개변수를 정의한다. XMLHttpRequest가 초기화 되기 전에 processRequests() 함수로 요청들을 핸들하도록 xajax 객체를 설정한다.
$xajax->processRequests();
|
또한 XML 응답이 서버에서 보내진 후에, 모든 필요한 JavaScript를 xajax가 생성하도록 인풋 폼의 <head></head> 태그에서 지정한다.
<?php $xajax->printJavascript('./xajax/xajax_0.2.4');
?> |
XMLHttpRequest는 클라이언트 애플리케이션에 의해서 초기화 된다. 예제 애플리케이션에서, XMLHttpRequest는 인풋 필드 catalogId에 있는 onkeyup 이벤트 핸들러에 의해 초기화 된다.
<tr><td>Catalog Id:</td><td><input type="text"
size="20"
id="catalogId"
name="catalogId"
autocomplete="off"
onkeyup="xajax_validateCatalogId(xajax.getFormValues
('validationForm'));"></td>
<td><div id="validationMessage"></div></td>
</tr>
|
인풋 필드는 매개변수로서 폼 필드 값의 어레이를 가진 래퍼 함수 xajax_validateCatalogId를 호출한다. 이 래퍼 함수는 XMLHttpRequest를 서버로 보낸다. xajax 객체는 XMLHttpRequest를 받고 이에 상응하는 PHP 함수 validateCatalogId($formValues)를 호출한다.
요청 처리하기
Xajax는 xajaxResponse 클래스를 제공하여 클라이언트 애플리케이션에 응답을 보낸다. validateCatalogId 함수에서, xajaxResponse 객체를 만든다.
$objResponse = new xajaxResponse();
|
validateCatalogId 함수는 인풋 폼에 추가 된 Catalog Id 값의 유효성 검사를 수행한다. $formValues 어레이에서, cataloged 필드의 값을 검색한다.
$catalogId=trim($formValues['catalogId']);
|
그런 다음, PHP PDO 확장을 사용하여 DB2 데이터베이스로 연결하고 Catalog 테이블 행이 인풋 폼에서 카탈로그 아이디 값 인풋에 대해 정의되었는지를 확인한다.
사용자와 패스워드에 대한 변수 정의:
$user = 'db2';
$password = 'db2admin'; |
PDO 컨스트럭터를 사용하여 DB2 데이터베이스로 연결한다.
$connection = new PDO('odbc:SAMPLE', $user, $password);
|
PDO 컨스트럭터는 연결이 성공할 때 DB2 데이터베이스 연결 리소스를 리턴한다. SQL 문을 준비하여 폼의 카탈로그 아이디 값 인풋에 대한 데이터 행을 선택한다. prepare ( string statement [, array driver_options] ) 함수를 사용하여 준비된 문을 컴파일 한다.
$stmt = $connection->prepare("SELECT * from DB2.CATALOG WHERE CATALOGID=?");
|
PDO::ATTR_CURSOR 애트리뷰트를 사용하여 스크롤 가능한 커서로 설정한다.
$stmt ->setAttribute(PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL);
|
bindParam() 메소드를 사용하여 CatalogId 매개변수를 바인딩 한다.
$stmt->bindParam(1, $catalogId);
|
준비된 문에서 execute (
[array input_parameters] ) 함수로 SQL 쿼리를 실행한다.
fetch ( [int fetch_style [, int
cursor_orientation [, int cursor_offset]]] ) 함수를 사용하여 결과 세트 행을 페치(fetch)한다.
fetch() 함수는 요청된 행이 존재할 경우 TRUE를, 요청된 행이 존재하지 않을 경우, FALSE를 리턴한다. fetch()가 FALSE를 리턴하면 결과 세트는 비어있고, 카탈로그 아이디 값에 대한 Catalog 테이블 행은 데이터베이스 테이블에 정의되지 않는다. 따라서 이 폼에 추가된 Catalog Id 필드 값은 유효하다. 다음에는, 클라이언트 애플리케이션으로 보내 질 응답을 만든다. 응답에는 한 개 이상의 명령어 메시지가 포함된다. 일반적으로 사용되는 명령어 메시지들 일부가 표 1에 나타나있다.
표 1. xajaxResponse 명령어 메시지
| 명령어 메시지 | 설명 |
|---|
| Assign | 인풋 페이지에 지정된 엘리먼트의 애트리뷰트를 addAssign 메소드(string elementId, string attribute, string data)로 설정한다. | | Append | addAppend(string elementId, string attribute, string data) 메소드를 사용하여 지정된 엘리먼트의 애트리뷰트에 데이터를 붙인다. | | Prepend | addPrepend(string elementId, string attribute, string data) 메소드를 사용하여 인풋 페이지의 지정된 엘리먼트의 애트리뷰트에 데이터를 Prepend 한다. | | Replace | addReplace(string elementId, string attribute, string replace, string data) 메소드로 인풋 페이지의 지정된 엘리먼트의 애트리뷰트에 데이터를 대체한다. | | Script | addScript(string javascript) 메소드로 지정된 JavaScript 코드를 실행한다. | | Alert | addAlert(string message) 메소드로 지정된 메시지를 담은 경고 박스를 디스플레이 한다. |
fetch() 메소드가 FALSE를 리턴하면, validationMessage div에 "Catalog Id is Valid" 메시지가 디스플레이 된다. addAssign 메소드는 validationMessage div의 innerHTML을 설정한다.
$objResponse->addAssign("validationMessage","innerHTML","Catalog Id is Valid");
|
fetch() 함수가 TRUE를 리턴하면, 카탈로그 아이디 값이 Catalog 테이블에 정의된다. 따라서 인풋 폼에 추가된 Catalog Id 값은 유효하지 않다. fetch() 메소드가 행을 리턴하면 validationMessage div의 innerHTML을 "Catalog Id is not Valid"로 설정한다.
$objResponse->addAssign("validationMessage","innerHTML","Catalog Id is not Valid");
|
그 다음에는 결과 세트 행에서 값을 가져와서 인풋 폼 필드에서 그 값을 설정한다. fetch() 함수는 다음 행에 대한 결과 세트 포인터를 설정한다.
$row[mixed
column] 함수를 사용하여 결과 세트 행에서 필드 값을 검색한다. column 매개변수는 컬럼 인덱스(0 기준) 또는 컬럼 이름으로 설정된다. 예를 들어, journal 컬럼 값은 다음 리스팅의 PHP 코드로 얻어진다.
$journal=$row['JOURNAL'];
|
addAssign 메소드로 인풋 폼 필드 엘리먼트의 value 애트리뷰트를 설정한다. 예를 들어, journal 엘리먼트의 value 애트리뷰트는 아래와 같이 설정된다.
$objResponse->addAssign("journal","value",$journal);
|
또한 제출 버튼을 동작 불가로 한다.
$objResponse->addAssign("submitForm","disabled",true); |
validateCatalogId 함수에서 $objResponse 객체를 XML 스트링으로 리턴한다.
return $objResponse->getXML();
|
XML 응답은 xajax 프로세서로 보내지는데, 이것은 XML 응답을 xajax의 JavaScript 메시지 펌프로 보낸다. 이 메시지 펌프는 XML 명령어를 파싱하고 인풋 페이지의 엘리먼트를 설정한다. 따라서, addAssign 메소드로 $xmlResponse 객체에 지정된 데이터는 인풋 폼에서 설정된다.
updateCatalog($formValues) 함수는 인풋 폼에서 데이터베이스 테이블 Catalog를 업데이트 하는데 사용된다. Catalog Id 필드 값이 유효하면, 새로운 카탈로그 엔트리가 이 폼의 다른 필드에 값을 추가함으로써 생성된다. Create Catalog 버튼을 클릭하여 폼을 제출한다. onsubmit 이벤트 핸들러는 xajax_updateCatalog 래퍼 함수를 호출하고, 이것은 XMLHttpRequest를 서버로 보낸다.
onsubmit="xajax_updateCatalog(xajax.getFormValues('validationForm'));"
|
xajax 객체는 XMLHttpRequest를 받고 상응하는 PHP 함수 updateCatalog($formValues)를 호출한다. updateCatalog 함수에서, 폼 필드 값을 검색하고 SQL 문을 만들어서 한 행을 데이터베이스 테이블 Catalog에 추가한다. 데이터베이스로 연결하고 SQL 문을 실행한다. input.php 스크립트가 Listing 2에 나타나 있다.
Listing 2. input.php
<?php require('./xajax/xajax_0.2.4/xajax.inc.php');
$xajax = new xajax();
$xajax->cleanBufferOn();
$xajax->registerFunction("validateCatalogId");
$xajax->registerFunction("updateCatalog");
function validateCatalogId($formValues){
$objResponse = new xajaxResponse();
$catalogId=trim($formValues['catalogId']);
$user = 'db2';
$password = 'db2admin';
$connection = new PDO('odbc:SAMPLE', $user, $password);
$stmt = $connection->prepare("SELECT * from DB2.CATALOG WHERE CATALOGID=?");
$stmt ->setAttribute(PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL);
$stmt->bindParam(1, $catalogId);
$stmt->execute();
$row = $stmt->fetch();
if(!$row){
$objResponse->addAssign("validationMessage","innerHTML","Catalog Id is Valid");
$objResponse->addAssign("submitForm","disabled",false);
$objResponse->addAssign("journal","value","");
$objResponse->addAssign("section","value","");
$objResponse->addAssign("edition","value","");
$objResponse->addAssign("title","value","");
$objResponse->addAssign("author","value","");
}
if($row){
$objResponse->addAssign("validationMessage","innerHTML",
"Catalog Id is not Valid");
$catalogId=$row['CATALOGID'];
$journal=$row['JOURNAL'];
$section=$row['SECTION'];
$edition=$row['EDITION'];
$title=$row['TITLE'];
$author=$row['AUTHOR'];
$objResponse->addAssign("journal","value",$journal);
$objResponse->addAssign("section","value",$section);
$objResponse->addAssign("edition","value",$edition);
$objResponse->addAssign("title","value",$title);
$objResponse->addAssign("author","value",$author);
$objResponse->addAssign("submitForm","disabled",true);
}
return $objResponse->getXML();
}
function updateCatalog($formValues){
$catalogId=trim($formValues['catalogId']);
$journal=trim($formValues['journal']);
$section=trim($formValues['section']);
$edition=trim($formValues['edition']);
$title=trim($formValues['title']);
$author=trim($formValues['author']);
$user = 'db2';
$password = 'db2admin';
$connection = new PDO('odbc:SAMPLE', $user, $password);
$sql = "INSERT INTO DB2.Catalog
VALUES('".$catalogId."','".$journal."','".$section."','".$edition."','".
$title."','".$author."')";
$r=$connection->exec($sql);
$connection->commit();
echo "Added $r rows.\n";
}
$xajax->processRequests();
?>
<head>
<?php $xajax->printJavascript('./xajax/xajax_0.2.4');
?>
</head>
<body>
<h1>Form to Create a Catalog Entry</h1>
<form id="validationForm" name="validationForm" onsubmit=
"xajax_updateCatalog(xajax.getFormValues('validationForm'));">
<table>
<tr><td>Catalog Id:</td><td><input type="text"
size="20"
id="catalogId"
name="catalogId"
autocomplete="off"
onkeyup="xajax_validateCatalogId(xajax.getFormValues('validationForm'));"></td>
<td><div id="validationMessage"></div></td>
</tr>
<tr><td>Journal:</td><td><input type="text"
size="20"
id="journal"
name="journal"></td>
</tr>
<tr><td>Section:</td><td><input type="text"
size="20"
id="section"
name="section"></td>
</tr>
<tr><td>Edition:</td><td><input type="text"
size="20"
id="edition"
name="edition"></td>
</tr>
<tr><td>Title:</td><td><input type="text"
size="20"
id="title"
name="title"></td>
</tr>
<tr><td>Author:</td><td><input type="text"
size="20"
id="author"
name="author"></td>
</tr>
<tr><td><input type="submit"
value="Create Catalog"
id="submitForm"
name="submitForm"></td>
</tr>
</table>
</form>
</body>
</html>
|
Apache 웹 서버에 input.php 스크립트를 실행한다. input.php를 C:\Apache2\Apache2\htdocs 디렉토리에 복사한다. http://localhost/input.php 로 PHP 스크립트를 실행한다. 인풋 폼(그림 1)이 디스플레이 된다.
그림 1. 인풋 폼
Catalog Id 필드에 값을 추가한다. Catalog Id 값이 유효한지 여부를 확인하는 메시지가 디스플레이 된다. (그림 2)
그림 2. 인풋 필드의 유효성 검사
XMLHttpRequest HTTP 요청이 수정된 인풋 필드로 보내진다.
그림 3. 유효 인풋 필드 값 추가하기
Catalog 테이블에 이미 정의된 값이 지정되면 "Catalog Id is not Valid" 메시지가 디스플레이 된다. (그림 4) 예를 들어, "catalog1"을 Catalog Id 필드에 추가한다. "catalog1"이 이미 정의되면 "Catalog Id is not Valid" 메시지가 디스플레이 된다.
그림 4. 무효 인풋 필드 값 추가하기
유효한 Catalog Id 필드를 설정하고 값을 다른 폼 필드에 추가함으로써 새로운 카탈로그 엔트리를 만들 수 있다. Create Catalog 버튼을 클릭하여 카탈로그 엔트리를 만든다. (그림 5)
그림 5. 카탈로그 엔트리 만들기
카탈로그 엔트리 "catalog3"을 만들기 위해 Catalog Id 필드가 이전에 사용되었다면, "Catalog Id is not Valid" 메시지가 디스플레이 된다. (그림 6)
그림 6. 이미 생성된 카탈로그 엔트리에 CatalogId 추가하기
결론
이 글에서, Ajax에서 제공된 클라이언트-서버 비동기식 XMLHttpRequest 요청이 PHP 스크립트와 결합되어 동적인 웹 애플리케이션을 만들어 내는 방법을 보았다. 이 예제를 사용하여 여러분 스스로 동적인 웹 애플리케이션을 만들어보기 바란다.
참고자료 교육
-
developerWorks DB2 for Linux, UNIX, and Windows 리소스 페이지: 기술자료와 튜토리얼.
-
DB2 Express-C: DB2 Express Edition for the community 무료 버전.
-
Ajax 리소스 센터: Ajax에 대한 추가 자료.
-
PHP 프로젝트 리소스: PHP 개발자를 위한 프로젝트 정보.
-
"PHP/Sajax와 함께 Ajax 사용하기" (developerWorks, 2005년 10월): PHP에서 Ajax 사용 방법, Simple Ajax Toolkit (Sajax) 소개, 서버 측 PHP와 JavaScript를 통합하는 PHP로 작성된 툴 소개.
-
"Ajax 방식으로 PHP 개발하기, Part 1: 시작하기" (developerWorks, 2006년 5월): PHP와 Simple Ajax Toolkit (Sajax)로 만든 온라인 웹 애플리케이션.
-
"Developing PHP
Applications for IBM Data Servers" (IBM Redbook, 2006년 5월): IBM Data Servers에서 PHP 사용하기. PHP 애플리케이션용 IBM 데이터 서버와 Apache 웹 애플리케이션 서버 설정 방법.
-
"Connecting
PHP applications to IBM DB2 Universal Database" (developerWorks, 2006년 5월): PHP와 IBM DB2 Universal Database를 결합하여 웹 애플리케이션 생성하기.
-
"Connect
PHP to DB2 and Cloudscape with PDO" (developerWorks, 2005년 3월): PDO를 설치 및 사용하여 DB2와 Cloudscape 데이터베이스에 연결 방법, 데이터를 삽입 및 검색 방법, prepared statements, bound parameters, scrollable cursors, positioned updates, LOB 등 고급 기능 설명.
-
한국 developerWorks Information Management 존: DB2 기술 문서, How-to 문서, 교육, 다운로드, 제품 정보.
-
technology bookstore
제품 및 기술 얻기
토론
필자소개  | |  | Deepak Vohra는 웹 개발자이자 Sun 인증 자바 프로그래머이며, Sun 인증 웹 컴포넌트 개발자이다. XML Journal, WebLogic Developer's Journal, Java Developer's Journal, ONJava.com, Oracle Magazine 등에 기고하고 있다. |
기사에 대한 평가
|  |