본문 바로가기

class "Think"/"PHP On Azure"

[PHP on Azure - 초급 - 11] Azure Storage를 활용한 PHP 웹사이트 (4)


- 윈도우 애저 무료 평가판 다운로드 : http://www.windowsazure.com/ko-kr/pricing/free-trial/?WT.mc_id=A53D57CF7 

- 윈도우 애저 평가판 설치 내용 하기 : http://www.phpschool.com/link/teach/2650


이전 강의 내용(http://hahaheo.com/235)을 이어서 계속 진행됩니다.



여러분은 Azure Storage를 이용한 Task-list 웹 사이트를 만들고 있습니다.

강의내용을 잘 따라하셨다면 init.php, createtable.php, index.php 파일을 만드셨을 것입니다. 이제 task를 추가할 수 있는 additem.php를 코딩해 보겠습니다


additem은 앞에서 작성했던 index.php footer 부분에 있던 form에서 내용을 채운 후 submit 하게 되면 호출되어서 데이터를 입력합니다.


<?php

require_once "init.php";    

use WindowsAzure\Table\Models\Entity;

use WindowsAzure\Table\Models\EdmType;


처음은 다른 페이지와 동일하게 init.php를 호출합니다. 그리고 \Table\Models\EntityTable\Models\EdmType 라는 네임스페이스를 선언하게 됩니다.

Entity는 여러분이 입력한 데이터를 저장하도록Entity() 라는 오브젝트를 사용하기 위해 호출합니다. EdmType는 아래 보면 EdmType::{TYPE} 형식으로 제공되는 변수 형태를 정의하고 있습니다.



$entity = new Entity();
$entity->setPartitionKey('p1');

$entity->setRowKey((string) microtime(true));

$entity->addProperty('name', EdmType::STRING, $_POST['itemname']);

$entity->addProperty('category', EdmType::STRING, $_POST['category']);

$entity->addProperty('date', EdmType::STRING, $_POST['date']);

$entity->addProperty('complete', EdmType::BOOLEAN, false);


Entity 오브젝트를 생성하고 여기다 POST로 넘어온 form 데이터를 하나하나 넣어주고 있습니다. Entity를 생성하고, 처음에 setPartitionKeysetRowKey를 지정하는것을 확인할 수 있습니다. 이는 관계형 데이터베이스에서 Primary Key와 비슷한 역할을 합니다. 즉 해당 데이터를 구분하기 위한 어떤 유일값을 명시하고 있습니다. 위 코드에서는 유일값으로 microtime, unixtime stamp 값을 micro second 단위로 반환하고 있습니다. (참고사이트 - (1) 참고)

데이터를 입력하는 형식은 addProperty('[열이름]', EdmType::{TYPE}, [값]); 입니다. 크게 어렵지 않게 이해하실 수 있을 겁니다.



try{
    $tableRestProxy->insertEntity('tasks', $entity);
}
catch(ServiceException $e){
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}


insertEntity 메소드로 위에서 입력한 Entity를 여러분의 Storage에 저장하는 부분입니다.



header('Location: index.php');

?>


모든 프로세스가 종료되고 index.php 페이지로 이동합니다


작성한 additem.php의 전체 코드입니다.


/* additem.php */ 

<?php

require_once "init.php";    

use WindowsAzure\Table\Models\Entity;

use WindowsAzure\Table\Models\EdmType;


$entity = new Entity();
$entity->setPartitionKey('p1');

$entity->setRowKey((string) microtime(true));

$entity->addProperty('name', EdmType::STRING, $_POST['itemname']);

$entity->addProperty('category', EdmType::STRING, $_POST['category']);

$entity->addProperty('date', EdmType::STRING, $_POST['date']);

$entity->addProperty('complete', EdmType::BOOLEAN, false);


try{

    $tableRestProxy->insertEntity('tasks', $entity);
}
catch(ServiceException $e){
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

header('Location: index.php');

?>



다음으로 입력되어있는 항목, Entity를 업데이트 하는 스크립트를 작성해 보겠습니다. 크게 2가지 작업을 하게 되는데 여러분이 입력한 task를 수행했다면 끝냈다고 표시하기 위한 mark 작업과, mark된 task를 unmark 하는 두가지 작업을 하게 됩니다.  이름은 markitem.php입니다.



<?php

require_once "init.php";


$result = $tableRestProxy->queryEntities('tasks', 'PartitionKey eq \''.$_GET['pk'].'\' and RowKey eq \''.$_GET['rk'].'\'');

$entities = $result->getEntities(); 

$entity = $entities[0];


초기화 후, 테이블에서 업데이트 하고자 하는 정보만 가져옵니다. 위에서 살펴보았던 테이블의 고유값인 pk(PartitionKey)rk(RowKey) 두개의 값을 받아서 쿼리를 날리고 있습니다(index.php에서 GET 형식으로 넘겨줍니다). 문법이 조금 특이한 것을 확인하실 수 있는데, 여기 쓰이는 문법은 REST 구조로 작동합니다. 문법에 관해서는 참고사이트 (2)에서, REST구조에 대해서는 참고사이트 (3)에서 더 자세한 정보를 확인할 수 있습니다.



$entity->setPropertyValue('complete', ($_GET['complete'] == 'true') ? true : false);


쿼리를 통해 가져온 데이터에서 complete 라는 속성의 값을 변경합니다. 여기선 setPropertyValue라는 메소드가 사용됩니다. 삼항연산자를 통해 GET으로 데이터를 받아 true 또는 false를 저장합니다. true는 mark가 되었고, false는 unmark 되었다는 뜻입니다. 



try{

    $result = $tableRestProxy->updateEntity('tasks', $entity);

}

catch(ServiceException $e){

    $code = $e->getCode();

    $error_message = $e->getMessage();

    echo $code.": ".$error_message."<br />";

}


마지막으로 수정된 데이터를 커밋합니다. 여기서는 updateEntity라는 메소드가 사용되었습니다.



header('Location: index.php');      

?>


모든 프로세스가 끝나고 다시 index.php로 돌아갑니다.



markitem.php 의 전체 내용입니다.


/* markitem.php */

<?php

require_once "init.php";

$result = $tableRestProxy->queryEntities('tasks', 'PartitionKey eq \''.$_GET['pk'].'\' and RowKey eq \''.$_GET['rk'].'\'');

$entities = $result->getEntities(); 

$entity = $entities[0];


$entity->setPropertyValue('complete', ($_GET['complete'] == 'true') ? true : false);


try{

    $result = $tableRestProxy->updateEntity('tasks', $entity);

}

catch(ServiceException $e){

    $code = $e->getCode();

    $error_message = $e->getMessage();

    echo $code.": ".$error_message."<br />";

}


header('Location: index.php');      

?>



마지막으로 선택한 Task를 삭제하는 deleteitem.php라는 스크립트를 작성해 보겠습니다. 소스가 짧으므로 한번에 설명하겠습니다


/* deleteitem.php */

<?php
require_once "init.php";
$tableRestProxy->deleteEntity('tasks', $_GET['pk'], $_GET['rk']);
header('Location: index.php');
?>


초기화 후, deleteEntity라는 메소드로 삭제를 합니다. 어떤 메소드를 삭제할 지는 테이블 이름, pk와 rk만 파라메터로 넘겨주면 삭제가 됩니다. 



이제 모든 코딩이 완료가 되었습니다. 여기까지 잘 따라하셨다면 완성된 여러분의 git repository는 다음과 같을 것입니다.






여기까지 입니다.


다음 강의에서 git repository를 azure에 업데이트 하고, 결과를 확인해 보도록 하겠습니다.





참고사이트


(1) PHP Microtime 설명(영) - http://php.net/manual/en/function.microtime.php

(2) Querying Tables and Entities(영) - http://msdn.microsoft.com/en-us/library/windowsazure/dd894031.aspx

(3) 위키피디아 REST 설명 - http://ko.wikipedia.org/wiki/REST